[Web安全之實戰] 跨站腳本攻擊XSS

Writer:BYSocket(泥沙磚瓦漿木匠) javascript

Reprint it anywhere u want. html

文章Points:
  1. 認識XSS
java

  2. XSS攻擊 瀏覽器

  3. XSS防護(重點) 安全

  

1、認識XSS先

  先說個故事吧,在上一篇,我還想說這個案例。其實什麼叫攻擊,很簡單。獲取攻擊者想要的信息,就黑成功了。抓到一個Tomcat漏洞(這不是我說的,一個認識的人說的),上傳一個JSP,裏面模擬HttpClient,下載一個木馬,運行。OK,搞定了。因此,沒有絕對的安全。 服務器

  今天,泥瓦匠帶大家認識下XSS,而後關於怎麼防護的問題。至於防護的話,仁者見仁智者見智。爾等啥都不配不上的就綽見,望各位閱讀者相互討論。泥瓦匠目前是搞JAVA的,因此例子上JAVA比較多。 cookie

  Q: 什麼是XSS? 爲啥有這個呢? app

  A: 全名:Cross Site Script,中文名:跨站腳本攻擊。顧名思義,是指「HTML注入」纂改了網頁,插入惡意的腳本,從而在用戶用瀏覽網頁的時候,控制用戶瀏覽器的一種攻擊。 socket

  XSS根據攻擊的穩定性可分爲三種:反射型XSS, 存儲型XSS,DOM Based XSS. 編碼

  image

2、XSS攻擊

  再來了解下XSS,是如何攻擊?泥瓦匠這時候想到一句話:知己知彼,百戰百勝吧。這攻擊咱們不會很詳細解釋,畢竟想說的是XSS防護嘛。首先,泥瓦匠要介紹下的是:

  XSS Payload,所謂用以完成各類具體的功能的惡意腳本。這時候我想到了黑客精神中的小插曲,如今所謂的「黑客」不是真正的黑客,而是稱爲腳本小子(Script Kid)。常見的一個XSS Payload,就是經過讀取瀏覽器的Cookie對象,從而發起了‘Cookie劫持’攻擊。這個泥瓦匠會教大家去防護哈,其中Cookie的‘HttpOnly’標識能夠防止哦。

  強大的XSS Payload能夠作如下的事情哈:一、構造 GET 與 POST 請求 二、各類釣魚 三、識別用戶瀏覽器 等等
Q&A

  Q:什麼叫作釣魚呢?
  A:顧名思義,願者上鉤,這裏作貶義用法。好比,人家用一個假的彈出框,或者假的頁面讓你輸入QQ信息,或者啥帳號信息。其實你一輸入人家服務器獲取到你的帳戶密碼了。這就是魚兒上鉤了。 如圖比喻:
image

 

3、XSS防護(重點)

  兵來將擋,水來土掩。泥瓦匠在Web安全上,想提醒你們的是:「再高的樹,猴子也能爬上去。」所以,咱們考慮的地方有些默認都給你作好了,有些須要咱們本身去關心,去設置。

  其實在看不到的地方不少已經對抗XSS作了些措施。好比各類瀏覽器等。

  1、按着上面的思路,泥瓦匠先聊下Cookie,一個Cookie,咱們是這樣使用的:
    一、瀏覽器下服務器發送請求,準備獲取Cookie

    二、服務器返回發送Cookie頭,向客戶端瀏覽器寫入Cookie。(注意哦,這裏是瀏覽器,不要當成什麼瀏覽器內核)

    三、在Cookie到期前,瀏覽器全部頁面,都會發送Cookie。

  這就意味着,咱們Cookie不能亂用。就像Session同樣,因此在使用的時候,要注意下。有時候Cooike在用於記住密碼的時候,千萬要注意要將Cookie設置HttpOnly屬性爲Ture。這裏我以SpringMVC爲例子。若是用到Cookie的時候,應該這樣:

?
1
2
3
4
5
6
7
         // 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);

截個Controller整個代碼看看:
image

咱們打開瀏覽器能夠看到下面這種結果,訪問URL這個Controller層,打開Firebug查看:
image

  2、輸入校驗

  輸入校驗的邏輯必須放在服務端中實現。若是用JS進行的話,容易被攻擊者繞過去。因此廣泛的作法是,相似不少代碼同樣進行Double Check:」客戶端JS校驗和服務端校驗一塊兒,這樣客戶端JS校驗會阻擋大部分甚至說99%的用戶的誤操做。」

  在XSS防護上,咱們須要對用戶輸入的一些特殊字符校驗,過濾或者是編碼。這種輸入校驗的方式成爲「XSS Filter」。首先咱們在配置文件中,

image其中的路徑配置固然,在你須要的地方配置下咯。而後泥瓦匠在這裏寫了個,Http請求裝飾類,用來對這些參數的過濾。說幹就幹唄~實戰出經驗。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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;
    }
}

  3、輸出校驗

  通常來講,除了富文本以外,在變量輸出到HTML頁面,可使用編碼或者轉義的方式來防護XSS攻擊。這是一種各家委婉的方式吧。

4、總結

  用兵之道在於,如何正確的使用,才能以少勝多。Web安全這場戰爭也同樣,因此要如何正確的使用XSS防護。

Writer:BYSocket(泥沙磚瓦漿木匠)

Reprint it anywhere u want.

相關文章
相關標籤/搜索