1.绝对路径拼接漏洞
os.path.join(path,*paths)函数用于将多个文件路径连接成一个组合的路径。第一个函数通常包含了基础路径,而之后的每个参数被当作组件拼接到基础路径之后。
然而,这个函数有一个少有人知的特性,如果拼接的某个路径以 / 开头,那么包括基础路径在内的所有前缀路径都将被删除,该路径将视为绝对路径
import os
print("1:",os.path.join('aaaa','/bbbb','ccccc.txt'))
print("2:",os.path.join('/aaaa','/bbbb','/ccccc.txt'))
print("3:",os.path.join('aaaa','ddd','./bbb','ccccc.txt'))
从后往前看,会从第一个以”/”开头的参数开始拼接,之前的参数全部丢弃;
以上一种情况为先。在上一种情况确保情况下,若出现”./”开头的参数,会从”./”开头的参数的前面参数全部保留; 输出:
1: /bbbb\ccccc.txt
2: /ccccc.txt
3: aaaa\ddd\./bbb\ccccc.txt
2.PHPGGC
PHPGGC是什么:
PHPGGC 是一个 unserialize() 有效负载库,以及从命令行或编程方式生成它们的工具。 当您在没有代码的网站上遇到反序列化时,或者只是在尝试构建漏洞时,此工具允许您生成有效负载,而无需经历查找小工具并组合它们的繁琐步骤。它可以被视为相当于frohoff的ysoserial,但对于PHP。 目前,该工具支持小工具链,例如:CodeIgniter4,Doctrine,Drupal7,Guzzle,Laravel,Magento,Monolog,Phalcon,Podio,Slim,SwiftMailer,Symfony,Wordpress,Yii和ZendFramework。
为什么要用这个工具?一句话因为框架类的反序列化漏洞利用太过于复杂,用这个可以一键生成,就这么简单。
那就要明白一件事,这个工具是针对于那些框架、组件来生成payload的,而不是原生类的,比如说很多CTF的题目,别人自己出的那种不涉及框架的代码,用这个工具是生成不出来的
用的时候只需要知道目标的版本是否在漏洞版本区间然后用命令生成payload
php phpggc -l thinkphp
列出针对thinkphp框架的可选项
ThinkPHP/FW1(FW指的是文件写入,意思就是利用反序列化漏洞进行文件写入)
命令语法:执行程序 框架名字 要执行的函数 具体的命令 什么编码格式
注意:如果题目需要你进行base64编码或者url编码,一定要在这个命令这完成编码,不要把结果复制了拿去其它工具上编,很有可能就错了,所以要编码就直接在这个命令后面加参数;不需要编码就不加后面的参数
2.使用Koa框架的Node.js服务器端代码
router.post('/uploadfile', async (ctx, next) => {
const file = ctx.request.body.files.file;
if (!fs.existsSync(file.path)) {
return ctx.body = "Error";
}
if(file.path.toString().search("/dev/fd") != -1){
file.path="/dev/null"
}
const reader = fs.createReadStream(file.path);
let fileId = crypto.createHash('md5').update(file.name + Date.now() + SECRET).digest("hex");
let filePath = path.join(__dirname, 'upload/') + fileId
const upStream = fs.createWriteStream(filePath);
reader.pipe(upStream)
return ctx.body = "Upload success ~, your fileId is here:" + fileId;
});
router.get('/downloadfile/:fileId', async (ctx, next) => {
let fileId = ctx.params.fileId;
ctx.attachment(fileId);
try {
await send(ctx, fileId, { root: __dirname + '/upload' });
}catch(e){
return ctx.body = "no_such_file_~"
}
});
如果向文件上传的路由上传json主体的格式,那么其中path将被解析成已经上传完的文件位置保存到相应文件中。
{"files":{"file":{"name":"yu22x","path":"/etc/passwd"}}}
{"files":{"file":{"name":"xiaoyue","path":"flag"}}}