简要描述
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) {
$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漏洞