2023羊城杯决赛web&pwn Break&Fix wp
Break和Fix阶段都是小组第一
比赛的时候没写wp,赛后复现
web-ezSSTI
Break
焚靖一把梭python -m fenjing crack --url "http://192.168.100.100:10007/" --method GET --inputs name --environment jinja
Fix
app.py
1 |
|
直接在正则中添加"
,()
,[]
,\
等符号,注意不要过滤太严格,否则过不了check
web-easyupload
Break
F12可以看到账号密码,admin/hgrehhterh
,跳转到dadaadwdwfegrgewg.php
,一个文件上传点
上传.htaccess
后传图片拿shell
AddType application/x-httpd-php .png
Fix
dadaadwdwfegrgewg.php
1 |
|
黑名单中加个.htaccess
可以直接过check
1 |
|
web-BabyMemo
Break
扫目录下载www.zip
index.php部分源码
1 |
|
memo.php
1 |
|
1:首先很明显,当$_SESSION['admin'] === true
时就给flag,所以我们需要伪造session
1 |
|
2:网页有个下载功能点,可以自定义后缀
但是过滤了../
1 |
|
3:接着file_put_contents
写到/tmp
目录下,格式为用户名_随机数.文件后缀
,其中用户名和文件后缀是可控的
1 |
|
根据第二点和第三点可以得知,当传compression
值为./
时,与前面的.
组合变成../
,然后被替换成空,就可以修改文件格式为用户名_随机数
而在php中,session文件默认位置是/tmp/sess_PHPSESSID
,那么我们就可以把伪造的内容写入文件,然后设置PHPSESSID
去访问
本题用的解析引擎是默认的php
,格式为键名 + 竖线 + 经过serialize()函数序列化处理的值
,例如username|s:1:"q";memos|a:1:{i:0;s:1:"a";}
我们可以伪造一个admin|b:1;username|s:5:"admin";
,注意代码中还有一层str_rot13
,变成nqzva|o:1;hfreanzr|f:5:"nqzva";
然后用sess
登录后写入进memos
设置后缀为./
,写入到sess_46364caa4533f999
设置PHPSESSID
为46364caa4533f999
访问拿到flag
Fix
我的修法应该是非预期了
直接修改读flag的命令就过了
1 |
|
正常可以设置一个判断,使用户不能等于sess
或者在后缀处加个白名单等等
web-fuzee_rce
Break
弱口令admin/admin123
直接登录后跳转到goods.php
,然后就是一片空白,当时比赛时尝试了几个常见的参数,都没试出来就放弃了,在Fix阶段看到源码后没想到参数是w1key
传参后拿到源码
1 |
|
第一个if没啥用,要过的话用科学计数法就行
第二个if存在一个代码执行,但是有个waf,会过滤一些字符,同时存在长度限制
先fuzz看下能用的符号
可以用自增rce
w1key=$%ff=_(%ff/%ff)[%ff];$_=%2b%2b$%ff;$_=_.%2b%2b$%ff.$_;$%ff%2b%2b;$%ff%2b%2b;$_.=%2b%2b$%ff.%2b%2b$%ff;$$_[_]($$_[%ff]);&_=system&%ff=ls
Fix
比赛时修的代码:
1 |
|
web-Oh! My PDF
Break
忘记当时有没有给源码了,就先当没有源码来分析吧
有个注册和登录功能,主页面的功能是访问提供的url并转成pdf然后下载
随意注册一个账号登录后提示需要是admin权限才能操作
抓包发现使用了jwt,尝试空密钥直接修改isadmin的值后成功绕过
然后是主功能点,试了下不能使用类似file://
的协议,只能使用http://
在vps上开个监听,访问后可以看到WeasyPrint
库的特征
这个爬虫虽然不会渲染js,但是却可以解析<link attachment=xxx>
,因此我们可以在vps上构造payload: <link rel="attachment" href="file:///etc/passwd">
来实现任意文件读取
例如
1 |
|
然后去访问这个页面,返回一个pdf,用binwalk提取就能看到文件内容了
Fix
1 |
|
看下代码中关于jwt的部分,可以从这部分入手
1 |
|
{"verify_signature": False}
修改成 {"verify_signature": True}
pwn-arrary_index_bank
Break
整数溢出
1 |
|
Fix
修改jle
指令变成jbe
JBE用于无符号数比较,JLE用于有符号数比较
pwn-easy_force
Break
house_of_force
1 |
|
Fix
修改写入数据长度 0x30-->0x10
pwn-Printf but not fmtstr
Break
1 |
|
Fix
修改plt表中的free函数项,使其在执行时跳转到自己构造的指令位置,用于执行free函数并将指针数组中被释放的chunk的地址设置为NULL