再次代码审计之Semcms(bypass sqli)

前言:由于漏洞重复了,因此提前公布漏洞详情,挖的几个漏洞都是高危漏洞,后台没有看,同时存在一个后台登录的cookie绕过,这里可看前面文章:代码审计之Semcms v2.3

一、cms简介

SemCms是一套开源外贸企业网站管理系统,主要用于外贸企业,兼容IE、Firefox 、google、360 等主流浏览器。

SemCms【asp版】使用vbscript语言编写,结合iis运行。

SemCms【php版】使用php语言编写,结合apache,在window,或linux系统下运行。

SemCms采用国际通用utf-8编码编写。

SemCms非常适合在外贸企业,电子商务互联网应用上使用,2009年12月首次发布以来,SemCms依靠出色的用户体验和领先的技术不断扩大外贸场占有率,目前在国内已经成为最受欢迎的英文外贸网站之一。

官网地址:http://www.sem-cms.com/

Demo地址:http://php.sem-cms.com

这里测试为semcms外贸网站php版 v2.3

二、漏洞详情
  1. 多个sql注入漏洞

①id参数

存在漏洞的url:http://127.0.0.1/view.php?ID=31

漏洞成因在Templete/default/Include/Function.php的第9行

$ID=verify_id(@htmlspecialchars($_GET[“ID”]));

if (!isset($ID)){$ID=$ID;}else{$ID==””;}

这里使用了htmlspecialchars函数,但是对于注入来说并不起作用,但是前面又用到了verify_id这个函数,下面跟进这个函数

函数位置为Include/general_function.php的第73行开始

function inject_check($sql_str) { // 防sql入注

return preg_match(‘/select|insert|=|<|update|delete|’|/*|*|../|./|union|into|load_file|outfile/i’, $sql_str);

}

function verify_id($ID) {

if(inject_check($ID)) {

exit(‘Sorry,You do this is wrong!’);

}

return $ID;

}

这里好像都进行了过滤,最后我们来看是如何在数据库中查询ID这个参数的(Include/Function的第551行开始)

function proview($ID,$ziduan,$web_url){

$str2=””;

$query=mysql_query(“select * from sc_products where ID =$ID “);

Panduan(mysql_num_rows($query));

……

}

function Panduan($str){  //判断数据,输出空符

if ($str<1){

echo ‘<p><b>Sorry, no related products!</b></p>’;

}

}

可以看到这里的ID参数不需要单引号进行过滤,因此也就导致了sql语句的绕过!

下面给出脚本

下图是脚本测试图:

图片[1]-再次代码审计之Semcms(bypass sqli)-安全小百科

②Email参数

这里的Email参数是管理员密码忘记时填写的参数,漏洞成因在Include/web_email.php的第16行

if ($Type==”fintpassword”){

if (@htmlspecialchars($_POST[‘Email’]) !==””){ // 判断是否输入邮箱

$sql=”select * from sc_user where user_email='”.$_POST[‘Email’].”‘”;

$result=mysql_query($sql);

……

}}

这里可以看到post提交的Email参数只经过htmlspecialchars函数的过滤,因此出现了sql注入漏洞。

这里借助sqlmap验证:

图片[2]-再次代码审计之Semcms(bypass sqli)-安全小百科

  1. xss漏洞

漏洞成因在Include/web_email.php第71行

elseif ($Type==”MSG”){ //询盘发送!

$msg_email=@htmlspecialchars($_POST[‘mail’]);

$msg_content=@htmlspecialchars($_POST[‘tent’]);

$yzm=$_POST[‘yzm’];

$msg_tel=$_POST[‘tel’];

$names=@htmlspecialchars($_POST[‘name’]);

$msg_pid=@htmlspecialchars($_POST[‘PID’]);

$msg_languageID=@htmlspecialchars($_POST[‘languageID’]);

$msg_time=date(“Y-m-d h:i:s”,time()+8*60*60);

$msg_ip=getRealIp();

可以看到这里的tel参数没有经过过滤,并且最后有一个getRealIp函数。

这里首先测试tel参数,来验证存储型xss漏洞是否存在!

下面是post参数,其中tel插入xss语句

name=adog&mail=adog%40qq.com&tel=%3Cscript%3Ealert%28%2Fadog%2F%29%3C%2Fscript%3E&tent=this+is+a+test%7E&yzm=0953&button=Inquiry+now&PID=25&languageID=1

图片[3]-再次代码审计之Semcms(bypass sqli)-安全小百科

后台登录,查看用户询盘信息,出现弹窗,验证了xss漏洞存在

下面跟进getRealIp参数,来看看有无验证(Include/general_function.php的第53行)

function getRealIp()

{

$ip=false;

if(!empty($_SERVER[“HTTP_CLIENT_IP”])){

$ip = $_SERVER[“HTTP_CLIENT_IP”];

}

if (!empty($_SERVER[‘HTTP_X_FORWARDED_FOR’])) {

$ips = explode (“, “, $_SERVER[‘HTTP_X_FORWARDED_FOR’]);

if ($ip) { array_unshift($ips, $ip); $ip = FALSE; }

for ($i = 0; $i < count($ips); $i++) {

if (!eregi (“^(10│172.16│192.168).”, $ips[$i])) {

$ip = $ips[$i];

break;

}

}

}

return ($ip ? $ip : $_SERVER[‘REMOTE_ADDR’]);

}

可以看到直接从X_FORWARDED_FOR中提取ip,因此导致了一个xss漏洞

图片[4]-再次代码审计之Semcms(bypass sqli)-安全小百科

后台登录查看询盘信息

图片[5]-再次代码审计之Semcms(bypass sqli)-安全小百科

验证了存储型xss漏洞的存在

三、影响范围

根据自己挖这个cms的一个经验来看,这个semcms的厂商是不对漏洞进行修补的(不知道这是白帽子的福音还是噩耗),cookie绕过漏洞早在v2.1版本就存在了,因此可以判断这些漏洞在上几个版本也一定存在,只要用心挖,总能挖到的~

上述如有不当之处,敬请指出~

相关推荐: Mysql实时监控脚本

由于换了Mac,因此原来windows下的mysql监控小软件不能再用,只能自己造个轮子,下午抽空写了个监控脚本,代码不是很复杂,供有需要的人阅读参考,也可以根据下面再做定制 环境(Python 2.7) #-*-coding:utf-8-*- import …

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论