安装好后,打开发现弹出以下界面
在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 返回的查询结果为空 (即零行)。
http://127.0.0.1/Discuz/logging.php?action=logout&formhash=b1abb3e2&referer=';alert(document.domain);'
根据poc可以看出利用的字段是logging .php下的referer字段,打开看看
可以看到referer字段由dreferer函数进行赋值,找到dreferer函数,判断dreferer是如何取rederer值的,可以在include/global.func.php文件中直接找到对应函数。
可以看到,因为$referer是我们传参的值,不为空,所以直接执行语句$referer = dhtmlspecialchars($referer);
这里dhtmlspecialchars方法是对我们传入的referer的值进行关键词过滤,在include/global.func.php中可以同样找到该函数:
核心部分是其中的str_replace进行的字符替换,可以看到主要对&、”、<、>进行替换处理,而对poc中的字符并未进行过滤
在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最终在页面展示。