2026-10-23 20:46:46
xctf-mfw(Git代码泄露,assert代码执行)解题分析
答案:本题主要考察Git代码泄露和assert代码执行漏洞。通过利用这两个漏洞,我们可以获取到服务器上的敏感信息,包括flag。
一、Git代码泄露
发现泄露:
使用dirb等工具扫描目标网站的目录,发现可以访问/.git/HEAD,这表明存在Git代码泄露。
利用GitHack还原源代码:
下载并运行GitHack脚本,传入泄露的.git文件夹的URL(
二、assert代码执行漏洞
分析源代码:
还原后的源代码显示,程序使用$page变量构建文件路径,格式为templates/{page}.php。
第一个assert检查文件路径中是否包含..字符串,如果包含则触发die()函数并显示“Detected hacking attempt!”信息。
第二个assert检查文件是否存在,如果文件不存在则同样触发die()函数并显示“That file doesn't exist!”信息。
利用assert漏洞:
在旧版PHP中(5.4之前),assert()的第一个参数可以是一个字符串,该字符串包含了要评估的PHP表达式,PHP会将其作为代码执行。
我们可以控制的字符串在{}中,这是占位符的意思。通过构造特定的字符串,我们可以利用assert()执行任意代码。
构造攻击载荷:
构造'.system("ls").'作为strpos和file_exists的参数中的一部分,这样ls命令的输出结果将作为这些函数参数的一部分。由于assert()会执行这些字符串作为代码,因此我们可以利用这个特性列出templates目录下的文件。
示例请求:GET /?page='.system("ls").' HTTP/1.1(注意,实际请求中可能需要对特殊字符进行URL编码)
通过观察响应,我们可以确认flag.php文件存在于templates目录下。
读取flag:
接下来,我们构造'.system("cat templates/flag.php").'作为参数,以读取flag.php文件的内容。
示例请求:GET /?page='.system("cat templates/flag.php").' HTTP/1.1(同样需要对特殊字符进行URL编码)
在响应中,我们可以找到flag的值。
三、总结
图片展示:
(以下图片展示了扫描目录、利用GitHack还原源代码、构造攻击载荷以及读取flag的过程,由于markdown格式限制,图片将以链接形式展示,但在实际预览中应能正常显示。)



