题目地址:https://github.com/otakekumi/CTF-Challenge/blob/master/PHP/chall_2/index.php

发现和上一题大体相似,但是发现有一个不一样,长度从5变成了4,没办法利用>>二次写入了。

但是我们如果就这样是没法儿按照字典序直接写入ls -t>g到文件的。 因为这一串无论怎么分割写入都无法遵从字典序或是字典序的逆序。

然后就不会了,想了n久还是不会,最后只有去看wp了。

首先介绍几个命令:

dir:虽然基本上和 ls 一样,但有两个好处,一是开头字母是d ,这使得它在 alphabetical 序中靠前,二是按列输出,不换行。

* :相当于$(dir *),所以说如果文件名如果是命令的话就会返回执行的结果,之后的作为参数传入.

rev:可以反转文件每一行的内容。

所以这样如果dir在最前面的话,就可以把当前目录的文件都返回.

>dir
>sl
>g\>
>ht-

之后将*的结果写入文件中,紧接着写入rev文件.

>*>v
>rev


最后执行rev v>u,这个命令需要通过*命令的其它形式实现.

*v>u
这个命令就是$(dir *v)>u,dir *v返回的就是结尾为v的文件.


这个地方其实是一个很巧妙的方式,因为*v恰好是可以匹配到revv的,如果文件名换成其它字母会因为排序错误或者没有作为rev的参数而逆序失败.
之后的步骤就没有什么多大的区别了.

基本上就前面的写文件操作不一样。

exp执行,getshell!

参考链接:https://xz.aliyun.com/t/1579

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐