
又是跟的wgpsec打。还是把wgpsec的wp贴一下:https://mp.weixin.qq.com/s/T7EicKJOOVcwWohy_HTClQ
因为大部分师傅都没啥时间,导致这次被迫打了全栈。最后算是水了个61名。然而我终究还是web手。其他方向学起来还是很费劲的,加上本人也很乏,所以就只写点web。
一样的,我把web部分写详细点。让我们开始吧!
WEB
New Free Lunch
签到题
黑盒。进去一个登陆注册页面,看了一下无注入,无泄露,无弱密码,正常注册账号登录。

前端逻辑用的js实现,直接看源码
1 | async function endGame() { |
注意到提交分数的函数。显然,这里将secretKey,username, score拼起来求sha256来验证分数的合法性。跟进。在代码中找到明文secretKey

使用sha256伪造签名

随便玩一次,提交分数时用burp抓包,更改分数

前往积分榜拿flag

hkcert24{r3d33m_f0r_4_fr33_lunch}
Webpage to PDF (1)
签到题。
考的是wkhtmltopdf中xss读取本地文件的漏洞。这里直接在jsbin上起一个带file协议读取的website让靶机获取即可。
1 | <!DOCTYPE html> |

然而在这里因为wkhtmltopdf本身的防护读不到本地的文件,需要加上--enable-local-file-access。可以看到,在源码里存在命令拼接的漏洞。

这里session_id可控,直接在cookie session前加上--enable-local-file-access即可。随后就会变成如下命令
1 | wkhtmltopdf --enable-local-file-access {SESSION_ID}.html --enable-local-file-access {SESSION_ID}.pdf |
从而读取本地文件

随后访问/9d6bd64c-dfb1-44be-acd6-72b24088b9f8.pdf即可

hkcert24{h0w-t0-use-AI-wisely-and-s4fe1y?}
Custom Web Server (1)
下载附件,读
1 | #include <sys/types.h> |
看到C语言自制http服务器应激想到溢出和截断。显然,服务器上存在一个路径穿越漏洞,如图

然而这里有一个后缀的白名单,读取不到flag.txt
首先尝试了%00截断,无果。接着找截断的sink。
注意到
1 | snprintf(real_path, sizeof(real_path), "public/%s", filename); |
中real_path的大小是固定的1024字节(常量buffer_size)且在白名单检测之后,因此,此处存在由溢出漏洞导致的截断。
写个demo模拟一下
1 | #include <sys/types.h> |

这证实了我们的猜想。于是直接手搓payload发包GetFlag
exp:
1 | /././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././../../../../../../../../././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././flag.txt.js |

hkcert24{bu1ld1n9_4_w3bs3rv3r_t0_s3rv3_5t4t1c_w3bp4935_1s_n0ntr1vial}
Mystiz’s Mini CTF (2)
(2)做出来了(1)没做出来,绷
下载附件,审计。发现GetFlag的条件在拥有admin权限。查看User model,有

只要注册到is_admin为真的账户即可。直接去看register有没有注入
发现在Register里直接使用用户的输入来进行User model的初始化。没有检测参数的合法性

我们直接在注册的时候传入is_admin参数即可注册到admin权限的用户
1 | POST /register/ HTTP/2 |

直接进/api/admin/challenges拿flag就行

hkcert24{yOu_c4n_wrlt3_unsp3clf13d_4t7rlbu73s_t0_th3_us3r_mOd3l}}