【原创】PageAdminCMS 前台SQL注入漏洞(2)
之前根据公司的要求找了几个web程序的漏洞提交CNVVD,发现漏洞提交上去两个月了,CNVVD却没有任何回应,我提交的这几个漏洞却悄悄的修补掉了。
文章作者:rebeyond
受影响版本:V3.0
漏洞说明:
PageAdmin网站管理系统(CMS)是.NET开发的一款支持多分站、多语种,集成内容发布、信息发布、自定义表单、自定义模型、会员系统、业务管理等功能于一体的独立网站管理系统,支持Access和MSSQL Server数据库。用户可以下载安装使用,系统于2008年正式发布,目前全国用户已经超过50万以上,被广泛用于全国各级政府、学校和企业的网站搭建,具有以下特点: 1、简单易用、强大灵活;2、高负载功能;3、样式和内容分离;4、周密的安全策略和攻击防护。
该系统的留言模块对用户提交的参数没有进行充分的过滤,导致SQL注入。可直接获取数据库数据,如果采用的是MSSQL Server数据库,则有可能直接获取数据库服务器系统权限。
漏洞分析:
PageAdmin的逻辑代码混合存在于aspx页面、aspx.cs文件,以及dll文件中,dll文件中的代码对属性和方法名称、程序流程进行了混淆处理。程序通过IsStr和IsNum两个自定义函数对用户的请求数据进行过滤。
系统在整个程序流程中对当前登录用户名的获取都是通过数据库查询获得的,但是在用户留言模块,把用户名从数据库取出之后,并没有直接使用,而是放到了留言表单的一个隐藏字段中,提交留言的时候,会从该隐藏字段读取用户名,并带入数据库,从而导致SQL注入。
private void Check_IsMember() { if(Request.Cookies["Member"]==null) { P2.Visible=true; } else { Member_Valicate Member=new Member_Valicate(); Member.Member_Check(); //此处从数据库中读取用户名 Current_LoginName=Member._UserName; Lb_CurrentLoginName.Text=Current_LoginName; //此处把读取到的用户名放到了一个表单控件中 P1.Visible=true; //把该表单控件设置为隐藏状态 } }
程序在下面的代码中带入数据库中:
private void Post_Fbk() { string Fbk_Content=Request.Form["fb_content"]; if(Fbk_Content.Trim()=="") { conn.Close(); Response.Write("<script type='text/javascript'>alert('留言内容不能为空!');location.href=location.href</script>"); Response.End(); } else { Fbk_Content=ResplayJs(Fbk_Content); Current_LoginName=Request.Form["Current_LoginName"]; //此处从隐藏表单中取用户名 sql="insert into pa_spcfbk(space_owner,fbk_username,feedback,reply) values('"+UserName+"','"+Current_LoginName+"','"+Sql_Format(Fbk_Content)+"','')"; //把用户名带入数据库,没有经过任何过滤。 OleDbCommand Comm=new OleDbCommand(sql,conn); Comm.ExecuteNonQuery(); conn.Close(); Response.Write("<script type='text/javascript'>alert('提交成功!');location.href=location.href</script>"); Response.End(); } }
漏洞利用:
1、 注册用户并登录。url:http://xx.xx/e/member/index.aspx?type=login&s=1
2、 登录之后,访问我的空间:
3、 点击“给我留言”:
4、 随便填写留言内容,点击提交,然后抓包修改Current_LoginName内容:
6、 返回如下内容,成功注入: