跨站腳本攻擊XSS
今天,泥瓦匠(jiang)帶你(ni)們認識下XSS,然(ran)后關于(yu)怎么防(fang)御的(de)問題。至于(yu)防(fang)御的(de)話,仁者(zhe)見(jian)(jian)仁智者(zhe)見(jian)(jian)智。爾等啥(sha)都(dou)不配不上的(de)就(jiu)綽見(jian)(jian),望各(ge)位閱讀者(zhe)相互討論。泥瓦匠(jiang)目(mu)前是搞JAVA的(de),所以例子(zi)上JAVA比較多(duo)。
一、認識XSS先
先說個(ge)故事吧,在上一(yi)篇,我還想說這個(ge)案例。其(qi)實什么叫攻擊,很簡單。獲取攻擊者想要的(de)信息,就黑成功了。抓到(dao)一(yi)個(ge)Tomcat漏洞(dong)(這不是我說的(de),一(yi)個(ge)認識的(de)人說的(de)),上傳(chuan)一(yi)個(ge)JSP,里面模(mo)擬(ni)HttpClient,下載一(yi)個(ge)木馬,運行。OK,搞定了。所以,沒有絕對(dui)的(de)安全。
今天,泥瓦匠(jiang)帶你們認識下XSS,然(ran)后關于(yu)怎么防御的問題。至于(yu)防御的話,仁者見(jian)仁智者見(jian)智。爾等啥都不(bu)配不(bu)上(shang)的就綽見(jian),望各位閱讀(du)者相互(hu)討論。泥瓦匠(jiang)目(mu)前(qian)是搞JAVA的,所(suo)以(yi)例子(zi)上(shang)JAVA比較多。
Q: 什么(me)是XSS? 為啥有這(zhe)個呢?
A: 全名(ming):Cross Site Script,中文(wen)名(ming):跨站(zhan)腳(jiao)本攻擊(ji)。顧(gu)名(ming)思義,是(shi)指“HTML注(zhu)入(ru)”纂改了網頁,插入(ru)惡(e)意(yi)的(de)腳(jiao)本,從而在(zai)用(yong)戶用(yong)瀏覽(lan)(lan)網頁的(de)時候,控制用(yong)戶瀏覽(lan)(lan)器的(de)一種攻擊(ji)。
XSS根據攻(gong)擊的穩定性可分為三種:反(fan)射型XSS, 存(cun)儲(chu)型XSS,DOM Based XSS.
<img title="image" alt="image" width="390" height="311" src="//s9.51cto.com/wyfs02/M02/59/3F/wKioL1TNg4bxyLbwAAA-WGcB1yw307.jpg" style="border:0px;" />
二、XSS攻擊
再來(lai)了解(jie)下XSS,是如何攻擊?泥瓦匠這(zhe)(zhe)時候想(xiang)到一(yi)句話(hua):知(zhi)己知(zhi)彼,百戰百勝吧。這(zhe)(zhe)攻擊我們不會很詳細解(jie)釋,畢竟想(xiang)說(shuo)的是XSS防御嘛。首先,泥瓦匠要介(jie)紹(shao)下的是:
XSS Playload,所(suo)謂用以完成各種具體(ti)的(de)功能的(de)惡意腳本。這時(shi)候我想到了(le)黑客(ke)精神中(zhong)的(de)小(xiao)插曲,現在所(suo)謂的(de)“黑客(ke)”不是真正的(de)黑客(ke),而是稱(cheng)為腳本小(xiao)子(Script Kid)。常見的(de)一個XSS Playload,就(jiu)是通過讀取瀏覽器(qi)的(de)Cookie對象,從而發起(qi)了(le)‘Cookie劫持’攻(gong)擊。這個泥瓦匠會(hui)教你們(men)去防御哈,其(qi)中(zhong)Cookie的(de)‘HttpOnly’標識可以防止(zhi)哦。
強大的XSS Playload可(ke)以做以下的事(shi)情哈:1、構造 GET 與 POST 請求 2、各種釣魚 3、識(shi)別用戶瀏覽器 等(deng)(deng)等(deng)(deng)
Q&A
Q:什么叫做(zuo)釣(diao)魚呢?
A:顧名思義,愿者(zhe)上鉤,這(zhe)里做貶義用(yong)法。比(bi)如,人家用(yong)一個假(jia)的彈出框,或者(zhe)假(jia)的頁面讓你輸(shu)入QQ信(xin)息(xi),或者(zhe)啥賬號信(xin)息(xi)。其實你一輸(shu)入人家服務(wu)器獲(huo)取到你的賬戶密碼了。這(zhe)就是魚(yu)兒上鉤了。 如圖比(bi)喻:
<img title="image" alt="image" width="417" height="318" src="//s8.51cto.com/wyfs02/M02/59/42/wKiom1TNgqDTmmgOAAA3ZIJeddY827.jpg" style="border:0px;" />
三、XSS防御(重點)
兵(bing)來(lai)將擋(dang),水來(lai)土掩。泥(ni)瓦(wa)匠在Web安全上,想提(ti)醒大(da)家的(de)是(shi):“再高的(de)樹,猴子也(ye)能爬(pa)上去。”因此,我們考慮的(de)地(di)方有(you)些默認都給你做好了,有(you)些需要我們自己去關心,去設置。
其實在看不到的(de)地方很多已經對抗XSS做了些措施。比如各種瀏覽器等。
一(yi)、按著(zhu)上面(mian)的思路(lu),泥瓦匠(jiang)先聊下(xia)Cookie,一(yi)個Cookie,我們(men)是這樣(yang)使用的:
1、瀏覽(lan)器下服務(wu)器發送請求,準備獲取(qu)Cookie
2、服務器(qi)(qi)返回(hui)發送Cookie頭,向客戶(hu)端瀏(liu)覽(lan)器(qi)(qi)寫入Cookie。(注意哦,這里(li)是瀏(liu)覽(lan)器(qi)(qi),不要當成(cheng)什么瀏(liu)覽(lan)器(qi)(qi)內(nei)核)
3、在Cookie到(dao)期前(qian),瀏(liu)覽器(qi)所(suo)有頁面,都會發送Cookie。
這就意味著,我(wo)們Cookie不能亂用。就像Session一(yi)樣(yang),所以在(zai)使用的時(shi)候(hou)(hou),要(yao)注意下。有(you)時(shi)候(hou)(hou)Cooike在(zai)用于(yu)記住密(mi)碼的時(shi)候(hou)(hou),千(qian)萬要(yao)注意要(yao)將(jiang)Cookie設(she)置HttpOnly屬性(xing)為Ture。這里(li)我(wo)以SpringMVC為例子。如果用到Cookie的時(shi)候(hou)(hou),應該(gai)這樣(yang):
// create cookie and set it in response Cookie cookie1 = new Cookie("cookie1", "cookieValueHttpOnly"); Cookie cookie2 = new Cookie("cookie2", "cookieValue"); cookie1.setHttpOnly(true); response.addCookie(cookie1); response.addCookie(cookie2);
截個(ge)Controller整(zheng)個(ge)代碼(ma)看看:
<img title="image" alt="image" width="498" height="371" src="//s4.51cto.com/wyfs02/M02/59/3F/wKioL1TNg4bwYQYVAABwFSGDcPM003.jpg" style="border:0px;" />
我們(men)打(da)開瀏(liu)覽器可以看(kan)(kan)到下面這種結果,訪問(wen)URL這個Controller層,打(da)開Firebug查看(kan)(kan):
<img title="image" alt="image" width="498" height="136" src="//s7.51cto.com/wyfs02/M00/59/3F/wKioL1TNg4eRUGJhAAA8ZC-kclw848.jpg" style="border:0px;" />
二、輸入校驗
輸入校驗的(de)邏輯必須放(fang)在服務端中實現。如果用JS進行的(de)話,容易被(bei)攻擊者繞過去。所(suo)以普遍的(de)做法是,類似(si)很多代碼一樣(yang)進行Double Check:”客(ke)(ke)戶(hu)端JS校驗和服務端校驗一起,這樣(yang)客(ke)(ke)戶(hu)端JS校驗會阻擋大部分甚至說(shuo)99%的(de)用戶(hu)的(de)誤操作(zuo)。”
在XSS防御上,我們需要(yao)對(dui)用戶輸(shu)入的一些特殊字(zi)符(fu)校(xiao)驗,過濾或者是編(bian)碼。這種輸(shu)入校(xiao)驗的方式(shi)成為“XSS Filter”。首先我們在配置文件(jian)中(zhong),
<img title="image" alt="image" width="498" height="304" src="//s5.51cto.com/wyfs02/M02/59/42/wKiom1TNgqLz9TO-AACA0kcgxeM065.jpg" style="border:0px;" />
其中(zhong)的路徑(jing)配置(zhi)(zhi)當(dang)然,在你需要的地方配置(zhi)(zhi)下咯(ge)。然后泥瓦匠在這里寫了個,Http請(qing)求(qiu)裝飾(shi)類,用(yong)來對這些參(can)數(shu)的過濾。說干就干唄~實(shi)戰出經驗(yan)。
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { public XssHttpServletRequestWrapper(HttpServletRequest request) { super(request); } public String[] getParameterValues(String parameter) { String[] values = super.getParameterValues(parameter); if (values==null) { return null; } int count = values.length; String[] encodedValues = new String[count]; for (int i = 0; i < count; i++) { encodedValues[i] = cleanXSS(values[i]); } return encodedValues; } public String getParameter(String parameter) { String value= super.getParameter(parameter); if (value == null) { return null; } return cleanXSS(value); } public String getHeader(String name) { String value= super.getHeader(name); if (value == null) return null; return cleanXSS(value); } /** * @Title: cleanXSS * @Description: You'll need to remove the spaces from the html entities below * @param @param value * @param @return * @return String */ private String cleanXSS(String value) { value= value.replaceAll("<", "& lt;").replaceAll(">", "& gt;"); value = value.replaceAll("\(", "& #40;").replaceAll("\)", "& #41;"); value = value.replaceAll("'", "& #39;"); value = value.replaceAll("eval\((.*)\)", ""); value = value.replaceAll("[\"\'][\s]*javascript:(.*)[\"\']", """"); value = value.replaceAll("script", ""); return value; } }
三、輸出校驗
一(yi)般來說(shuo),除了富文本之外,在(zai)變量輸出(chu)到(dao)HTML頁面(mian),可(ke)以使用編碼(ma)或(huo)者轉義的方(fang)式來防御XSS攻擊。這是一(yi)種(zhong)各(ge)家委婉的方(fang)式吧。
四、總結
用兵之道(dao)在于,如(ru)(ru)何正確(que)的使用,才能(neng)以(yi)少勝多(duo)。Web安(an)全這場戰(zhan)爭也一(yi)樣,所以(yi)要如(ru)(ru)何正確(que)的使用XSS防御。如(ru)(ru)果(guo)你是(shi)(shi)菜鳥,沒關系,建議你使用企業(ye)自(zi)助建站(zhan)系統(tong)建站(zhan)寶(bao)盒,通過這套(tao)程序(xu)您可以(yi)有(you)效規避跨站(zhan)腳本攻擊(ji)XSS,將(jiang)合適的工作(zuo)(zuo)交給最專業(ye)的人,制作(zuo)(zuo)一(yi)個擁有(you)電腦站(zhan)+手機站(zhan)+微(wei)站(zhan)+手機APP的四站(zhan)一(yi)體的企業(ye)商城網站(zhan),在線銷售產品豈不是(shi)(shi)很好呢。
Writer:BYSocket(泥沙磚瓦漿木(mu)匠)
