当前位置:首页 > 休闲

使用sqlmap判断sql注入点

sqlmap的使用判断逻辑其实很直白:它往目标参数里扔各种恶意载荷,然后观察响应是判断否出现数据库特有的错误、页面内容变化或者时间延迟。入点但很多人第一步就卡住了——到底该拿哪个URL去试?使用

拿个真实例子说吧。之前审计一个开源商城系统,判断登录接口的入点username参数直接拼进了SQL查询。我用浏览器抓包看到POST请求长这样:username=admin&password=123456。使用这时候别急着上sqlmap,判断先手动在username后面加个单引号,入点如果页面报错信息里出现You have 使用an error in your SQL syntax,基本就实锤了。判断但这只是入点第一步,sqlmap要确认的使用是“可注入”而非“有报错”。

确认可注入后,判断命令就简单了:sqlmap -u "http://target.com/login" --data="username=admin&password=123456" -p username。入点注意-p参数指定了测试点,否则sqlmap会把password也测一遍,浪费时间。这里有个细节——如果目标站点有WAF,你得加--tamper=space2comment或者--random-agent来绕过,但初次判断注入点用不着这些花活,裸测就够了。

跑起来之后观察输出。sqlmap会依次测试布尔盲注、时间盲注、报错注入和联合查询。如果屏幕上出现Parameter 'username' is vulnerable,恭喜,注入点确认。但注意,有时候它会提示unable to connect to the target,多半是网络问题或者目标限速,这时候加个--delay=1就能缓解。

有个坑必须提——sqlmap默认会发大量请求,生产环境容易把业务打挂。我习惯加--level=1 --risk=1只做基础检测,再配合--current-user快速验证权限。如果目标是POST接口且参数值有特殊字符,记得用--data传原始报文,别用-u硬拼URL,否则百分百报错。

判断注入点这事,本质是验证“参数是否被数据库解析”。sqlmap只是自动化了这个过程,但你要理解它的输出。比如它报boolean-based blind,说明页面存在真假条件差异;报time-based blind,说明有延迟函数返回。这两种情况都算注入点,但利用难度不同——时间盲注需要配合--time-sec=3调整超时,否则误判率很高。

最后说个反直觉的经验。有时候sqlmap报not injectable,不代表真的没漏洞。可能是目标参数经过了编码,或者后端用了参数化查询。我遇到过把JSON格式的POST数据直接拼进SQL的奇葩案例,sqlmap默认检测不了,得用--json-data='{ "username":"*"}'指定注入位置。所以判断注入点,工具只是辅助,核心还是看代码逻辑——如果开发写了拼接语句,那注入点必然存在,只是藏得深不深的问题。

分享到: