GHCTF比赛web方向详细多种解(全)
1674701160110592 CTF 328浏览 · 2025-03-07 07:30

upload?SSTI!

题目描述:小李写了个简陋的文件上传服务器用来存储自己的学习资料,聪明的他还写了个waf,来防止黑客的入侵

审计附件源码

发现在查看文件内容的地方有个ssti注入的漏洞

黑名单

bp报文内容



然后访问/file/加上文件名

/file/1.txt





(>﹏<)

题目源码

这里的parse方法就是先去解析xml,然后找到根节点,接着遍历去寻找name这个属性

最后会返回name的值,所以就是有回显xml

我们构造一下即可

xml注入,直接外带flag即可



SQL???

可以直接跑sqlmap

sqlmap -r sql.txt -p id --dbs -T flag -C flag --dump



sql.txt



当然也可以手工注入



过滤了空格

然后测试有5个位置但是只有4个回显位

然后跑出数据表,有个flag表

然后发现flag表有个flag的字段



然后获得flag



Popppppp

https://blog.csdn.net/liaochonxiang/article/details/140361138?fromshare=blogdetail&sharetype=blogdetail&sharerId=140361138&sharerefer=PC&sharesource=git_clone&sharefrom=from_link

原题

虽然有原题,但是还是可以分析一下怎么

一般pop链子我都会先找destruct或者construct

然后再找终极调用的地方反推回去。

那么这题先找到

CherryBlossom::destruct

大概猜到能触发tostring了



然后找终极调用的地方,

一开始我以为是Princess::__call然后可以执行call_user_func

但是细心点发现不存在的方法名字和My拼接了,

而且只有Samurai调用了一个不存在的add方法



我们再找找终极调用的地方

那么我们倒推回去,

调用不存在的方法会触发call

然后发现见到一个没见过的函数array_walk

https://www.runoob.com/php/func-array-walk.html



但是这个function (
非法 TeX 公式
day2)是需要接受两个参数的 这里还new了一个类,然后还进行遍历了,然后就不难想到php的原生类

https://blog.csdn.net/cjdgg/article/details/115314651

php原生类



这样的话我们其实找到了操作文件的地方,不一定就要rce

然后我们倒推一下,当程序调用一个未定义或不可见(私有变量)的成员变量时就会触发get魔术方法



发现这个类调用了一个hey的不存在的属性

然后invoke是当尝试以调用函数的方式调用一个对象时,就会触发invoke

发现看头的类就有



那么链子就有了

然后

这里可以通过爆破得到$this->fruit11应该为213

脚本



payload列出根目录



//flag44545615441084



payload2



ez_readfile

这题的思路其实就是打cnext,但是直接用脚本的话跑不出来,感觉是吞字符的原因。

md5强碰撞,可以用工具fastcoll_v1.0.0.5.exe生成,也可以直接用网上的payload

文章https://blog.csdn.net/EC_Carrot/article/details/109527378

这里发现我bp的post传的字符是可以利用的,但是python发包不行,所以就没有直接用cnext的脚本直接跑了



然后找文章看看能不能直接本地生成payload直接打的



原来只要读这两个文件的内容即可

找到这个工具https://github.com/kezibei/php-filter-iconv

我们先利用

php://filter/convert.base64-encode/resource=/proc/self/maps

下载,然后看到这个文件里面有说明libc具体的位置



php://filter/convert.base64-encode/resource=/lib/x86_64-linux-gnu/libc-2.31.so

然后改成脚本里面的名字maps和libc-2.23.so放在exp的同一个目录下面



然后exp2.py写的命令是



因为我怕php的字符会吞掉或者转义之类的没掉,然后直接看flag的名字就行

生成的poc

bp发包之后没回显,但其实已经写入了



成功拿到flag名字



非预期解,直接读docker文件名字





ezzzz_pickle

前台用爆破,得到用户名和密码

admin

admin123

进入后台之后有个文件读取,穿越路径直接读到源码



然后读/proc/self/environ得到key和iv

SECRET_key=ajwdopldwjdowpajdmslkmwjrfhgnbbv



脚本,注意这段脚本要放在linux系统上面运行

把加密好的payload放到session字符串,然后执行,然后再次登陆即可看到flag



非预期解

读文件名字



UPUPUP

这题发现可以上传.htaccess

注:如果遇到图片文件头检测,例如用exif_imagetype检查是否为图片类型,

.user.ini可以不加注释直接打上GIF89a然后换行,不会报错;

.htaccess会报500错误

对于.htaccess来说,不能简单的加上GIF89a等文件头直接绕过,因为这会造成.htaccess文件格式不正确,无法解析,这时候我们就可以用以下方法进行绕过

在htaccess文件头部添加:

#define width 1337#define height 1337

或:

利用16进制编辑器添加:

x00x00x8ax39x8ax39



然后Content-Type为image/gif

内容是

然后再上传一个shell即可

下面是脚本



Message in a Bottle

bottle框架

开发文档



发现if判断条件,刚好可以去执行代码

一开始想着去命令执行,但是发现无回显,想弹shell,弹不了

就想着要不直接打内存马吧,参考文章

就有了下面这个

结果到了后面plus那题就直接出了,导致我感觉没啥区别这两题

Goph3rrr

扫描扫到app.py源码

审计发现过滤了127.0.0.1但是发现他启动app.py是0.0.0.0

所以这个黑名单可以用0.0.0.0替代

然后在/Manage路由可以命令执行

生成gopher发包的python脚本

/Gopher?url=gopher://0.0.0.0:8000/_POST%20/Manage%20HTTP/1.1%0D%0AHost%3A%200.0.0.0%3A8000%0D%0AContent-Type%3A%20application/x-www-form-urlencoded%0D%0AContent-Length%3A%207%0D%0A%0D%0Acmd%3Denv%0D%0A



bp发包记得要双重编码绕过

环境变量看到flag

Getshell

然后蚁剑连接

利用提权

https://gtfobins.github.io/gtfobins/wc/



Escape!

字符串逃逸+死亡绕过



要逃逸的是下面这些

一共长21个

发现用单引号最快

一个单引号可以多四个字符,那么就是5个单引号加上一个flag就逃逸21个字符了

或者是21个flag直接

因为这里的s:29是按照原来的flag计算的

比如说我现在注册一个用户名是

那么注册后就是这样的

但是waf检测到flag,把flag替换成error

这个29就不包括后面的

这就导致多了这个两个字符了,我们就是要利用这个特点



这段字符串逃逸出来

所以用户名是

然后登陆进admin

然后

拿到flag



Message in a Bottle plus

这里一开始fuzz

一直提示我语法错误,



后面我本地搭建了一个

就是我只输入一个双引号或者%字符都会导致报错,这个好像是因为枚举那个函数导致报错的



但是如何用两个双引号包裹就不会报错

同时我发现我输入

会把尖括号过滤了

我猜想就是这样导致一直提示报错,而两个双引号包裹又不会报错。

但是想到我的payload是多行,于是就用回显头的方式来看看是否执行成功



回显头多了个1说明成功了

读flag

这里我读了一下源码

去掉了一些CSS代码

这里的waf

明明不能调用os模块,但是为啥最后还是被调用了

0 条评论
某人
表情
可输入 255