WEB代码审计

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"}}}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

El.十一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值