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

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

缺陷编号:wooyun-2013-047464

漏洞标题:DTcmsV2.1 access版本 feedback插件存在xss漏洞

相关厂商:DTcms

漏洞作者: what_news

提交时间:2013-12-31 12:48

修复时间:2014-03-31 12:49

公开时间:2014-03-31 12:49

漏洞类型:xss跨站脚本攻击

危害等级:低

自评Rank:5

漏洞状态:未联系到厂商或者厂商积极忽略

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-12-31: 积极联系厂商并且等待厂商认领中,细节不对外公开
2014-03-31: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

该cms未对留言反馈部分用户的输入进行处理,用户输入的信息直接插入到数据库中,再读出留言反馈信息又未对数据直接显示 使得存在xss漏洞威胁

详细说明:

通过Reflector5反编译,查看代码 我们先看源码目录下 DTcms.Web =>aspx =>feedback.aspx
这页面 ,主要代码如下

StringBuilder builder = new StringBuilder();
feedback feedback = new feedback();
feedback model = new feedback();
string formString = DTRequest.GetFormString("txtCode");
string str2 = DTRequest.GetFormString("txtTitle");
string str3 = DTRequest.GetFormString("txtContent");
string str4 = DTRequest.GetFormString("txtUserName");
string str5 = DTRequest.GetFormString("txtUserTel");
string str6 = DTRequest.GetFormString("txtUserQQ");
string str7 = DTRequest.GetFormString("txtUserEmail");
中间省略一些代码
....
model.title = str2;
model.content = Utils.ToHtml(str3);
model.user_name = str4;
model.user_tel = str5;
model.user_qq = str6;
model.user_email = str7;
model.add_time = DateTime.Now;
model.is_lock = 1;
if (feedback.Add(model) > 0)
{
context.Response.Write("{msg: 1, msgbox: \"恭喜您,留言提交成功啦!\"}");
}


然后我们看下GetFormString函数是怎么处理输入的数据

public static string GetFormString(string strName, bool sqlSafeCheck)
{
if (HttpContext.Current.Request.Form[strName] == null)
{
return "";
}
if (!(!sqlSafeCheck || Utils.IsSafeSqlString(HttpContext.Current.Request.Form[strName])))
{
return "unsafe string";
}
return HttpContext.Current.Request.Form[strName];
}


在跟进看下 IsSafeSqlString函数

public static bool IsSafeSqlString(string str)
{
return !Regex.IsMatch(str, @"[-|;|,|\/|\(|\)|\[|\]|\}|\{|%|@|\*|!|\']");
}


可以看出 没对用户输入进行xss检测,所以用户提交的数据直接插入到数据库
我们在看下 读出留言反馈数据的代码 在源码目录下的 DTcms.Web=>pluginsfeedback=>admin=>index.aspx 页面 主要代码如下

protected void Page_Load(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(base.Request.Params["keywords"]))
{
this.keywords = base.Request.Params["keywords"].Trim();
}
this.pageSize = this.GetPageSize(15);
if (!this.Page.IsPostBack)
{
this.RptBind("id>0" + this.CombSqlTxt(this.keywords), "is_lock desc,add_time desc");
}
}


在看下PptBind函数

if (!int.TryParse(base.Request.QueryString["page"], out this.page))
{
this.page = 1;
}
this.txtKeywords.Text = this.keywords;
this.rptList.DataSource = new feedback().GetList(this.pageSize, this.page, _strWhere, _orderby, out this.totalCount);
this.rptList.DataBind();
this.txtPageNum.Text = this.pageSize.ToString();
string linkUrl = Utils.CombUrlTxt("index.aspx", "keywords={0}&page={1}", new string[] { this.keywords, "__id__" });
this.PageContent.InnerHtml = Utils.OutPageList(this.pageSize, this.page, this.totalCount, linkUrl, 8);


其中getlist就是直接select出留言反馈的信息,然后通过控件databine绑定数据源 并没有对读出来的数据进行处理

漏洞证明:

首先 我们看下feedback.aspx 提交测试数据 如图

QQ截图20131230224610.png


然后进入后台 确保freeback插件已经安装

QQ截图20131230224830.png


接着访问插件主页

QQ截图20131230224714.png


修复方案:

在数据进行html处理

model.title = Utils.ToHtml(str2);
model.content = Utils.ToHtml(str3);
model.user_name =Utils.ToHtml(str4);
model.user_tel =Utils.ToHtml(str5);
model.user_qq = Utils.ToHtml(str6);
model.user_email = Utils.ToHtml(str7);

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


漏洞回应

厂商回应:

未能联系到厂商或者厂商积极拒绝