\xeb\xfe's Blog.

Discuz!7.2/X1 第三方心情墙插件SQL注入及持久型XSS漏洞

2017/12/07

简要描述

Discuz!7.2/X1 第三方插件SQL注入及持久型XSS漏洞。
SQL注入比较鸡肋,要求GPC为off,XSS因为是持久型的,只要管理员打开此应用即会触发。

第三方的心情墙插件,因变量未初始化及过滤不严导致SQL注入及跨站脚本漏洞。

SQL漏洞代码图片(moodwall.inc.php)

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
elseif($action == 'edit_mood' && moodid) {

//moodid未初始化,直接代入sql查询

$check = $db->result_first("SELECT * FROM {$tablepre}moodwall WHERE id='$moodid' AND uid='$discuz_uid'");



if(!$check || !$moodid) {

showmessage('moodwall:moodwall_inc_php_2', 'plugin.php?id=moodwall&action=user_mood');

}

$sql = "SELECT * FROM {$tablepre}moodwall WHERE id='$moodid'";

$query = $db->query($sql);

$moodlist_edit = array();

while($mood_edit = $db->fetch_array($query)) {

$moodlist_edit[] = $mood_edit;

}

moodid未经过初始化,直接代入sql查询,可以直接输入1’,使SQL报错,判断该参数存在SQL注入,然后开始构造payload。
example:

1
/plugin.php?id=moodwall&action=edit_mood&moodid=1'

代码修复方法

对用户输入的数据进行过滤,或者使用PDO连接并做参数绑定

XSS漏洞代码图片(moodwall.inc.php)

1
2
3
4
5
6
7
$uid=$_POST[uid];
$username=$_POST[username];
$bgpic=$_POST[bgpic];
$mood=$_POST[mood];
$message=$_POST[message];
$dateline=time();
$db->query((INSERT INTO {$tablepre}moodwall (uid,username, bgpic, mood, message, dateline) VALUES ('$uid', '$username', '$bgpic', '$mood', '$message', '$dateline')));

POST的代码直接传入数据库,前端出库代码也没做过滤,因此存在存储型XSS
example:
在发表心情处,直接传入

1
"><script>alert(/xss/)</script>

代码修复方法

使用addslashes、htmlspecialchars对用户post过来的数据进行过滤或者过滤数据中的特殊字符,输出时也对数据库出库数据进行过滤

原文链接:Discuz!7.2/X1 第三方心情墙插件SQL注入及持久型XSS漏洞

CATALOG
  1. 1. 简要描述
  2. 2. SQL漏洞代码图片(moodwall.inc.php)
  3. 3. 代码修复方法
  4. 4. XSS漏洞代码图片(moodwall.inc.php)
  5. 5. 代码修复方法