挺难评的
省赛web
openthedoor
拿到账号
密码是sysadmin,(可以爆破,但是这题是原题,直接这样吧。
bruteforce1_EzLogin
爆破
账号是admin
token
一眼php伪随机数
1 | str1='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' |
1 |
|
caiji
原题,稍微修改了一点。
ctf2024-wastelands/medpod at master · Interlogica-Cybersec/ctf2024-wastelands (github.com)
爆破拿到key
hashcat -m 16500 hash.txt rockyou.txt
伪造jwt
jwt认证sub那里打一个sql注入拿到所有医生uuid
利用扁鹊的uuid拿到flag
tpf
先讲一下docker的情况
是四台主机,暴露了nginx80端口
nginx–thinkphp–flask–mariadb
通过nginx反代,改变http请求的host头可以访问thinkphp和flask,或者10开头的内网地址
先看看flask。(完整源码我放后面了。
由于这里存在before_request,需要tp主机的ip,以及数据库里面的token。所以直接打是不太可能的。
那我们先看tp
thinkphp
webshell
tp嘛,直接看控制器给了什么。
1 | public function new(){ |
给了增删改的函数。
由于file_put_contents()
函数会尝试在指定的路径下创建或写入文件,但前提是该路径的所有父级目录都必须存在。如果路径中的任何目录不存在,PHP 将无法创建文件并会返回 false
,导致写入失败。
所以我们先要创建一个sha1(get_client_ip())
将ip进行sha1加密为名字的文件夹。
然后在tmp目录下写一个一句话木马。
再利用mv函数目录穿越
成功移动到web目录下
一些疑问
这里之所以在mv函数进行目录穿越,是因为mv函数没有对移动后的文件名进行检验。
1 | function checkDot($param) |
还有一个奇怪的点,我之前在kali里面启动的环境web目录是不可写的。
但是我后来用dockek desktop启动的环境又可写了。怪
信息收集
拿到权限之后,就得挂代理,寻找内网主机了。
这里拿到了tp的ip。
那就差数据库里的token了。
他这个题目也是抽象,三位都是随机的。
由于app.py里面sql语句是参数化查询,想要sql注入是不太可能了。所以现在唯一的办法就是扫ip找到mysql了。(大概。
用docker直接看ip,不想写了,感觉这题有点抽象了
后来想到为什么flask的配置里面没有ip,为什么也能连接呢?发现原来它是通过主机名直接连接数据库,所以题目三个地方都是随机就是防止我们直接找到ip。
那tp估计也已经连接了数据库,我们直接在tp里面写一个数据库操作的函数来查询数据就好了。
利用这个函数成功拿到token。
flask
源码
1 | import socket |
ip以及token我们都拿到了,剩下的利用json会自动转换编码绕过一下就行。
1 | import requests |
结束。