前言
很多时候,目标主站看起来"固若金汤",业务功能单一,连登录口都找不到。这时候,信息收集就成了突破口。本文记录一次从 Fofa 资产搜索到后台 SQL 注入的完整过程,重点分享一些手工注入时的"踩坑"细节。
一、主站没功能?那就找资产
打开目标主站,发现页面简陋,几乎没有什么交互功能。这时候不要放弃,开始寻找该单位的其他资产站点。
信息收集思路:HTML 正文搜索
在主站页面源码中,寻找具有唯一性的关键字——比如公司简称、备案号、特定的 CSS 类名或注释信息。
注意:这些关键字通常出现在 HTML 的<body>中,而不是 title。
Fofa 语法实战
Fofa 搜索网页正文语法:
body="xxxxxx"但直接复制一大段正文内容搜索,结果往往是0 条记录。原因是正文内容太长,Fofa 无法精确匹配。
正确做法:删减关键字长度,提取最独特的标识。
比如从主站提取到一个简短标识,在 Fofa 中搜索:
最终命中记录,成功找到目标的其他资产。
二、意外的"后台"
打开搜索出来的第一个链接,是一个业务平台申请绑定接口。
抱着试一试的心态,乱填一通信息直接提交——没想到居然直接进入了后台!(啥也不是,还以为是弱口令,结果是前端校验都没有 😂)
但进去后发现,大部分功能都没权限,只有"问题统计"模块可以访问。
三、SQL 注入:从发现到利用
1. 发现注入点
在"故障统计"页面,点击"今天"查看数据。
抓包发现请求中包含一个日期参数。
在日期处测试单引号:
2021-08-10' 2021-08-10'' 2021-08-10'''随着单引号数量的增加,响应状态码和返回长度呈现周期性变化——经典的 SQL 注入特征,确认存在注入。
2. 为什么不能用and?
先尝试构造 POC:
尝试and条件:
2021-08-10' and '1'='1但发现无论条件成立与否,返回都是空。原因是:"今天"的故障统计本来就没有数据,所以and逻辑无法通过页面差异判断真假。
改用or:
2021-08-10'or'a'='a成功返回数据,确认or逻辑可用。
3. 获取当前用户
2021-08-10'or+substr(user(),1,1)='r通过逐字符判断,最终得到用户名为:root@localhost。
四、手工注入的"踩坑"记录
坑 1:+号与空格
尝试用like构造 payload 时:
...'or+substr(user(),1,1)like'r结果报错。
初步怀疑是+号的问题。直接将+换成空格:
...'or substr(user(),1,1) like 'r成功!
结论:字符串和like之间不能用+连接,必须直接用空格。
坑 2:%通配符被过滤
开始跑数据库名长度:
2021-08-10'or length(database()) like '9确认数据库名长度为 9 位。
接下来跑数据库名,需要用到通配符%。但在这个注入点,一加%就报错,疑似被过滤或转义。
替代方案:用下划线_代替%
%表示任意长度,_表示单个字符。既然知道长度是 9,那就用9 个下划线:
2021-08-10'or database() like 's________'通过逐位替换,爆破得到:
第 1 位:
s第 2 位:
l
盲猜前四位是sldl...(后续继续跑即可)。
五、总结
表格
| 阶段 | 关键技巧 |
|---|---|
| 信息收集 | 主站没功能时,提取 body 唯一关键字,用 Fofabody=语法搜索资产 |
| 后台进入 | 不要忽视业务接口,有时乱填就能绕过前端校验 |
| 注入发现 | 单引号数量变化导致响应周期性差异,是判断注入的可靠依据 |
| 逻辑选择 | 无数据场景下优先用or,而非and |
| 绕过过滤 | +换空格,%换_,灵活替代被过滤字符 |
结语
渗透测试很多时候不是"技术碾压",而是信息收集的耐心加上手工注入的细心。当你觉得目标没洞的时候,可能只是还没找到正确的资产入口。希望这篇记录能对你有所帮助!
📌提示:以上两篇均为技术分享,仅供安全研究与学习交流,请勿用于非法用途。