利用X-Forwarded-For注入:时间盲注与SQL技巧

需积分: 10 0 下载量 134 浏览量 更新于2024-09-07 收藏 21KB DOCX 举报
在这个Bugku Web题目的INSERT INTO注入挑战中,参与者需要利用一个HTTP头(X-Forwarded-For)中的IP地址进行SQL注入攻击。题目提供了一个PHP脚本,该脚本首先获取用户的IP地址,然后将其插入到`client_ip`表中的`ip`字段。 1. **注入点分析**: - 注入点位于`$sql`变量中,该变量的值是用户提供的`$ip`与SQL查询字符串的拼接,`insert into client_ip(ip) values ('$ip')`,这使得攻击者能够通过 `$ip` 参数执行恶意SQL命令。 2. **尝试的注入类型**: - 开始时,攻击者尝试了布尔型注入(如使用`true`或`false`作为条件),但发现由于PHP环境可能没有返回错误报告,所以这种方法在这里无效。 3. **基于时间的盲注**: - 攻击者意识到常规的条件判断式(如`if-else`)可能被服务器的输入处理方式(如逗号`','`的过滤)所限制,因此转向了基于时间的盲注(time-based blind SQL injection)。通常这种类型的注入依赖于执行时间的变化,比如当SQL查询成功执行时,执行时间会有所不同。 4. **绕过字符限制的方法**: - 攻击者利用`substr`函数的特性,先从字符串中提取单个字符,避免了逗号`','`的干扰。例如,使用`substr(str, 1, 1)`代替直接比较整个子串,`substr(str)` from 1 for 1 更加精确地控制字符操作。 5. **PoC(Proof of Concept)示例**: - 攻击者构造了一个PoC语句,通过`casewhen`表达式结合`length()`和`substr()`函数来探测数据库中的信息。例如,`value('输入的内容')`后面的SQL部分是 `1'and(casewhen(length((select database()))=14)then sleep(4) else 1 end)`,目的是检测数据库中某个特定表的长度,如果长度等于14,则表示猜测正确,从而触发较长的睡眠时间。 6. **挑战要点**: - 实现时间盲注时,攻击者需要巧妙地设计查询以避开输入过滤,同时利用服务器响应时间的微妙差异来推断注入结果。这要求对SQL注入原理有深入理解,并且对目标环境有一定程度的了解。 这个Bugku Web题目的INSERT INTO注入挑战要求选手运用高级的SQL注入技巧,尤其是时间盲注,来破解服务器的输入过滤机制,以获取数据库的相关信息。这既考察了技术能力,也考验了在实际环境中解决问题的策略。