xctf-mfw(Git代码泄露,assert代码执行)

大神们,我想请说明下,xctf-mfw(Git代码泄露,assert代码执行)
最新回答
离人乱他心

2026-10-23 20:46:46

xctf-mfw(Git代码泄露,assert代码执行)解题分析

答案:本题主要考察Git代码泄露和assert代码执行漏洞。通过利用这两个漏洞,我们可以获取到服务器上的敏感信息,包括flag。

一、Git代码泄露

  1. 发现泄露:

    使用dirb等工具扫描目标网站的目录,发现可以访问/.git/HEAD,这表明存在Git代码泄露。

  2. 利用GitHack还原源代码:

    下载并运行GitHack脚本,传入泄露的.git文件夹的URL(

    http://61.147.171.105:61743/.git
    ),脚本会尝试还原项目的源代码。

二、assert代码执行漏洞

  1. 分析源代码:

    还原后的源代码显示,程序使用$page变量构建文件路径,格式为templates/{page}.php。

    第一个assert检查文件路径中是否包含..字符串,如果包含则触发die()函数并显示“Detected hacking attempt!”信息。

    第二个assert检查文件是否存在,如果文件不存在则同样触发die()函数并显示“That file doesn't exist!”信息。

  2. 利用assert漏洞:

    在旧版PHP中(5.4之前),assert()的第一个参数可以是一个字符串,该字符串包含了要评估的PHP表达式,PHP会将其作为代码执行。

    我们可以控制的字符串在{}中,这是占位符的意思。通过构造特定的字符串,我们可以利用assert()执行任意代码。

  3. 构造攻击载荷:

    构造'.system("ls").'作为strpos和file_exists的参数中的一部分,这样ls命令的输出结果将作为这些函数参数的一部分。由于assert()会执行这些字符串作为代码,因此我们可以利用这个特性列出templates目录下的文件。

    示例请求:GET /?page='.system("ls").' HTTP/1.1(注意,实际请求中可能需要对特殊字符进行URL编码)

    通过观察响应,我们可以确认flag.php文件存在于templates目录下。

  4. 读取flag:

    接下来,我们构造'.system("cat templates/flag.php").'作为参数,以读取flag.php文件的内容。

    示例请求:GET /?page='.system("cat templates/flag.php").' HTTP/1.1(同样需要对特殊字符进行URL编码)

    在响应中,我们可以找到flag的值。

三、总结

  • 本题通过Git代码泄露获取了服务器的源代码,进而分析了程序存在的assert代码执行漏洞。
  • 利用assert漏洞,我们构造了特定的攻击载荷,通过执行系统命令读取了敏感文件flag.php的内容。
  • 在实际环境中,应尽量避免使用旧版PHP,并严格限制assert()函数的使用,以防止类似的代码执行漏洞。

图片展示:

(以下图片展示了扫描目录、利用GitHack还原源代码、构造攻击载荷以及读取flag的过程,由于markdown格式限制,图片将以链接形式展示,但在实际预览中应能正常显示。)