解題部分
題目來源
攻防世界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