题目
源代码
<?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传入的变量名,如果含有空格、+、[则会被转化为_,如果传入[,它被转化为_之后,后面的字符就会被保留下来不会被替换。
可以看到如果直接提交则会发生错误。
所以我们必须先转义前面的字符,以防止后面的点被转义。
为了使其转义为下划线所以我们选择使用[来替换。
payload
/?Ping[ip.exe=127.0.0.1;cat /flag