多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

布尔盲注实战:Burp Suite Intruder自动化猜解数据库信息

布尔盲注实战:Burp Suite Intruder自动化猜解数据库信息 1. 从靶场通关到实战复现为什么需要Intruder很多朋友在CTF靶场里比如EzLogin、DVWA或者Pikachu一通操作猛如虎看着教程或者Writeup把布尔盲注的流程走了一遍成功拿到了Flag。但关上靶场心里可能还是有点虚这要是换个环境没有现成的Payload我还能独立完成一次完整的盲注攻击吗这种感觉我特别理解因为靶场环境往往是“理想化”的它把漏洞明明白白摆在那里参数点也给你标好了你更像是在执行一套已知的流程。而真正的安全测试或者更复杂的CTF题目需要的是你从零开始构建攻击链的能力。这其中Burp Suite的Intruder模块就是连接“知道原理”和“能独立实战”的关键桥梁。你可能会用sqlmap一把梭这当然高效但在CTF学习或者企业授权的渗透测试中理解底层的手工注入过程尤其是盲注这种“盲人摸象”式的攻击是基本功。Intruder在这里扮演的角色就是一个高度可定制、完全受你控制的自动化“猜解引擎”。它不像sqlmap那样封装了所有逻辑而是把HTTP请求的构造、Payload的替换、响应的判断都交给你来定义。通过复现EzLogin这类靶场的盲注流程你不仅能巩固SQL注入的知识更能深刻理解HTTP协议交互、条件响应的判断以及自动化测试脚本的设计思路——这些才是安全能力的核心。所以这篇文章的目的不是简单地告诉你点哪个按钮。我会带你完整地走一遍从分析EzLogin靶场的漏洞点开始到手工验证布尔盲注的可行性再到一步步配置Burp Suite Intruder实现从数据库名、表名、列名到最终数据Flag的全自动猜解。我会分享我在这个过程中踩过的坑、总结的技巧以及如何根据不同的响应特征来调整攻击策略。最终你会得到一套可以灵活调整、应用于其他类似场景的方法论。2. 靶场回顾与漏洞点分析EzLogin的布尔盲注原理在动手操作Intruder之前我们必须先把靶场的漏洞原理吃透。以“EzLogin”这个常见的CTF场景为例其本质与许多基础SQL注入靶场如SQLi-Labs前几关类似它通常模拟一个简单的登录页面。2.1 场景还原与手工探测假设靶场地址是http://target/login.php有一个典型的登录表单提交用户名和密码到后端处理。一个存在漏洞的请求可能如下POST /login.php HTTP/1.1 Host: target Content-Type: application/x-www-form-urlencoded usernameadminpassword123456第一步永远是手工测试验证注入点。我们不会一上来就用工具狂轰滥炸。我会先尝试最经典的探测Payload逻辑真值测试将用户名参数改为admin AND 11。对应的请求体变为usernameadmin AND 11password123456。如果页面返回了“登录成功”或与正常登录类似的响应比如跳转说明我们的SQL语句被成功执行并且AND后面的条件11为真使得整个查询条件成立。逻辑假值测试接着测试admin AND 12。如果页面返回“登录失败”、“用户不存在”等错误提示或者与输入错误密码时的响应一致那就进一步证实了注入点的存在。因为12为假导致整个查询条件不成立应用行为发生了变化。布尔盲注的确认关键来了。布尔盲注的特征是应用不会直接返回数据库错误信息或查询结果它只根据SQL查询语句返回的“真”或“假”呈现出两种不同的页面状态可能是不同的文本、不同的HTTP状态码、不同的响应长度、甚至是一个图片的加载与否。在EzLogin中这两种状态可能就是“登录成功”和“登录失败”的页面。注意在实际测试中“登录成功”的页面可能非常复杂包含动态内容。一个更可靠的判断依据是HTTP响应长度。使用Burp Suite的Repeater模块分别发送真、假Payload观察响应长度的差异。如果存在明显且稳定的长度差比如真返回1200字节假返回850字节那么这个长度就可以作为我们后续自动化判断“真/假”的黄金标准。2.2 构造布尔盲注Payload的核心逻辑确认了布尔盲注点我们就可以构造Payload来逐位提取信息了。核心是利用数据库的字符串函数和比较操作。假设我们想猜解当前数据库名的第一个字符。数据库名可能叫security、ctf等等。我们不知道是什么但知道它是由字母、数字、下划线组成的字符串。猜解逻辑admin AND SUBSTRING(DATABASE(), 1, 1) a --SUBSTRING(DATABASE(), 1, 1)从当前数据库名(DATABASE())的第1个位置开始取1个字符。 a判断这个字符是否等于字母a。--或#注释掉后面的SQL代码避免原始查询中的引号干扰。如果这个字符确实是a那么整个AND条件为真页面会呈现“真”状态如登录成功。如果不是a条件为假页面呈现“假”状态登录失败。我们需要做的就是遍历所有可能的字符a-z, A-Z, 0-9, 以及可能的特殊字符如_直到找到那个能让页面返回“真”状态的字符。这就是布尔盲注“盲”的地方我们通过页面是“A反应”还是“B反应”来反推SQL查询的结果。手工做这个遍历是不可能的一个字符就要几十上百次请求一个数据库名按8位算就是上千次请求。这就是我们必须请出Burp Suite Intruder的原因。3. Burp Suite Intruder模块深度配置指南Intruder是Burp的“入侵者”模块专为自动化定制攻击而设计。它允许你在HTTP请求中定义多个“攻击位置”Payload Positions然后使用不同的“攻击类型”Attack Type和“Payload集合”Payload Sets对这些位置进行穷举或字典攻击。3.1 攻击位置与攻击类型的选择首先在Proxy的History中找到我们确认存在盲注的那个POST请求右键发送到Intruder (Send to Intruder)。清除默认标记进入Intruder的Positions标签页Burp通常会帮你标记一些参数。点击Clear §按钮清空所有标记。我们要完全手动控制。标记注入点在请求体中找到username参数的值部分。假设我们构造的Payload是admin AND SUBSTRING(DATABASE(), 1, 1) a --。我们只标记字符a。即用鼠标选中a中的a然后点击Add §按钮。这时a的前后会被加上§符号变成§a§。这告诉Intruder“请在这个位置替换Payload进行测试”。重要技巧为什么只标记a而不是标记整个a因为引号是SQL语法的一部分必须保持固定。我们猜解的是字符本身。后续的Payload列表里就只需要放a, b, c...这些纯字符Intruder会自动用它们替换掉§a§。选择攻击类型对于布尔盲注这种“猜一个位置的一个字符”的任务最合适的是“Sniper”狙击手模式。Sniper模式使用一个Payload集合依次替换所有被标记的位置虽然我们现在只标记了一个位置。它简单直接正好符合我们逐位猜解的需求。3.2 Payloads配置构建我们的“猜解字典”切换到Payloads标签页。这里是我们攻击的核心引擎。Payload Set因为我们只用了一个Payload集合Sniper模式所以使用默认的Payload set: 1即可。Payload Type选择“Brute forcer”暴力破解器。这是最常用的字符集遍历方式。字符集配置Character set这里需要根据实际情况选择。对于数据库名、表名、列名通常包含小写字母a-z大写字母A-Z数字0-9下划线_你可以勾选这些选项也可以直接在输入框里输入abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_Min length和Max length都设置为1。因为我们每次只猜解一个字符。Payload Processing可选但重要有时候我们需要对生成的Payload进行编码以绕过潜在的WAF或特殊字符处理。例如如果后端对单引号过滤不严但可能记录日志我们可以不对Payload做处理。但为了通用性可以添加一个规则Add prefix设置为%然后选择URL-encode all characters不这里不需要。因为我们的Payload是纯字母数字通常不需要编码。更常见的处理是如果猜解的字符需要被单引号包裹而我们已经把单引号写在攻击位置外面了即§a§那么Payload本身就不该包含引号。这是配置的关键很多新手会在这里出错在Payload里又加引号导致SQL语法错误。3.3 选项设置如何判断“对”与“错”这是布尔盲注自动化能否成功的生命线。切换到Options标签页。请求引擎Request Engine可以设置线程、请求间隔。对于CTF靶场线程可以调高一些如10-20减少等待时间。如果是真实环境务必调低线程并增加延迟避免对目标造成过大压力或触发防护。结果分析 - Grep Match如果“真”和“假”的响应页面有非常明显的、固定的文本差异比如真页面有“登录成功”假页面有“登录失败”你可以使用Grep - Match功能。勾选“Flag result items containing responses matching these expressions”。在真页面的响应中选取一段唯一且稳定的字符串例如“Welcome, admin!”添加到列表中。这样在Intruder的攻击结果中包含该字符串的响应行会被特殊标记一目了然。结果分析 - 响应长度这是更可靠、更推荐的方法在Grep - Extract可以提取信息但我们现在更需要的是区分。最有效的方法是直接看响应长度。回到Options标签页确保Store requests/response被勾选。进行一次测试运行先不进行大规模攻击在Payloads里只设置两个Payloada和一个你确定不可能的字符如!。启动攻击。攻击完成后在Results界面点击表头的Length列进行排序。观察对应“真”状态Payload如果你知道数据库首字符是s那就用s和!测试的响应长度和“假”状态Payload的响应长度。你会发现一个恒定差值。记住这个“真”响应长度。在后续真正的猜解中你只需要寻找响应长度等于或非常接近这个特定值的请求它对应的Payload就是正确的字符。4. 实战用Intruder自动化猜解全流程现在我们结合EzLogin靶场完成一次从数据库名到Flag的完整自动化猜解。4.1 第一步猜解数据库名长度在猜解字符内容前我们通常需要知道长度。使用LENGTH()函数。 构造Payload位置usernameadmin AND LENGTH(DATABASE())§1§ --这里我们标记数字1。Payload 配置Payload type选择Numbers。数字范围从1到20通常足够步长为1。攻击启动攻击。观察结果那个响应长度与“真”状态一致的请求其Payload值就是数据库名的长度。假设结果是8。4.2 第二步猜解数据库名知道长度后开始逐位猜解。构造Payload位置usernameadmin AND SUBSTRING(DATABASE(), §1§, 1) §a§ --这里我们标记了两个位置§1§代表字符位置§a§代表猜解的字符。攻击类型这次必须使用“Cluster bomb”集束炸弹”模式。这种模式使用多个Payload集合并且会对所有集合进行笛卡尔积式的组合。集合1负责遍历位置集合2负责遍历字符。Payload Sets 配置Payload set 1(对应§1§)Payload typeNumbers。范围从1到8上一步得到的长度步长1。Payload set 2(对应§a§)Payload typeBrute forcer。字符集设为a-z0-9_先试小写因为数据库名常小写。最小最大长度设为1。攻击与结果筛选启动攻击。由于是8*36288次请求很快会完成。在Results中点击Length列排序。你会发现大部分请求的响应长度是“假”长度比如850只有8个请求的响应长度是“真”长度比如1200。把这8个请求筛选出来。数据提取现在你需要手动记录这8个请求的信息。查看每个“真”请求Payload 1列的值是字符位置1-8。Payload 2列的值是该位置的正确字符。按位置顺序拼接这些字符就得到了数据库名。例如位置1是c位置2是t位置3是f... 最终得到ctf_db。这个过程略显繁琐但能让你彻底理解原理。Burp Suite Pro版本的Intruder结果可以导出CSV方便筛选。社区版则需要手动观察。4.3 第三步猜解表名步骤类似但SQL语句更复杂。我们需要查询information_schema.tables。 构造Payloadadmin AND SUBSTRING((SELECT table_name FROM information_schema.tables WHERE table_schemaDATABASE() LIMIT 0,1), §1§, 1) §a§ --LIMIT 0,1表示取第一个表。猜完第一个表后再改为LIMIT 1,1猜第二个依此类推。攻击配置与猜解数据库名完全相同使用Cluster bombSet 1是数字位置范围需要预估比如1-20Set 2是字符集。实操心得在猜解前最好先用COUNT()函数猜一下有多少张表避免做无用功。Payload:admin AND (SELECT COUNT(table_name) FROM information_schema.tables WHERE table_schemaDATABASE())§1§ --用Sniper模式跑数字。4.4 第四步猜解列名与最终数据Flag假设我们猜到一个表叫users接下来猜它的列名。 Payloadadmin AND SUBSTRING((SELECT column_name FROM information_schema.columns WHERE table_schemaDATABASE() AND table_nameusers LIMIT 0,1), §1§, 1) §a§ --猜出列名例如id,username,password或flag后就可以读取数据了。 假设Flag在flag列里admin AND SUBSTRING((SELECT flag FROM users LIMIT 0,1), §1§, 1) §a§ --至此我们完全依靠Burp Suite Intruder模拟了手工布尔盲注的全过程实现了自动化猜解。5. 常见问题、技巧与排查实录即使按照流程操作你也可能会遇到问题。下面是我在无数次实战和教学中总结的“避坑指南”。5.1 攻击失败常见原因排查表问题现象可能原因解决方案所有请求的响应长度都一样1. 注入点判断错误可能不是布尔盲注。2. Payload构造有语法错误导致所有查询都报错或都返回假。3. 标记位置§设置错误破坏了SQL语句结构。1. 返回Repeater用更简单的手工Payload如admin AND 11重新验证。2. 检查Payload中的引号、括号、空格、注释符是否正确。特别注意在Burp中号可能被编码使用--空格或#更稳妥。可以在Repeater中先测试一个Payload。3. 检查标记是否只包含了需要替换的部分固定语法部分如引号、函数名、括号是否完整保留。Intruder结果中正确的响应长度不唯一有多个1. 字符集设置过大包含了正确字符的同长度“假”字符罕见。2.最可能判断依据不准确。“真”页面可能包含动态内容如时间戳、随机数导致长度轻微波动。1. 缩小字符集范围分批次猜解如先a-z再A-Z。2.使用“Grep - Match”结合“响应长度”双重判断。在Options中设置Grep匹配一个非常独特的字符串如登录后的用户名。同时观察长度正确的请求应同时满足匹配字符串和长度接近真值。猜解出的字符顺序混乱在Cluster bomb模式下结果默认按请求顺序排列而非按Payload set 1位置排序。在Results界面点击Payload 1列进行排序这样所有位置1的请求会排在一起。然后在这些行里找到那个“真”响应记录其Payload 2。再对位置2排序重复此过程。攻击速度过快靶场无响应或返回异常线程数过高靶场可能被“打挂”或触发了简单的速率限制。在Intruder的Options-Request Engine中降低线程数如降到5并增加请求间隔Throttle如设置100毫秒。Payload被WAF拦截靶场可能部署了简单的WAF规则过滤了SELECT、SUBSTRING等关键词。尝试使用大小写混淆、双写、等价函数替换等方式绕过。例如SUBSTRING-MID/SUBSTRDATABASE()-schema()SELECT-SeLeCt注释符--尝试换成#URL编码为%23。5.2 提升效率的高级技巧先跑字典再暴力对于表名、列名常见的就那些user, admin, pass, flag, id等。可以先用一个Simple list的Payload加载一个常见的表名/列名字典用Sniper模式快速尝试。如果没跑出来再使用Brute forcer。这能极大节省时间。利用Intruder的“结果过滤”在Results界面右键可以选择“Hide”掉长度为“假”响应长度的请求只显示潜在的正确请求让结果更清晰。分阶段保存与对比对于长的猜解如Flag内容可以分段进行。猜解第1-10位保存一次项目状态Save project猜解11-20位再保存一次。避免因Burp卡顿或意外导致前功尽弃。编码问题如果猜解的内容包含中文或特殊字符需要注意数据库和Web应用的编码。Payload的字符集可能需要包含更广的范围并且要注意Burp和服务器之间的URL编码、Unicode编码问题。在Payload Processing中可以使用URL-encode选项。通过以上流程你不仅能复现EzLogin靶场的通关步骤更能掌握一套应对布尔盲注的通用、可扩展的方法。记住工具是手臂思路才是大脑。真正理解每一个Payload为何这样构造理解Intruder每一个配置项的意义你就能在面对未知的漏洞时从容地组装起你的攻击链。
返回列表