这种是ctf中比较简单的一类题,主要解法基本上也就那些形式。
这道题我给它提出来主要是涉及了一下比较零散的知识点,觉得想要跟大家分享一下。
<?php
highlight_file(__FILE__);
error_reporting(0);
$_ping = $_GET['Ping_ip.exe'];
if(isset($_ping)){
system("ping -c 3 ".$_ping);
}else{
$data = base64_encode(file_get_contents("error.png"));
echo "<img src='data:image/png;base64,$data'/>";
}
直接给出了我们的源代码,我来简单的进行一些代码解说。
这代码非常简单,先是需要我们以get的方式提交参数Ping_ip.exe。然后我们提交的参数会在system()函数中与ping命令连接在一起进行执行。
那么很明了的思路就是使用我们的cat命令抓取我们的flag。
system("ping -c 3 ".$_ping);
可以看到我们这里面的ping命令形式是不完整的,所以我们必须要先补全我们的ping命令再进行cat命令抓取。
那么第一个陷阱点出现了,我们必须提交的参数是Ping_ip.exe但是:
PHP中我们变量名只有数字字母下划线,被get或者post传入的变量名,如果含有空格、+、
[
则会被转化为_
,如果传入[
,它被转化为_之后,后面的字符就会被保留下来不会被替换。
可以看到如果直接提交则会发生错误。
所以我们必须先转义前面的字符,以防止后面的点被转义。
为了使其转义为下划线所以我们选择使用[来替换。
接下来就是了解怎样补全ping命令了。
ping命令的最基本形式只需包含目标主机的地址。我们只需要将它所给出的ping命令加上主机地址即可。这里我测试的是任何ip都可以。
最终payload:
?Ping[ip.exe=127.0.0.1||cat /flag
在payload中我们使用了“||”符号,“||” 是一个管道操作符,它用于在命令行中执行多个命令,当前一个命令执行成功时,才会执行后一个命令。