2022DASCTFXCBCTF

文章发布时间:

最后更新时间:

文章总字数:
1.3k

预计阅读时间:
5 分钟

2022DASCTFXCBCTF

看 pop 博客复现一些比赛。

https://boogipop.com/2023/03/02/DASCTF%20X%20CBCTF%202022%E4%B9%9D%E6%9C%88%E6%8C%91%E6%88%98%E8%B5%9B/

dino3d

经典小游戏题,依然是先失败一次,看看会有什么提示,本地 js 搜索没有找到这个 1000000 ,推测与后端进行了交互,抓个包看看:

image.png

改一下 score ,返回错误信息:
image.png

可知这题需要伪造 score ,checkCode 和 tm,在控制台来源全局搜索一下(不用一个文件一个文件去查),发现都在 checkCode 都在同一个文件 build.min.js 中,下载下来在 vscode 看。装个 prettier 插件格式化一下这些 js 。

image.png

代码的分析如下图:

image.png

image.png

image.png

image.png

伪造好这个 checkCode 之后用 bp 爆破一下时间戳就行(tm 是时间戳)。

image.png

Text Reverser

输入会有输出显示,试试 {{7*7}},发现有过滤,推测就是 SSTI ,用字典爆一下,测一下过滤的字词:
image.png

随便找一个没有以上字词的 payload ,稍微改改就能打,记得反转再输入。

{%print(lipsum.__globals__['__geti''tem__']('o''s')['pop''en']('nl /f*').read())%}

image.png

cbshop

这出题人给的 docker-compose 有问题,dockerfile 也有问题,难道这也是考察的一环?? docker-compose 需要加上一个 project-name 才能 build 或者 up ,而 dockerfile 需要加上一行 RUN chmod +x ./start.sh ,不然就会因为 start.sh 没有执行权限而被 nodejs 解释,报 nodejs 的错:

image.png

代码审计,存在管理员帐号,根据登录的要求在控制台直接运行 js ,得到登录的密码:

image.png

image.png

image.png

第一次登没登进去,抓个包看看,发现是因为 json 格式数据传输自动在 password 前面加了一个斜杠转义,改包去掉再放包即可成功登录。

image.png

登录之后有钱了还是买不了,再审计一下代码,发现还需要有 user.token ,而没有输入这个属性的位置,仔细看看,前面使用了 assign 方法直接将 product (我们传入的 json 对象)合并到了 order[user.username] 中:

image.png

在 Node.js 中,Object.assign() 是一个常用的方法,用于复制一个或多个源对象的所有可枚举的自身属性到目标对象,并返回这个目标对象。

基本语法是:Object.assign(target, ...sources)

  • target: 目标对象 —— 方法将源对象的属性复制到这个对象。
  • ...sources: 源对象 —— 一个或多个源对象的属性将被复制到目标对象。

简单来说,和 merge 差不多,自然想到原型链污染,刚好这里提供了一个修改 username 的 api ,那把 username 改为 __proto__ 就可以很自然地污染原型,在 product 里面传需要的参数即可。

image.png

这里到了下一关,提示需要借助 readFileSync ,审计源码也可以发现不允许 name 出现 flag ,如果通过就会通过 readFileSync 读文件:

在 Node.js 的 fs.readFileSync 方法中,用于指定想要读取的文件的路径参数可以是以下几种形式之一:

  1. 字符串:这是最常用的形式,直接提供文件的路径作为一个字符串。例如:'/path/to/file.txt'
  2. Buffer:可以使用一个 Buffer 实例来指定路径。Buffer 实例应该包含代表文件路径的字节。这在某些情况下可能有用,比如当文件路径不是标准的 UTF-8 字符串时:
    const fs = require('fs'); const path = Buffer.from('/path/to/file.txt'); const data = fs.readFileSync(path);
  3. URL 对象:在 Node.js 中,您还可以使用一个 URL 对象来指定文件路径。这在处理特定协议或复杂的 URL 结构时特别有用。
    const fs = require('fs'); const { URL } = require('url'); const fileUrl = new URL('file:///path/to/file.txt'); const data = fs.readFileSync(fileUrl);

如果使用 URL 对象,是不是就可以通过 url 编码绕过 flag 字段的检测呢,使用const fileUrl = new URL('file:///flag'); 生成了之后修改一下 url 就行,使用 python 请求,记得 json.dumps(data) 序列化成 json 。

image.png

zzz_again

这个 php 终极代码审计,直接给你一套 cms ,啥都没有让你自己挖(,大概过程在下面的图上了,感觉我自己也分析得不是很明白,需要对模板解析有比较深入的理解。

zzz_template.php

image.png

image.png

$danger=array('preg','server','chr','decode','md5','post','get','request','file','cookie','session','sql','mkdir','copy','fwrite','del','encrypt','$','system','exec','shell','open','ini_','chroot','eval','passthru','include','require','assert','union','create','func','symlink','sleep','ascii','print','echo','base_','replace','_map','_dump','_array','regexp','select','dbpre','zzz_','{if','curl');

strtolower 绕过

image.png

image.png

image.png

image.png

image.png

image.png

image.png

/?location=list&aaa={if:=strtolower("SYSTEM")("cat /f111l00g")}{end if}&aaa=111