记一次渗透测试——从 Fofa 信息收集到 SQL 注入手工Bypass

前言

很多时候,目标主站看起来"固若金汤",业务功能单一,连登录口都找不到。这时候,信息收集就成了突破口。本文记录一次从 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 唯一关键字,用 Fofa body= 语法搜索资产
后台进入 不要忽视业务接口,有时乱填就能绕过前端校验
注入发现 单引号数量变化导致响应周期性差异,是判断注入的可靠依据
逻辑选择 无数据场景下优先用 or,而非 and
绕过过滤 + 换空格,%_,灵活替代被过滤字符

结语

渗透测试很多时候不是"技术碾压",而是信息收集的耐心 加上手工注入的细心。当你觉得目标没洞的时候,可能只是还没找到正确的资产入口。希望这篇记录能对你有所帮助!


📌 提示: 以上两篇均为技术分享,仅供安全研究与学习交流,请勿用于非法用途。