如何查找SQL注入漏洞 直接把单引号扔进URL参数,何查看页面报不报错——这招糙,找S注入但管用。漏洞我见过太多新手拿着扫描器乱扫,何查扫出一堆“疑似漏洞”却不知道怎么验证,找S注入最后被甲方一句“你证明给我看”噎死。漏洞真正的何查SQL注入查找,靠的找S注入是对数据库语法的理解,不是漏洞工具。 拿个真实例子说。何查去年帮朋友审计一个老PHP站点,找S注入登录框用户名输入admin',漏洞页面直接吐了MySQL语法错误,何查连表名都带出来了。找S注入这种“报错型注入”最蠢也最好找,漏洞但很多系统把错误提示藏了,你得像剥洋葱一样层层试探。 先试数字型参数。比如商品详情页?id=1,改成id=2-1,如果返回的还是商品1的内容,说明参数被拼进了SQL运算——这是最理想的入口。再试字符型,加个单引号看反应,没报错就试试' and '1'='1和' and '1'='2,前者正常后者异常,基本能断定存在注入点。 别急着掏sqlmap。先手动确认闭合方式,是单引号、双引号还是括号,这决定了后续payload的构造。我见过有人对着一个WHERE id=('$input')的查询狂试单引号,折腾半小时没进展,换双引号加括号秒破。工具是死的,数据库语法是活的。 绕过WAF是另一门手艺。某次测试一个政府网站,关键词全被过滤,空格换成/**/,union拆成un/**/ion,编码绕不过去就试试大小写混合。但核心思路不变:找到那个没过滤干净的点。WAF像筛子,总有漏网的。 时间盲注适合对付那些“打死不报错”的站点。用if(condition,sleep(5),0)这种语法,看响应时间差。别小看这招,曾经有个系统把所有错误都吞了,页面永远返回200,我用and sleep(3)一个个库名试,花了四十分钟拖出整个用户表。累,但有效。 报错注入也别忽略。用updatexml()或extractvalue()触发数据库报错,直接把数据带出来。比如and updatexml(1,concat(0x7e,(select database())),1),错误信息里就藏着库名。这招在MySQL上屡试不爽,但MSSQL和Oracle得换函数,cast()和dbms_xdb各显神通。 查完注入点,最后一步才轮到自动化工具。sqlmap的--level和--risk调高,跑一遍确认漏洞范围。但记住,工具输出的是“可能”,你手动验证过的才是“确定”。写报告时附上完整的请求包和响应差异,比一百行扫描日志都有说服力。 说到底,查找SQL注入的核心是“琢磨数据库怎么想”。你输入的东西被拼进查询,数据库会怎么解析?多问自己几遍,比任何工具都强。 |