焦点

如何寻找确认sql注入漏洞

时间:2010-12-5 17:23:32  作者:时尚   来源:探索  查看:  评论:0
内容摘要:一个登录框,输入 ' or 1=1 --,页面直接跳进了后台。这不是电影桥段,是我去年帮朋友看一个老商城系统时遇到的真实情况。SQL注入没死,只是很多人不再手动去试了。但手动测试仍然是确认漏洞最直接的

一个登录框,何寻输入 ' or 找确注入1=1 --,页面直接跳进了后台。漏洞这不是何寻电影桥段,是找确注入我去年帮朋友看一个老商城系统时遇到的真实情况。SQL注入没死,漏洞只是何寻很多人不再手动去试了。但手动测试仍然是找确注入确认漏洞最直接的方式,工具能帮你扫出可疑点,漏洞最终确认还得靠人。何寻

找注入点,找确注入第一步不是漏洞急着敲 payload,而是何寻先摸清数据流向。一个网站,找确注入用户输入最终跑到数据库里的漏洞路径就那么几条:URL 参数、表单字段、Cookie、HTTP 头。我习惯打开浏览器开发者工具,把每个能输入的地方都标出来。特别是那些看起来像 ID 的参数,比如 product.php?id=12,这种地方十有八九直接拼进了 SQL。

拿 id=12 举例。先试 id=12',页面报错,返回一串 You have an error in your SQL syntax。这说明单引号被带进了 SQL 语句,且没被过滤。再试 id=12 and 1=1 和 id=12 and 1=2,前者页面正常,后者内容缺失或报错。两个请求返回不同结果,基本能确定存在布尔型注入。这一步不需要什么高级工具,浏览器地址栏就能完成。

数字型注入更简单。id=12 and 1=1 正常,id=12 and 1=2 异常,说明 and 后面的条件被数据库执行了。如果加单引号报错,加 -- 注释掉后面内容又正常,那就是字符型。我见过不少教程把这两类分开讲得很复杂,其实核心就一句话:看数据库有没有把你的输入当代码执行。

联合查询是确认注入点最干脆的方法。还是那个 id 参数,试 id=12 union select 1,2,3 --。页面如果显示出了数字 2 和 3,说明 union 生效了,且当前表有三个字段。接下来 union select 1,database(),user() --,数据库名和当前用户直接回显在页面上。到这一步,漏洞已经确认无疑,不需要再猜。

有些场景不回显,比如 id=12 and sleep(5)。请求发出去,页面卡了五秒才返回。时间盲注确认起来慢,但逻辑同样清晰:你的输入让数据库执行了延时函数。我一般会连续测三次,排除网络波动。三次都稳定延迟,那就是了。

工具方面,sqlmap 确实省事。sqlmap -u "http://target.com/product.php?id=12" --batch,它会把上面所有手动步骤自动跑一遍。但工具报出漏洞后,我仍然会手动复现一次。原因很简单:工具会误报,尤其是目标有 WAF 或者自定义过滤规则时。手动确认过的注入点,写报告时心里才有底。

有个细节容易被忽略:Cookie 里的注入。很多系统对 URL 参数做了过滤,却忘了 User-Agent 或 Cookie 里的值也会进数据库。我遇到过 Cookie: uid=1' and sleep(3) -- 直接生效的站点。测试时把 Burp Suite 挂上,拦截请求,逐个 header 加单引号观察响应差异,比只盯着 URL 参数全面得多。

确认漏洞之后,别急着 dump 数据。先看权限。user() 返回 root@localhost 和返回 webapp@10.0.0.5 是两码事。前者可能直接 load_file() 读系统文件,后者老老实实查当前库就行。我习惯用 union select 1,table_name,3 from information_schema.tables where table_schema=database() -- 先列出表名,确认能读到敏感表,再决定下一步。

最后说一个反直觉的观察:很多注入点不在那些看起来复杂的搜索框里,反而在 order by、sort 这类参数上。因为开发人员觉得“排序字段”用户传不了什么恶意内容,往往直接拼接。试 order by 1 正常,order by 100 报错,说明字段数可控。再试 order by (select 1 from users limit 1),如果报错信息里带出数据,又是一个注入点。这类地方,扫描器经常漏掉。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap