1. 程式人生 > >i春秋 “百度杯”CTF比賽 十月場 Vld

i春秋 “百度杯”CTF比賽 十月場 Vld

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\',因為我們構造的$number0,因此最終的$username\\',前面的\被轉義失效,這樣就成功繞過了'的過濾,接下來執行報錯注入即可