解題思路
首先登陸頁面發現是這樣的:
查看源碼
源碼很正常,也沒有什么特別的
web目錄掃描
我用的是dirmap工具掃描,掃描結果保存在一個txt文件中,結果可知沒什么后台。
robots.txt
發現有/user.php.bak
下載后
審計源碼
直接是一個UserInfo類,三個屬性,get函數中存在ssrf,且沒有過濾。curl可用file協議,blog屬性調用了get函數,所以這里使用file協議讀取文件。file:///var/www/html/flag.php
正常解題
首先肯定要join,即注冊一個用戶
提示注冊成功。
get注入
注冊后發現可以點擊自己的username,點擊之后,觀察url可能存在get注入。sqlmap跑一下。sqlmap跑不出來,手動檢測,是數字型注入。union select 發現有waf,用/**/即可繞過。union /**/ select.回顯位置是第二位,往下注注注。
數據庫名:fakebook 表名:users 列名:data ,發現是序列化的數據,可知對我們注冊的姓名,年齡,博客地址進行了序列化
並且發現爆出路徑:/var/www/html/
反序列化
可以利用的變量在構造函數中,反序列化對象會自動執行構造函數。所以我們編寫腳本,將需要構造的ssrf放在blog屬性中,讓其在反序列化時被調用
O:8:"UserInfo":3:{s:4:"name";s:1:"a";s:3:"age";i:0;s:4:"blog";s:29:"file:///var/www/html/flag.php";}
因為blog在第四位,所以paylaod:
?no=-1/**/union/**/select/**/1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:4:"test";s:3:"age";i:123;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'
注入后blog欄顯示file:///var/www/html/flag.php,此時即代表注冊成功。查看源碼:
iframe標簽中讀取了flag.php中的內容。flag即出現
總結思路
核心思路:
- 通過注入發現data的數據是序列化的
- 通過后台獲取源碼,代碼審計存在可利用的ssrf點
- 結合反序列化和ssrf,保證bypass可以被利用,讀取flag.php中的flag
知識點
- ssrf
- sql注入
- 反序列化漏洞