2401_84415424 2024-04-16 23:43 采纳率: 0%
浏览 47

CTF代码审计—php代码审计

img


有没有师傅帮我解答一下?这个源码的前几个参数我都可以绕过,就最后一个XY参数不知道该怎么解决?我想要获得最终的hello

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-16 23:44
    关注

    引自免费微信小程序:皆我百晓生

    分析这段PHP代码,我们可以看到它涉及到了几个关键部分,包括变量提取、条件判断和字符串比较。为了得到 "hello" 的输出,我们需要满足所有条件。我们已经知道如何绕过前两个条件,但最后一个关于 SXY 变量的条件有些复杂。这里有一个详细的步骤来解决这个问题。

    首先,让我们简化并理解整个代码结构:

    1. 引入 highlight_file() 函数。
    2. 定义一个常量 SXYCTF
    3. 使用 extract() 函数从 $_GET 数组中提取变量。 4-10. 第一个条件:检查是否存在 'vall' 和 'va12' 并且它们不相等。如果满足,执行 md5() 函数并将结果与 $_GET['va12'] 进行比较。 11-18. 第二个条件:检查是否已设置 $md5 变量,并且其值等于 md5($md5)。这实际上是一个自我校验,通常用于防止某些攻击。 19-27. 第三个条件:检查 SXY 是否等于 SXYCTF 常量。 28-34. 最后一个条件:检查 SXY 不等于 "XYCTF_550102591",并且其 md5() 值等于 "XYCTF_550102591" 的 md5() 值。

    要达到 "hello" 输出,你需要同时满足所有这些条件。根据题目描述,你已经可以绕过前两个条件,所以我们只需要关注最后一个条件。由于 SXY 必须满足两个条件:不等于 "XYCTF_550102591" 并且其 md5() 值等于 "XYCTF_550102591",我们可以选择一个特殊的值来满足这两个条件。

    考虑一个字符串,它的长度大于 32 位,因为 md5() 返回的是一个 32 位的哈希值。在这种情况下,我们可以创建一个字符串,其前 32 位是 "XYCTF_550102591",然后在其后面添加一些额外的字符,使得原始字符串和 "XYCTF_550102591" 不相等,但是经过 md5() 计算后的哈希值仍然相同。这是因为 md5() 是敏感于输入的变化的,但在这个例子中,由于长度增加,原始字符串的末尾部分不会影响前 32 位的哈希值。

    例如,我们可以选择以下字符串作为 SXY 的值:

    $SXY = "XYCTF_550102591" . str_repeat("A", 32);
    

    这里的 str_repeat("A", 32) 将生成一个由 32 个 'A' 组成的字符串。由于 md5() 的特性,这个字符串的 md5() 值将与 "XYCTF_550102591" 相同。

    现在,将此值传递给 SXY 参数,你应该能得到 "hello" 的输出。在实际操作中,你需要通过 HTTP 请求发送带有相应参数的请求,例如使用 curl 或者类似工具(如 Burp Suite)。

    curl -X POST http://your-server-url/?vall=value1&va12=value2&SXY=XYCTF_550102591A%A%A...%A (重复32次'A')
    

    注意,这里省略了 "A" 字符串后面的32个 'A',你需要在命令中完整地复制这些字符。这样,所有条件应该都会被正确触发,从而输出 "hello"。

    如果你正在使用 Burp Suite,你可以创建一个新的 HTTP 请求,设置方法为 POST,并在表单数据或URL参数部分添加相应的键值对,然后提交请求查看结果。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月16日