会飞的鱼

Pageadmin前台Getshell漏洞

漏洞分析

<% @ Page language="c#" Inherits="PageAdmin.uploads"%> PUBLIC "-//W3C//DTD XHTML 1.0 Transi?onal//EN" "h?p://www.w3.org/TR/
xhtml1/DTD/xhtml1-transi?onal.dtd">


在uploads文件发现真实代码在pageadmin的dll uploads函数内,因为dll加过壳所以经过dnspy反编译出来的代码存在部分混淆但能够看处代码的一个大概。

if (flag = !(base.Request.Form["from"] == "master"))
{
this.IsMaster = 0;
}
else
{
this.IsMaster = 1;
}


首先要说的一处,当前文件没有经过自写的权限函数来验证⽽是经过表单的值来验
证。

this.uSIydhZwho = base.Request.Form["username"];
this.INBy9bX9ky = "select id,m_group,department_id,mtype_id from
pa_member where username='" + string_0 + "'";


经过提交的username来查询数据库判别是否具备权限。

if (!(flag = !(base.Request.Form["swf_upload"] == "1")))
{
this.GpKyCIZ7AD = true;
}
else
{
this.GpKyCIZ7AD = false;
}


swf_upload变量则是操控上传当值非1时则不进⾏上传
pageadmin的上传是经过查询数据库得到上传允许后缀来进⾏验证后上传可是在
pageadmin后还有一处后缀验证(黑名单效验)

if (".aspx,.asp,.php,.asa,.jsp,.shtml".IndexOf(text2) >= 0)
{
goto IL_3E2;
}


一旦绕过一层的逻辑效验,第⼆层的⿊名单就很简略,可经过ashx或cer等后缀来进⾏绕过。目前已知有某⼤佬给绕过但我⽬前还未看出具体方法⽽且数据库的后缀均在pa_field表内,经过咱们自定义的table参数以及field参数来查询。

this.INBy9bX9ky = string.Concat(new string[]
{
"select file_ext,maxfilesize from pa_field where thetable='",
this.fiSy6J8Imb,
"' and [field]='",
this.Field,
"'"
});


然后将相应的内容赋值于相对的变量。

oleDbCommand = new OleDbCommand(this.INBy9bX9ky, this.iQTyesi17e);
oleDbDataReader = oleDbCommand.ExecuteReader();
flag = !oleDbDataReader.Read();
IL_201:
if (!flag)
{
this.C2OyO9cgFk = oleDbDataReader["file_ext"].ToString().ToLower();
if (!(flag = !this.q29BFUIJsS(oleDbDataReader["maxfilesize"].ToString())))
{
this.dpnyXl6327 =
int.Parse(oleDbDataReader["maxfilesize"].ToString());
}
else
{
this.dpnyXl6327 = 0;
}


其次是最要害的一参数rename,操控文件是否重命名,也是此次缝隙最为要害一点。

if (base.Request.Form["rename"] == "1")
{
text4 = DateTime.Now.ToString("ddHHmmss");
if (this.GpKyCIZ7AD &&
base.Request.Form["access2008_box_info_over"] != "0")
{
text4 = text4 + "_" +
base.Request.Form["access2008_box_info_over"];
}
text4 += text2;
}
else
{
string text = text.Replace(";", "_").Replace(".", "_").Replace(" ", "_");
text4 = text + text2;
}


当然rename为1时则经过时刻来命名再拼接了⼀处⾃定义的变量(也就是咱们可控
点),当⾮1时则不进⾏重命名但⽆论为1或不为1都对点号 分号 空格进⾏了替换。
首要针对跳目录等非安全操作。

extract_file.aspx
protected void Extract_File()
{
string DownPath=Request.QueryString["filepath"];
if(string.IsNullOrEmpty(DownPath))
{
Response.Write("获取⽂件途径失败!");
Response.End();
}
string RootPath,File_Name;
RootPath="/e/update/file/";
char[] de={'/'};
string[] Afilename=DownPath.Split(de);
File_Name=Afilename[Afilename.Length-1].ToLower();
string FilePath=RootPath+File_Name;
6
FilePath=FilePath.Replace("..","");
string DirPath=FilePath.Replace(".zip","").Replace(".rar","");
if(!File.Exists(Server.MapPath(FilePath)))
{
Response.Write("升级⽂件不存在,请到/e/update/file下检查⽂件是否下载成
功!");
Response.End();
}
try
{
Decompress(Server.MapPath(FilePath),Server.MapPath(DirPath+"/"));


经过filepath操控⽂件所在然后exists检测⽂件是否存在当为压缩包时则经过
Decompress进行解压。


这就是咱们最为要害的⼀处缝隙合作点,但这⾥限制死了⽬录为update/file目录下才
⾏。虽然咱们upload文件中有对上传⽂件名进⾏点号等下进⾏了安全操作可是未对
access2008_box_info_over进非安全操作所以导致拼接跳目录并且自定义文件名。


附上刚才Getshell的图片


QQ截图20190207210133.jpg


×

感谢您的支持,我们会一直保持!

扫码支持
请土豪扫码随意打赏

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在


版权所有,转载注意明处:XISE菜刀官方 » Pageadmin前台Getshell漏洞
版权所有:《XISE菜刀官方
文章标题:《Pageadmin前台Getshell漏洞
除非注明,文章均为 《XISE菜刀官方》 原创
转载请注明本文短网址:http://www.xisewbms.cn/?post=15  [生成短网址]

发表评论

表情
看不清楚?点图切换

网友评论(2)

xise菜刀什么时候更新好?
F4 9个月前 (2019-02-09) 回复
@F4:耐心等待。
XISE菜刀官方 9个月前 (2019-02-09) 回复