### 简要描述: XDcms企业网站管理系统是一套完全开源的通用的内容管理系统。主要使用php+mysql+smarty技术基础进行开发,XDcms采用OOP(面向对象)方式进行基础运行框架搭建。模块化开发方式做为功能开发形式。框架易于功能扩展,代码维护,二次开发能力优秀。 XDcms开发团队具有多年网站开发经验,经过几年时间的沉淀,让我们更懂您的需求。 系统特点: 内容管理模型,自定义字段,更方便扩展功能。自带模型:单页模型、新闻模型、产品模型、招聘模型 栏目自定义,便于内容管理 模板管理,后台编辑模板更方便 邮件发送,表单留言自动发送邮件到邮箱 数据缓存,访问速度更快 会员自定义模型、字段 结合Smarty开发的万能loop标签,数据调用更简单、更方便 内容模块化,二次开发更便捷。自带模块:幻灯片、QQ客服、友情链接、自定义表单(在线留言、简历管理) 后台菜单智能管理,所有后台可添加、删除 ### 详细说明: fun.inc.php ``` function safe_html($str){ if(empty($str)){return;} $str=preg_replace('/select|insert | update | and | in | on | left | joins | delete |\%|\=|\/\*|\*|\.\.\/|\.\/| union | from | where | group | into |load_file |outfile/','',$str); return htmlspecialchars($str); } 注入文件member/index.php public function register_save(){ $username=safe_html($_POST['username']); $password=$_POST['password']; $password2=$_POST['password2']; $fields=$_POST['fields']; if(empty($username)||empty($password2)||empty($password)){ showmsg(C('material_not_complete'),'-1'); }...
### 简要描述: XDcms企业网站管理系统是一套完全开源的通用的内容管理系统。主要使用php+mysql+smarty技术基础进行开发,XDcms采用OOP(面向对象)方式进行基础运行框架搭建。模块化开发方式做为功能开发形式。框架易于功能扩展,代码维护,二次开发能力优秀。 XDcms开发团队具有多年网站开发经验,经过几年时间的沉淀,让我们更懂您的需求。 系统特点: 内容管理模型,自定义字段,更方便扩展功能。自带模型:单页模型、新闻模型、产品模型、招聘模型 栏目自定义,便于内容管理 模板管理,后台编辑模板更方便 邮件发送,表单留言自动发送邮件到邮箱 数据缓存,访问速度更快 会员自定义模型、字段 结合Smarty开发的万能loop标签,数据调用更简单、更方便 内容模块化,二次开发更便捷。自带模块:幻灯片、QQ客服、友情链接、自定义表单(在线留言、简历管理) 后台菜单智能管理,所有后台可添加、删除 ### 详细说明: fun.inc.php ``` function safe_html($str){ if(empty($str)){return;} $str=preg_replace('/select|insert | update | and | in | on | left | joins | delete |\%|\=|\/\*|\*|\.\.\/|\.\/| union | from | where | group | into |load_file |outfile/','',$str); return htmlspecialchars($str); } 注入文件member/index.php public function register_save(){ $username=safe_html($_POST['username']); $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'");//判断会员是否存在 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'");//插入主要字段——用户名、密码 $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}'"; } $field_sql=substr($field_sql,1); $query=$this->mysql->query($field_sql); showmsg(C('register_success'),'index.php?m=member&f=register'); } ``` $fields没有过滤。 ``` foreach($fields as $k=>$v){ $f_value=$v; if(is_array($v)){ $f_value=implode(',',$v); } $field_sql.=",`{$k}`='{$f_value}'"; } $field_sql=substr($field_sql,1); $query=$this->mysql->query($field_sql); ``` 重组sql语句。带入查询。 找到注册页面 输入用户密码 在姓名或者邮箱填写注入代码即可。 写了个软件测试下,有些版权敏感的就涂了 [<img src="https://images.seebug.org/upload/201503/15025132676395c6a7fb36d099d911e8176293df.jpg" alt="360截图20150315025029769.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201503/15025132676395c6a7fb36d099d911e8176293df.jpg) ### 漏洞证明: fun.inc.php ``` function safe_html($str){ if(empty($str)){return;} $str=preg_replace('/select|insert | update | and | in | on | left | joins | delete |\%|\=|\/\*|\*|\.\.\/|\.\/| union | from | where | group | into |load_file |outfile/','',$str); return htmlspecialchars($str); } 注入文件member/index.php public function register_save(){ $username=safe_html($_POST['username']); $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'");//判断会员是否存在 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'");//插入主要字段——用户名、密码 $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}'"; } $field_sql=substr($field_sql,1); $query=$this->mysql->query($field_sql); showmsg(C('register_success'),'index.php?m=member&f=register'); } ``` $fields没有过滤。 ``` foreach($fields as $k=>$v){ $f_value=$v; if(is_array($v)){ $f_value=implode(',',$v); } $field_sql.=",`{$k}`='{$f_value}'"; } $field_sql=substr($field_sql,1); $query=$this->mysql->query($field_sql); ``` 重组sql语句。带入查询。 找到注册页面 输入用户密码 在姓名或者邮箱填写注入代码即可。 写了个软件测试下,有些版权敏感的就涂了 [<img src="https://images.seebug.org/upload/201503/15025132676395c6a7fb36d099d911e8176293df.jpg" alt="360截图20150315025029769.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201503/15025132676395c6a7fb36d099d911e8176293df.jpg)