|
0x00 session介紹
0x01 利用條件
0x02 利用思路
0x03 漏洞證明
0x04 防范方法
0x00 session介紹
一般的web認證方式都是通過cookie或者session來進行的。眾所周知,cookie是存在本地的,客戶端可以隨意修改;而session是以文本文件形式存儲在服務(wù)器端的,所以客戶端無法修改 Session 內(nèi)容。實際上在服務(wù)器端的 Session 文件,PHP 自動修改 session 文件的權(quán)限,只保留了系統(tǒng)讀和寫權(quán)限,而且不能通過 ftp 修改,所以安全得多。服務(wù)器上權(quán)限的劃分是以用戶為單位,所以session文件的所有權(quán)也是以用戶為單位的。一般來說,涉及敏感的權(quán)限時,使用session來進行權(quán)限驗證,比如網(wǎng)站的后臺。
Session與客戶端交互的方式是session_id。如PHP,在cookie中有一項為PHPSESSID,該session_id與服務(wù)端的session記錄文件一一對應(yīng),相當于Token。這樣看來,與session有關(guān)的信息有一個客戶端可以修改的session_id,利用這個性質(zhì)我們可以實現(xiàn)session的欺騙和劫持。
以PHP為例,我們首先來看與session相關(guān)的幾個函數(shù)。
session_save_path():定義了服務(wù)端session文件存儲的路徑。參數(shù)為空則顯示當前路徑,參數(shù)不為空則定義路徑。默認在php.ini中sessions.save_path 項配置。Windows下默認路徑:C:\Windows\Temp,linux下默認路徑為/tmp。這兩個路徑的權(quán)限較為寬松。在實際中我們也可以根據(jù)需要調(diào)用函數(shù)session_save_path('PATH')修改。
session_id():定義當前session的唯一標識,session_id。參數(shù)為空則顯示當前session_id,參數(shù)不為空則定義session_id。因為做了權(quán)限限制,PHP只能取到當前網(wǎng)站(實際上是當前網(wǎng)站在服務(wù)端對應(yīng)的用戶,若該用戶有多個站,則多個站之間的session可以直接訪問)產(chǎn)生的session_id對應(yīng)的session。
羅嗦了這么多,我們先生成一個session,看看文件里會有什么內(nèi)容。
<?phpsession_start();if(!session_is_registered('deleter')) $_SESSION['admin']='deleter';echo session_save_path().'\\sess_'.session_id();?>
運行結(jié)果為:
C:\Windows\Temp\sess_hadodem9d65kblem793sr9u3g7
文件中內(nèi)容為
admin|s:7:"deleter";
我們可以看到,session中內(nèi)容為明文存儲的。而有的時候服務(wù)器權(quán)限沒設(shè)好的情況下session文件是可以直接看到內(nèi)容的。
Session文件欺騙的原理是攻擊者在取得部分服務(wù)器權(quán)限后,在session_save_path中找到已通過驗證的session文件或者上傳偽造的session文件,然后在客戶端修改cookie中的session_id,從而欺騙服務(wù)器來獲取某種更高的權(quán)限。
基礎(chǔ)的東西介紹完了,接下來看利用條件。
0x01 利用及條件
黑客們攻取網(wǎng)站第一反應(yīng)是拿后臺,畢竟后臺權(quán)限大。但如果暴不出后臺密碼,前臺也沒有什么明顯的漏洞呢?接下來想到的是旁注。要是服務(wù)器權(quán)限設(shè)置很死,不能跨目錄,提權(quán)也提不下呢?C段?這樣就越繞越遠了。在旁注下之后可以考慮session文件欺騙來進入目標站的后臺。
Session文件欺騙的利用條件為:
1. 取得部分服務(wù)器權(quán)限(同服務(wù)器其他網(wǎng)站的webshell)
2. 目標網(wǎng)站敏感權(quán)限驗證通過session進行
3. session_save_path目錄可以訪問(或者session_id可以預(yù)測或爆破)
可能需要的附加條件為:
4. 目標網(wǎng)站授權(quán)好的session文件內(nèi)容已知,即可以偽造(一般對應(yīng)開源程序)
5. session中無客戶端驗證信息
0x02 利用思路
如果目標站符合這幾個條件,接下來就是利用了。
只需簡單兩步找出你路由器寬帶密碼
首先訪問session_save_path對應(yīng)的目錄,找出里面與session相關(guān)的文件(以sess_開頭),查找文件大小大于0的文件。
若在linux下且能執(zhí)行命令,可用:
cd /tmp
ls -l sess_*
Windows下對應(yīng)命令為:
cd C:\Windows\Tempdir /Q sess_*
若是不能執(zhí)行命令列出所有者,php中有一個fileowner函數(shù)可以得到所有者的uid。
觀察文件大小和所有者,找出可以利用的文件。找到可能的session文件之后,在客戶端修改session_id便能通過敏感權(quán)限的驗證。如果session_id可以預(yù)測或者爆破的話可以在客戶端進行相關(guān)嘗試。
假如沒有找到合適的session文件或者session中有客戶端驗證信息怎么辦?如果可以的話,我們本地生成一個然后傳到session_save_path對應(yīng)的目錄中。
生成偽造的session文件的方法為本地搭建web程序,通過驗證后找到對應(yīng)的session文件;或者猜測幾項可能的驗證項,本地生成。
0x03 漏洞證明
check.php
<?phpsession_start();if(!empty($_SESSION['admin'])) echo "success!";?>
Auth.php
<?phpsession_start();if(!session_is_registered('admin'))$_SESSION['admin']='deleter';echo session_save_path().'\\sess_'.session_id();?>
首先訪問check.php,沒有通過驗證。
![]()
接下來訪問Auth.php
![]()
產(chǎn)生驗證文件。其內(nèi)容為:
admin|s:7:"deleter";
將其另存為C:\Windows\Temp\sess_auth文件,即偽造session_id=auth的session文件。
![]()
修改客戶端session_id。
![]()
刷新check.php,通過驗證。
![]()
0x04 防范方法
1. 自定義session_save_path并設(shè)置好權(quán)限
2. session中加入客戶端驗證信息
3. 退出時不要直接關(guān)閉瀏覽器,要使session失效
路由器的管理賬號跟密碼我知道,因為這路由器是我買的,這樣給我?guī)砹瞬檎覍拵з~號的方便。以前我試過什么星號查看器,寬帶賬號密碼查看器,這都東西對我都不管用。于是我大膽猜想到能不能查看網(wǎng)頁源代碼,從源代碼里面找出寬帶賬號密碼呢,經(jīng)過我第一遍測試,居然成功了,這未免太......
2.jpg (59.87 KB, 下載次數(shù): 964)
下載附件
2013-9-8 21:30 上傳
灰鴿子使用教程下面看看步驟,第一步當然是登陸路由器,一般輸入192.168.1.1或者192.168.0.1就能打開路由器頁面,賬號密碼一般默認是admin(因為路由器分很多種所有有部分默認賬號密碼不是admin而是其他的,由于很多這里就不一一介紹了)進入以后找到網(wǎng)絡(luò)參數(shù)-WAN口設(shè)置,然后右邊會出現(xiàn)賬號,以及星號密碼,這里顯示的是星號密碼,你是無法查看的,就算你用工具也不能查看。這可能是制作商故意這樣設(shè)計的,這個頁面每一秒鐘刷新一次。
到了這個頁面以后,我們按F12(我用的是IE9,所以直接按F12,其他瀏覽器自己測試)以后網(wǎng)頁底部會出現(xiàn)一個框框,框框里面就是網(wǎng)頁各種源代碼了,這里我已經(jīng)找出寬帶賬號密碼儲蓄在哪一項了,所以直接點開那一項就能看見賬號密碼了。這兩項分別為:
<frameset rows="*" cols="155,30,*" border="0" frameBorder="NO" frameSpacing="0">
<frame name="mainFrame" src="/userRpm/MainRpm.htm">
|
|