pageadmin前台getshell 含漏洞利用工具

漏洞分析

<% @ Page language="c#" Inherits="PageAdmin.uploads"%><!DOCTYPE html
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进非安全操作所以导致拼接跳目录并且自定义文件名


链接: https://pan.baidu.com/s/1awwfuWXuQKY-aEhm8igA5A 密码: jnmw

  原文链接:http://www.5kik.com/asp0day/652.html

相关文章

曾志伟
曾志伟
发布于 2018-11-11 16:20:13  回复
大佬,群问软件利用工具获取的webSHELL地址的webSHELL的密码是多少呢?webSHELL的密码是多少呢?

发表评论:

验证码

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。