记一次渗透测试——从 Fofa 信息收集到 SQL 注入手工Bypass
2026/6/30 22:33:53 网站建设 项目流程

前言

很多时候,目标主站看起来"固若金汤",业务功能单一,连登录口都找不到。这时候,信息收集就成了突破口。本文记录一次从 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
绕过过滤+换空格,%_,灵活替代被过滤字符

结语

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


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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询