i春秋 “百度杯”CTF比賽 十月場 Vld
阿新 • • 發佈:2018-11-10
https://www.ichunqiu.com/battalion?t=1&r=0
opcode
中的 BEGIN_SILENCE
就是@
,不顯示報錯資訊
猜測opcode
中的 EXT_STMT
就是;
,表示一個語句的結束
opcode
中的FETCH_R
意思是從某個變數中取出值並把這個值賦給另一個變數
詳細資訊參考php opcode
JMPZ
,若比較結果為false
,則跳轉到指定地址處的程式碼
對vld
輸出結果的分析如下:
<?php echo 'do+you+know+Vulcan+Logic+Dumper%3F%3Cbr%3E'; $a = @$_GET['flag1']; $b = @$_GET['flag2']; $c = @$_GET['flag3']; 比較 $a 和 'fvhjjihfcv'是否相等 如果不相等,跳轉至38 繼續執行39,輸出 'false%3Cbr%3E' 比較 $b 和 'gfuyiyhioyf'是否相等 如果不相等,跳轉至35 繼續執行36,輸出 'false%3Cbr%3E' 比較 $c 和 'yugoiiyhi'是否相等 如果不相等,跳轉至32 繼續執行33,輸出 'false%3Cbr%3E' 如果以上三個判斷都為true,就會執行30 ECHO 'the+next+step+is+xxx.zip'
所以我們要向index.php
提交三個引數,flag1、flag2、flag3
,值分別為:fvhjjihfcv、gfuyiyhioyf、yugoiiyhi
這是返回結果
do you know Vulcan Logic Dumper?
the next step is 1chunqiu.zip
直接使用URL
訪問1chunqiu.zip
,我們就可以得到一份原始碼
審計原始碼,發現存在SQL
注入漏洞
$username = $db->safe_data($_POST['username']); $password = $db->my_md5($_POST['password']); $number = is_numeric($_POST['number']) ? $_POST['number'] : 1; $username = trim(str_replace($number, '', $username));
$username
變數中與$number
相等的字串會被替換為""
,我們可以結合dbmysql.class.php
中的safe_data
成員方法中的addslashes
函式來進行'
的繞過
PHP的一個語言特性,PHP中的addslashes函式除了會對 ' " \
進行轉義之外,還會對 url
編碼為 %00
的字元進行轉義,轉義結果為 \0
,因為在ascii碼中,0
對應的字元為 \0
,是沒有辦法直接輸出的,但是使用addslashes
函式之後,就可以顯示了 ,\\0
輸出就是\0
這一點我們可以通過在本地環境中驗證來得到
然後我們就可以在burp suite
這樣來構造我們的$number
和$username
$number = 0
$username = %00'
$username
的處理結果為\0\'
,因為我們構造的$number
為0
,因此最終的$username
為\\'
,前面的\
被轉義失效,這樣就成功繞過了'
的過濾,接下來執行報錯注入即可