探索

sql注入盲注

时间:2010-12-5 17:23:32  作者:热点   来源:休闲  查看:  评论:0
内容摘要:```html sql注入盲注 sql注入盲注 页面不报错,也不回显数据,你只能通过“是”或“否”来判断注入结果。这就是盲注最要命的地方——它把一次原本直观的窃取,变成了成百上千次猜谜。

```html sql注入盲注

sql注入盲注

页面不报错,注注也不回显数据,入盲你只能通过“是注注”或“否”来判断注入结果。这就是入盲盲注最要命的地方——它把一次原本直观的窃取,变成了成百上千次猜谜。注注

我最早接触盲注是入盲在一个二手论坛的搜索框上。输入单引号,注注页面正常;输入两个单引号,入盲页面也正常。注注但换成 and 1=1 和 and 1=2,入盲页面返回的注注内容一模一样,连错别字的入盲位置都没变。当时以为没戏,注注后来随手试了 and sleep(3),入盲浏览器转了整整三秒。注注那一刻我就知道,这个点能打。

盲注分两类:布尔盲注和时间盲注。布尔盲注靠页面内容的细微差异——比如“用户不存在”和“用户存在但密码错误”这两种提示,在正常人眼里没区别,但在注入者眼里就是0和1。时间盲注更极端,页面连这点差异都不给,只能靠数据库延迟函数硬生生拖出信息。

拿布尔盲注来说,假设有个 id=1 的参数。你构造 id=1 and ascii(substr(database(),1,1))>100。如果页面正常,说明当前数据库名的第一个字符ASCII值大于100。然后二分法:大于100?大于115?大于120?每次请求只回答一个“是”或“否”。数据库名通常七八个字符,每个字符猜七次左右,一个库名就得发五十多个请求。要是表名、列名、字段值全猜一遍,上千次请求是家常便饭。

时间盲注更折磨人。你没法用二分法直接问“大于100吗”,因为不管大于还是小于,页面都一个样。只能靠 if(ascii(substr(...))>100, sleep(3), 0)。请求发出去,等三秒,看响应时间。超过三秒就是真,秒回就是假。一个字符猜七次,每次至少三秒——猜一个库名要两分多钟。要是网络抖动一下,三秒变四秒,四秒变五秒,你还得反复验证。

有人觉得盲注效率太低,不如直接找报错注入或者联合查询。但现实是,很多生产环境的错误信息被全局捕获了,页面只返回“系统繁忙,请稍后重试”。联合查询更别想,列数不对、类型不匹配,直接跳转首页。这时候盲注就是唯一的路。慢,但能走通。

我见过一个案例,某电商的订单查询接口,参数是订单号。输入正常订单号返回订单详情,输入不存在的返回“订单不存在”。注入 and 1=1 返回详情,and 1=2 返回“订单不存在”。这就是典型的布尔盲注。攻击者用脚本跑了六个小时,把用户表里的手机号和密码哈希全拖走了。六个小时,几千次请求,分散在正常流量里,WAF根本没触发阈值。

盲注的工具有sqlmap、Burp的Intruder,但手动注入更能理解原理。比如猜表名,先猜长度:and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=5。长度对了再猜字符:and ascii(substr((select table_name ...),1,1))=117。每个字符从0到127试一遍,或者二分法七次搞定。听起来笨,但笨办法往往最可靠。

防御盲注没什么新鲜招数。参数化查询一劳永逸,但老系统改不动。退而求其次,限制数据库账号权限——别让Web应用账号能读information_schema。再不行就上WAF,但WAF对时间盲注的识别率一般,因为sleep(3)和正常慢查询很难区分。最实在的建议:别把数据库错误信息关得太干净,留一条只有内网能看的日志。至少出了事你知道被打了。

盲注的本质是把数据库变成了一个只能回答“是”或“否”的黑盒。你问它问题,它不告诉你答案,只告诉你对错。剩下的全靠耐心和脚本。有人说这是体力活,没技术含量。但我觉得,能把一个不说话的数据库撬开嘴,本身就是门手艺。

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