如何手动验证ZAP报告的SQL注入身份验证绕过漏洞?
针对ZAP报告的SQL注入身份验证绕过漏洞的测试建议
首先得理清楚核心问题:你可能混淆了ZAP标记漏洞的目标请求对象——你提到的目标URL是https://xx.xxx.xx.xxx/scripts/userscripts/UserScript.pl?function=commitmodifyirisagent(POST方法,参数site),但你一直在登录表单里测试,这大概率是卡壳的原因。下面分情况给你具体的测试方向:
情况1:ZAP漏洞指向的是commitmodifyirisagent这个POST接口
如果漏洞报告里明确标注的是这个修改agent的接口,那完全不用碰登录表单,直接针对site参数做测试:
- 先抓下这个POST请求的原始内容(用ZAP的Repeater工具最方便),找到
site参数的位置。 - 构造针对性的SQL注入payload,注意闭合原有SQL语句的引号,比如:
- 尝试
site=ZAP' AND 1=1--(注意--后面的空格,MySQL需要这个来识别注释;如果是MSSQL可以用--或者/*注释内容*/) - 对比正常请求和注入请求的返回差异:比如正常请求返回成功修改的提示,注入
AND 1=2--时返回失败,就说明参数可能存在注入点。 - 换不同的payload验证,比如
site=test' OR '1'='1,看是否能让SQL条件恒成立,返回异常结果。
- 尝试
情况2:ZAP漏洞指向的是登录表单
如果漏洞确实是登录环节的身份验证绕过,那你之前用的ZAP AND 1=1--payload有问题,因为登录的SQL语句通常是类似SELECT * FROM users WHERE username='{输入}' AND password='{输入}'的格式,你需要先闭合用户名的引号才能让注入生效:
- 尝试用户名填
ZAP' --,密码随便填:这样SQL会变成SELECT * FROM users WHERE username='ZAP' --' AND password='xxx',--会注释掉后面的密码校验逻辑,只要用户名ZAP存在就能登录(如果不存在,换成ZAP' OR '1'='1--,这样条件恒成立,不管用户名是否存在都能绕过)。 - 如果引号被转义(比如输入的
'变成\'),可以试试十六进制编码的payload,或者不用引号的写法,比如ZAP AND 1=1#(MySQL用#注释)。
通用测试技巧
- 一定要先核对ZAP漏洞报告里的请求详情:看漏洞对应的请求URL、方法、参数是什么,别搞错测试对象。
- 用工具辅助手动测试:ZAP的Repeater或者类似工具可以让你快速修改参数并对比返回结果,比在表单里瞎填高效得多。
- 注意目标系统的数据库类型:不同数据库的SQL语法、注释符都有差异,比如Oracle用
--或者/*...*/,MySQL支持#,MSSQL有自己的注入写法,针对性调整payload。
内容的提问来源于stack exchange,提问作者Joe C
相关产品推荐
相关产品推荐

