雖然說現在的web開發框架都是挺成熟的框架,在性能、安全等方面都有比較好的表現,但問題往往出現在業務邏輯上,如上週我再公司發現的一個跨站腳本攻擊,(通常公司是這麼過濾的,max(0,$_GET[‘a’])、strip_tags($_GET[‘a’]),然而代碼量大的話,就容易出現忽略的地方)
如下面一段代碼:
- <script>
- (function(){
- var a = {:$_GET['b']};
- //....
- })()
- </script>
如果把接收的參數寫成:””;alert(document.cookie);//,那麼攻擊就成功了,
有了這個漏洞之後如何利用,首先構造一個獲取cookie然後跳轉到指定服務器進行進行信息收集,然後再跳轉回一個不易被懷疑的頁面(但如果要做的事比較多,腳本比較多怎麼辦,
像當年新浪的xss一樣,引入js腳本)。有沒有更高級的做法,答案是有的,用jsonp就不用跳轉了,這個我沒有試驗,另外還有一種方式,就是把鏈接生成二維碼,
通過掃描二維碼的方式也不易被發現,所以大家沒事不要隨便掃二維碼,不要以爲在微信中就認爲鏈接不可見,get到鏈接的方法就是分享頁面給自己,然後通過郵件轉發就能看到鏈接.
優缺點:
優點:
效率高
缺點:
不便於維護,缺乏安全性
解決方案:
- 使用全局過濾
- 要求使用統一的函數進行參數接收,就算不用I函數也可以自定義一個函數
- 添加驗證碼等操作
如何減少攻擊帶來的損失:
- 在一個web項目裏,由於多人合作,不一定能每一個細節都做的很好,所以
- cookie啓用httponly屬性,thinkphp裏似乎要3.2.3版本纔有,沒有也沒關係,可以自己加上,在新版本的thinkphp找到cookie函數,跟舊版本的對比下就知道了,另外
需要在配置裏配置’COOKIE_HTTPONLY’ => true,這個可以在大部分瀏覽器保證cookie不被偷走
bug終結者
你以爲這樣就完了嗎,往下看:
thinkphp(3.2.3core版測試,默認過濾’DEFAULT_FILTER’=>’htmlspecialchars’,)裏I函數也無能爲力的地方就是
不過濾單引號
- (function(){
- var a = '{:$_GET["b"]}';
- var b = '{:I("b")}';//變量輸入 ';alert(document.cookie);//
- console.log(a);
- console.log(b);
- })()
這種情況I函數也幫不了你,最後,使用統一的過濾函數,並且注意I函數單引號的問題