探索

如何寻找和和确认SQL注入漏洞

时间:2010-12-5 17:23:32  作者:休闲   来源:综合  查看:  评论:0
内容摘要:一个请求包扔过去,响应里多出几行数据库报错,这大概是我见过最直白的SQL注入信号。但现实中更多时候,漏洞藏得比这深。你得学会跟数据库“对话”,而不是拿扫描器乱撞。 最笨也最有效的方法,是手动测试每个带

一个请求包扔过去,何寻和确响应里多出几行数据库报错,找和注入这大概是漏洞我见过最直白的SQL注入信号。但现实中更多时候,何寻和确漏洞藏得比这深。找和注入你得学会跟数据库“对话”,漏洞而不是何寻和确拿扫描器乱撞。

最笨也最有效的找和注入方法,是漏洞手动测试每个带参数的入口。搜索框、何寻和确登录表单、找和注入排序字段,漏洞甚至URL里的何寻和确id值。先输入一个单引号,找和注入看页面反应。漏洞正常页面该显示什么就显示什么,突然冒出SQL语法错误,那就是突破口。别急着高兴,很多开发者会做基础过滤,你得绕。

绕过过滤的思路其实就一句话:想尽办法让数据库执行你构造的语句。大小写混合、注释符、URL编码,这些老套路就不多说了。分享个真实案例——去年测试某电商后台,参数被过滤了空格,但用tab键代替就能正常注入。开发者只堵了空格,没堵水平制表符,这漏洞找得我差点笑出声。

确认漏洞比发现它更重要。光看页面报错不算数,你得证明数据真的能拿出来。经典的判断方法是构造逻辑恒真或恒假的条件。比如在id参数后加AND 1=1页面正常,加AND 1=2页面无内容,基本就能确定存在数字型注入。字符型的话,尝试闭合引号,比如' OR '1'='1,如果返回了比正常请求更多的数据,那就更稳了。

但注意,别一看到报错就兴奋。有些报错是开发者调试信息没关,并不代表可注入。要区分“数据库报错”和“业务逻辑错误”——前者是数据库反馈的语法或执行错误,后者只是程序自己抛出的异常。我曾经遇到一个网站,输入任何非法字符都返回“数据库连接失败”,实际上是全局异常处理,跟注入半毛钱关系没有。

还有个容易踩的坑:时间盲注。当页面不显示任何数据库反馈时,有人喜欢用AND SLEEP(5)判断。这招有效,但慢,而且容易被WAF拦截。我一般先试布尔盲注,通过页面内容变化判断条件真伪。实在不行再用时间盲注,而且控制延迟在2-3秒,别一上来就sleep(10),那等于告诉管理员你在测试。

最靠谱的确认方式,是用数据库特有的函数来验证。比如MySQL的VERSION(),SQL Server的@@VERSION。把参数替换成UNION SELECT VERSION(),如果页面上出现了数据库版本号,这漏洞就板上钉钉了。不过这需要目标站点支持联合查询,且字段数要猜对。用ORDER BY n逐次增加n,直到页面报错,就能确定字段数量。

说个反直觉的事:有时候漏洞明明存在,但你就是测不出来。问题可能出在编码上。数据库连接的字符集跟页面声明不一致,会导致你输入的中文或特殊字符被“吃掉”。碰到这种情况,把请求改成POST,或者在参数值里加上%00试试,往往能突破。

最后提醒一句:找漏洞的目的是修复,不是炫技。确认漏洞后,立刻停止测试,写好报告,标明注入点和影响范围。别顺手把数据拖出来看,那性质就变了。我见过太多测试人员倒在“证明漏洞”这一步——查出了用户表,忍不住想看看管理员密码,结果把自己搭进去了。

最近更新
热门排行
copyright © 2026 powered by 烟消火灭网   sitemap