0x00 什麼是cookie?
cookie是當前識別用戶,實現持久會話的最好的方式,有時也叫cookies,指某些網站爲了辨別用戶身份、進行 session 跟蹤而儲存在用戶本地終端上的數據(通常經過加密)。cookie最初是由網景公司開發的,現在所有的瀏覽器都支持。
“Cookie”是小量信息,由網絡服務器發送出來以存儲在網絡瀏覽器上,從而下次這位獨一無二的訪客又回到該網絡服務器時,可從該瀏覽器讀回此信息。這是很有用的,讓瀏覽器記住這位訪客的特定信息,如上次訪問的位置、花費的時間或用戶首選項(如樣式表)。Cookie 是個存儲在瀏覽器目錄的文本文件,當瀏覽器運行時,存儲在 RAM 中。一旦你從該網站或網絡服務器退出,Cookie 也可存儲在計算機的硬驅上。當訪客結束其瀏覽器對話時,即終止的所有 Cookie。
0x01 cookie的類型
(1)會話cookie
會話cookie是一種臨時cookie,它記錄了用戶訪問站點時的設置和偏好。用戶退出瀏覽器時,會話cookie就被刪除了。
(2)持久cookie
持久cookie的生存時間更長一點,他們存儲在硬盤上,瀏覽器退出,計算機重啓時他們依然存在。通常會用持久cookie維護某個用戶會週期性訪問的站點的配置文件或登錄名。
(3)會話cookie和持久cookie的區別
唯一的區別就是它們的過期時間。
0x02 cookie是如何工作的?
cookie就像服務器給用戶帖的“嗨,我叫xxx”的貼紙一樣。用戶訪問一個web站點時,這個web站點就可以讀取服務器貼在用戶身上的所有貼紙。
用戶首次訪問web站點時,web服務器對用戶一無所知。web服務器希望這個用戶會再次回來,所以想給這個用戶貼上一個獨有的cookie,這樣以後它就可以識別出這個用戶了。cookie中包含了一鍵值對形式的列表,並通過Set cookie
或Set cookis2
HTTP響應(擴展)首部將其帖到用戶身上去。
cookie中可以包含任意信息,但他們通常只包含一個服務器爲了進行跟蹤而產生的獨特的識別碼。
0x03 如何判斷是否存在cookie注入?
(1)判斷參數是否通過cookie傳遞?
一般瀏覽器向服務器發起請求都是通過GET
或POST
來傳入參數的,但是也有通過cookie
傳入的,要判斷是否存在cookie注入,首先就要判斷參數是不是通過cookie來傳入的。
通過下面一個實例來說明:
訪問http://120.203.13.75:8001/shownews.asp?id=171
,可以看到參數id
,
去掉參數id
,再次訪問,發現頁面不能正常訪問
這時候我們在瀏覽器地址欄中輸入下面的代碼,來設置cookie,其內容爲id=171
javascript:alert(document.cookie="id="+escape("171"));
成功彈窗,說明上面的代碼被成功執行,這時候再來訪問http://120.203.13.75:8001/shownews.asp
,發現頁面又可以成功訪問了
通過上述過程,我們就可以確定參數是通過cookie
傳入的
(2)判斷在cookie處是否存在注入?
由於edge沒有cookie編輯插件,所以我們在chrome中測試是否存在注入?
再次訪問,頁面顯示正常
測試是否存在注入,payload:id=171+order+by+10
,頁面返回正常,
通過以上測試就可以得出結論:該站點存在cookie注入。
0x04 cookie注入漏洞產生原因
cookie注入一般見於asp
或aspx
搭建的網站,這是因爲在asp
或aspx
語言中,獲取參數是有不同的語言表達形式,比如:
GET
型獲取參數:Request.QueryString['id']
POST
型獲取參數:Request.Form['id']
還可以以Request['id']
的表達形式來獲取參數,這時候獲取參數的順序是QueryString
、Form
、Cookies
、ServerVariables
。
所以說如果使用了Request['id']
的形式,就有可能存在cookie注入。
0x05 cookie注入的利用條件
(1)程序對get和post方式提交的數據進行了過濾,但未對cookie提交的數據庫進行過濾。
(2)在條件1的基礎上,還需要程序對提交數據獲取方式是直接request(“xxx”)的方式,未指明使用request對象的具體方法進行獲取。
0x06 簡單示例
猜測是否存在admin
表
id=171+union+select+1,username,password,4,5,6,7,8,9,10+from+admin
發現頁面返回了admin
表中,username
和password
字段的值:admin
、b9a2a2b5dffb918c
得到管理員用戶名和密碼
登錄後臺,admin/welcome
成功拿到flag