漏洞復現 | Discuz 7.2 反射型xss漏洞

  • 2019 年 10 月 7 日
  • 筆記

一、下載源碼進行環境搭建

1、先安裝Ucenter

2、解決出現問題

安裝好後,打開發現彈出以下介面

在Ucenter資料庫下執行以下命令即可

DROP TABLE IF EXISTS uc_pms;# MySQL 返回的查詢結果為空 (即零行)。  CREATE TABLE uc_pms (  pmid int(10) unsigned NOT NULL auto_increment,  msgfrom varchar(15) NOT NULL default '',  msgfromid mediumint(8) unsigned NOT NULL default '0',  msgtoid mediumint(8) unsigned NOT NULL default '0',  folder enum('inbox','outbox') NOT NULL default 'inbox',  new tinyint(1) NOT NULL default '0',  subject varchar(75) NOT NULL default '',  dateline int(10) unsigned NOT NULL default '0',  message text NOT NULL,  delstatus tinyint(1) unsigned NOT NULL default '0',  related int(10) unsigned NOT NULL default '0',  PRIMARY KEY(pmid),  KEY msgtoid(msgtoid,folder,dateline),  KEY msgfromid(msgfromid,folder,dateline),  KEY related (related),  KEY getnum (msgtoid,folder,delstatus)  )# MySQL 返回的查詢結果為空 (即零行)。

二、漏洞演示漏洞POC地址:

http://127.0.0.1/Discuz/logging.php?action=logout&formhash=b1abb3e2&referer=';alert(document.domain);'

三、對漏洞進行白盒測試

1、referer欄位

根據poc可以看出利用的欄位是logging .php下的referer欄位,打開看看

2、dreferer函數

可以看到referer欄位由dreferer函數進行賦值,找到dreferer函數,判斷dreferer是如何取rederer值的,可以在include/global.func.php文件中直接找到對應函數。

可以看到,因為$referer是我們傳參的值,不為空,所以直接執行語句$referer = dhtmlspecialchars($referer);

這裡dhtmlspecialchars方法是對我們傳入的referer的值進行關鍵詞過濾,在include/global.func.php中可以同樣找到該函數:

核心部分是其中的str_replace進行的字元替換,可以看到主要對&、」、<、>進行替換處理,而對poc中的字元並未進行過濾

3、showmessage函數

在logging.php文件中26行可以看到showmessage函數對dreferer函數進行了調用

此時來include/global.func.php下查看一下showmessage函數程式碼

這個函數主要是構造$show_message內容,其中$url_forward就是我們傳入的$referer的內容,$referer被直接構造在timeout里,最終賦值給$show_message, 而$show_message則最終會被插入到頁面模板./forumdata/templates/1_1_showmessage.tpl.php中,而我們的payload也通過參數referer最終在頁面展示。