本题源于
- HITCON2017 babyfirst-revenge
主要是利用 \
可以拼接命令, ls
可以列出文件, 从而通过自定义文件名, 并拼接文件名, 来实现传入字符限制长度RCE
源码分析
$sandbox = '/www/sandbox/' . md5("orange" . $_SERVER['REMOTE_ADDR']);
$_SERVER['REMOTE_ADDR']);
获取用户IP- 然后根据用户IP, 创建一个字符串
@mkdir($sandbox);
- 根据上文的
$sandbox
,创建一个文件夹
- 根据上文的
@chdir($sandbox);
- 进入该文件夹
- 这里是为了保证用户在空文件夹下运行命令, 并且每个用户独立
- 然后就是判断 GET 请求是否传入
cmd
参数, 如果有的话就是否小于等于5个字符- 如果是的话, 就使用
exec
执行命令
- 如果是的话, 就使用
- 而如果 GET 请求传入
reset
参数就执行'/bin/rm -rf ' . $sandbox
, 删除用户文件夹
解题分析(解题前, 建议自己现在终端尝试)
- 首先要注意的是, 这里的执行命令函数不再是
system()
, 而是exec()
- 这个函数可以执行系统命令, 但是并不会把命令结果直接输出
- 所以这个时候就要想能不能写入木马, 或者执行命令反弹Shell
- 在写入木马的话, 我们终端是处于一个 “沙盒” 的文件夹中, 想要通过网页服务访问到里面的木马, 似乎有点难
- 所以本题还是想办法 反弹Shell
- 在反弹Shell之前, 来学学一些 Linux 终端的小技巧
>
创建文件>a
创建一个名为 a 的文件
sh-5.1# >a sh-5.1# ls a exp.php index.php
ls -t
根据文件最后的修改时间排序, 越晚修改的越前面- 如果没有
-t
参数的话, 会默认按照字典顺序排列 - 还有这些排序方式
ls -S
按文件大小排序ls -r
反转排序(从大到小)ls -v
按自然顺序排序(file1 file2 file10
而不是f
- 如果没有