제목 : DotNet Code Audit Series (I)

taibeihacker

Moderator

dotnet代码审计系列(一)​

1. 概述​

1.1. 背景​

.NET Framework는 주로 Windows 애플리케이션을 빌드하고 실행하는 데 사용되는 Microsoft에서 개발 한 관리 코드 프레임 워크입니다. 수많은 클래스 라이브러리, CLR (Common Language Runtime) 및 응용 프로그램 개발 및 관리 도구를 제공합니다.NET 프레임 워크를 사용하여 개발 된 응용 프로그램은 일반적으로 C#, vb.net, F# 및 기타 언어로 작성됩니다. 편집 후 중간 언어 (IL)를 생성 한 다음 CLR에 의해 실행됩니다.
.NET 프레임 워크의 중요한 기능에는 다음이 포함됩니다.
跨语言互操作性: 다른 프로그래밍 언어로 작성된 구성 요소는 모두 IL로 컴파일하고 CLR로 실행되기 때문에 완벽하게 협력 할 수 있습니다.
内存管理: 가비지 수집기를 통해 메모리를 자동으로 관리하여 메모리 누출 및 기타 메모리 관련 보안 문제를 줄입니다.
安全模型:NET 프레임 워크는 코드 액세스 보안 (CAS) 및 검증 메커니즘을 제공하여 코드의 권한 및 실행을 제어합니다.
엔터프라이즈 애플리케이션에서 .NET 프레임 워크는 웹 응용 프로그램, 데스크탑 응용 프로그램 및 서비스 개발에 널리 사용됩니다. 올해의 National HW에서 많은 응용 프로그램이 여전히 .NET 프레임 워크를 사용합니다. 광범위한 사용과 응용 프로그램의 복잡성으로 인해 .NET 애플리케이션은 공격자가 쉽게 타겟팅 할 수 있습니다. 현재 .NET 프레임 워크 코드 감사를위한 시장에 대한 정보가 적 으므로이 기사를 요약하겠습니다.

1.2. .NET Framework与.NET Core的区别​

.NET 및 .NET Core는 Microsoft가 개발 한 두 가지 다른 개발 프레임 워크이며 다음과 같은 차이점이 있습니다.

平台支持​

.NET Framework (.NET): Windows 운영 체제에서만 실행되는 지원. Windows 데스크탑 응용 프로그램, ASP.NET 웹 응용 프로그램 등을 개발하는 데 적합합니다.
.NET Core:은 Windows, Linux 및 MacOS에서 실행할 수있는 크로스 플랫폼 프레임 워크입니다. 따라서 크로스 플랫폼 배포가 필요한 응용 프로그램에 더 적합합니다.

开源与社区支持​

.NET Framework: 완전히 오픈 소스는 아니며 일부 구성 요소는 오픈 소스이지만 전체 프레임 워크는 여전히 Microsoft에 의해 유지되고 제어됩니다.
.NET Core:은 완전히 오픈 소스이며 활발한 오픈 소스 커뮤니티가 있습니다. 개발자는 소스 코드에 액세스하여 기여할 수 있습니다.
요컨대,NET Core는 현대적인 응용 프로그램의 개발 요구에 더 적합한보다 현대적인 크로스 플랫폼, 모듈 식 프레임 워크입니다.NET 프레임 워크는 주로 기존 Windows 응용 프로그램의 유지 보수 및 지속적인 개발에 사용됩니다.NET 5+가 출시되면서 Microsoft는 .NET Core를 미래의 주요 개발 방향으로 채택하고 전체 .NET Ecosystem을 통합했습니다.

2. .NET Web 项目​

현재 ASP.NET의 3 가지 주류 개발 방법은 ASP.NET WebForm, ASP.NET MVC 및 ASP.NET Core입니다.
설명하기 위해 공식적인 그림을 찍으십시오.
202408301005044.png-water_print

2.1. WebForm开发模式​

전체 프로세스를 설명하는 고전적인 그림 :
202408301006193.png-water_print

ASPX 페이지는 코드가 일반적으로 일부 HTML 코드임을 보여줍니다. 파일 헤더의 첫 번째 줄은 특정 트리거링 기능 코드를 표시 하므로이 위치를 통해 처리 기능을 찾을 수 있습니다. 서버 측 작업은 ASPX.CS 파일에 정의됩니다
.CS는 공개 클래스를 저장하는 클래스 파일입니다.
.ASHX는 주로 웹 처리기를 작성하는 데 사용되는 일반적인 핸들러이며, 표시되지 않는 ASPX 페이지로 이해 될 수 있지만 더 효율적입니다.
DLL은 컴파일 된 CS 파일입니다.
WebGoat.net 촬영 범위를 예로 들어보십시오.
202408301006147.png-water_print

첫 번째 줄의 의미 :
언어 : 현재 사용되는 언어를 나타내며 C#을 위해 개발되었습니다.
AutoeventWireUP : ASP.NET이 페이지 이벤트 (예 : Page_Load)를 페이지에 자동으로 바인딩하는지 여부를 나타내는 이벤트 처리 방법. True는 자동 바인딩을 나타냅니다. 즉, 페이지에 page_load라는 메소드가 있으면 페이지의로드 이벤트가 자동으로 처리됩니다.
CodeBehind : 속성은 페이지와 관련된 Code-Behind 파일의 경로를 지정합니다. 위의 이미지에서 loginpage.aspx.cs는 페이지의 논리를 정의하는 배경 코드를 포함하는 파일입니다. 일부 새로운 ASP.NET 프로젝트에서 CodeBehind는 특히 웹 응용 프로그램 프로젝트에서 CodeFile로 대체 될 수 있습니다.
상속 : 페이지에서 상속 된 클래스를 지정합니다. 이 페이지는 OWASP.webgoat.net.loginpage 클래스에서 상속되며 일반적으로 loginpage.aspx.cs 파일에 정의됩니다.
디렉토리 구조 :
1
2
3
4
5
APP_CODE: 스토어 클래스, 인터페이스 등과 같은 공유 코드 파일.이 파일은 응용 프로그램 전체에서 액세스 할 수 있습니다.
APP_DATA: 응용 프로그램의 데이터베이스 파일 또는 기타 데이터 파일을 저장합니다. 이 디렉토리는 외부 사용자가 액세스 할 수 없습니다.
BIN:은 컴파일 된 어셈블리 (DLL 파일) 및 종속성을 저장합니다. 이 디렉토리는 자동으로 생성됩니다.
Resources: 특정 페이지와 관련된 리소스 파일을 저장합니다.
web.config: 응용 프로그램 구성 파일은 응용 프로그램 설정, 연결 문자열, 라우팅 등을 정의하는 데 사용됩니다.

2.2. MVC 开发模式​

ASP.NET MVC는 MVC 모델을 기반으로하는 웹 개발 프레임 워크로, 문제 분리 (문제 분리), 즉 비즈니스 로직, 사용자 인터페이스 및 입력 제어를 분리하는 데 중점을 둡니다. 특정 프레젠테이션 모드는 Java와 유사하므로 여기에서 자세히 설명하지 않습니다.
디렉토리 구조 :
1
2
3
4
5
6
7
8
9
컨트롤러 :에는 컨트롤러 클래스 파일이 포함되어 있습니다. 컨트롤러는 사용자 입력 처리, 모델 작동 및보기로 돌아가는 일을 담당합니다.
Models: 응용 프로그램의 데이터 구조 및 비즈니스 로직을 정의하는 응용 프로그램의 모델 클래스를 저장합니다.
Views:에는 사용자 인터페이스를 렌더링하기위한 View Files (.cshtml 또는 .vbhtml)가 포함되어 있습니다. 일반적으로 각 컨트롤러에는 해당 뷰 폴더가 있습니다.
Scripts:은 JavaScript 파일을 저장합니다.
APP_START: ROUNECONFIG.CS, BUNDLECONFIG.CS, FILTERCONFIG.CS 등과 같은 시작 구성 파일이 포함되어 있습니다.
APP_DATA: 응용 프로그램의 데이터베이스 파일 또는 기타 데이터 파일을 저장합니다.
BIN:은 컴파일 된 어셈블리 (DLL 파일) 및 종속성을 저장합니다.
Global.asax: 응용 프로그램 수준 이벤트를 처리하는 응용 프로그램의 글로벌 구성 파일입니다.
web.config: 응용 프로그램의 구성 파일입니다.

2.3. ASP.NET Core Razor Pages​

ASP.NET Core는 최신 웹 애플리케이션, 클라우드 애플리케이션 및 마이크로 서비스를 구축하기위한 크로스 플랫폼, 고성능 오픈 소스 프레임 워크입니다. ASP.NET MVC 및 Web API를 더 나은 성능과 유연성과 통합합니다. 웹 양식과 같은 개발 경험은 면도기 페이지를 통해 제공되지만 가볍습니다. 각 페이지는 면도기 파일 (.cshtml)과 코드-비만 파일 (.cshtml.cs)으로 구성되며 페이지 로직은보기와 밀접하게 통합됩니다. MVC의 복잡성을 라우팅하지 않으면 소규모 페이지 카운트가있는 응용 프로그램, 소규모 프로젝트 또는 단일 페이지 응용 프로그램 및 페이지 개발을 단순화하려는 시나리오에 적합합니다.
디렉토리 구조 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
컨트롤러 :에는 컨트롤러 클래스 파일이 포함되어 있습니다. 컨트롤러는 요청을 처리하고 일반적으로 API 스타일 또는 MVC 모드를 사용하여 응답을 반환합니다.
Models:에는 응용 프로그램의 데이터 구조 및 비즈니스 로직을 정의하는 모델 클래스가 포함되어 있습니다.
Views:에는 사용자 인터페이스를 렌더링하기위한보기 파일 (.cshtml)이 포함되어 있습니다.
Shared:에는 레이아웃 파일 _layout.cshtml과 같은 공유 뷰가 포함되어 있습니다.
Pages:은 페이지 파일 (.cshtml) 및 페이지 모델 파일 (.cshtml.cs)을 포함한 Razor Pages 프로젝트에서 사용됩니다.
WWWROOT:은 정적 파일 (CSS, JavaScript, 이미지 등)을 저장합니다. 이 폴더의 내용은 URL을 통해 직접 액세스 할 수 있습니다.
CSS:은 CSS 파일을 저장합니다.
JS:은 JavaScript 파일을 저장합니다.
LIB:은 NPM 또는 Libman과 같은 패키지 관리자를 통해 설치된 프론트 엔드 라이브러리를 저장합니다.
AppSettings.json: 응용 프로그램 구성 파일은 기존 web.config를 대체합니다.
program.cs: 응용 프로그램의 진입 점, 응용 프로그램을 구성 및 시작합니다.
startup.cs: 응용 프로그램의 서비스 및 요청 파이프 라인을 구성합니다. 미들웨어 구성 및 서비스 종속성 주입이 일반적으로 포함됩니다.
BIN:은 컴파일 된 어셈블리 (DLL 파일) 및 종속성을 저장합니다.
Properties:에는 개발 및 게시 설정을 구성하기위한 LaunchSettings.json과 같은 프로젝트의 속성 파일이 포함되어 있습니다.

3. 反编译工具​

.NET 애플리케이션 개발에서 사전 컴파일은 응용 프로그램 코드를 DLL과 같은 라이브러리 파일로 조기 편집하여 성능을 향상시키고 첫 번째 요청의 시작 시간을 줄이며 코드 보호를 향상시키는 것을 말합니다. 사전 컴파일은 종종 ASP.NET와 같은 웹 애플리케이션에 적용되며, 코드는 서버에 배포되기 전에 사전 컴파일하여 런타임 컴파일을 줄이거 나 제거 할 수 있습니다.
이 상황이 사이트에 존재하면 소스 코드를 얻으려면 /bin 디렉토리에서 DLL 파일을 디 컴파일해야합니다.
.NET 디 컴파일 도구에는 DNSPY (2020 년경에 업데이트), ILSPY, DOTPEEK (JetBrains에서 출시) 및 DNSPYX (비공식 업데이트 버전)의 네 가지 옵션이 있습니다.
다음 수치는 ilspy 디 컴파일의 결과입니다.
202408301007462.png-water_print

ILSPY는 문자열 검색 기능에 매우 친숙하지 않으므로 컴파일 된 소스 코드를 텍스트로 내보낸 다음 감사합니다.
202408301007118.png-water_print

소환 된 코드에 난독 화가있는 경우, antiobfuscation 도구를 사용하여 복원 할 수 있습니다. 많은 방지 방지 도구가 있으며, 그중에는 현재 DE4DOT가 현재 가장 주류 방지 방지 도구입니다.
Oppuscator 유형 감지 :
1
de4dot.exe -d c: \ bin \ demo.dll
배치 방지 방지 :
1
de4dot.exe -r c: \ input -ru -ro c: \ output

4. 常见漏洞​

다음 취약점 코드는 모두 webgoat.net 촬영 범위에 의해 예제로 간주됩니다.

4.1. 文件上传漏洞​

/Webgoat/content/uploadpathmanipulation.aspx.cs
202408301007481.png-water_print

코드의 주요 목적은 사용자가 업로드 한 파일을 서버의 지정된 디렉토리에 저장하고 업로드가 성공적이거나 실패한 경우 사용자에게 해당 메시지를 표시하는 것입니다.
특정 코드 로직은 다음과 같습니다.
页面加载:
page_load 메소드가 비어 있고 아무것도 수행되지 않습니다. 페이지가로드되면 실행할 특정 논리가 없습니다.
文件上传:
btnupload_click 메소드는 버튼 클릭 이벤트의 핸들러이며 사용자가 업로드 버튼을 클릭하면 트리거됩니다.
먼저, 코드는 fileUpload1 컨트롤에 파일이 포함되어 있는지 확인합니다 (즉, fileUpload1.hasfile이 true 인 경우).
파일 업로드가 있으면 코드는 파일 이름을 가져 와서 Server.Mappath를 사용하여 가상 경로를 서버의 물리적 경로로 변환합니다. 그런 다음 파일을 지정된 경로에 저장하려면 fileUpload1.saveas를 호출하십시오.
파일이 성공적으로 업로드되면 프로그램에 labelupload 레이블에 성공 메시지가 표시됩니다.
업로드 중에 예외가 발생하면 예외 정보가 labelupload 태그에 표시됩니다.
마지막으로 Labelupload 태그가 표시되어 있는지 확인하십시오.
일반적인 파일 업로드 취약점 인 파일 형식이 확인되지 않아 공격자가 .aspx 파일을 업로드 할 수 있습니다.
프론트 엔드 코드는 다음과 같습니다.
202408301008141.png-water_print

코드 감사 초점 :
1
2
3
4
Saveas ()
file.move (Sourcepath, DestinationPath);
file.copy (Sourcepath, DestinationPath);
System.io.file.writeallbytes

4.2. RCE 漏洞​

/Webgoat/app_code/util.cs
202408301008328.png-water_print

CMD 매개 변수를 제어 할 수 있으면 시스템 명령을 실행할 수 있습니다.
코드 감사 초점 :
1
2
process.start ()
shellexecute ()

4.3. SQL 注入漏洞​

/Webgoat/content/sqlinject.aspx.cs
202408301008587.png-water_print

GetEmailbyName 메소드에 대한 후속 조치
202408301009997.png-water_print

파라미터 스 플라이 싱은 SQL 주입을 초래하도록 채택된다.
코드 감사 초점 :
1
SQL 명령문 스 플라이 싱

4.4. 任意文件读取/下载​

/Webgoat/content/pathmanipulation.aspx.cs
202408301009483.png-water_print

33 행의 파일 이름은 제어 가능하며 응답 파일 함수를 후속합니다.
202408301009201.png-water_print

파일 경로는 필터링되지 않으며 파일은 직접 읽습니다
파일 스트림 읽기를 HTTP 응답에 기록하여 모든 파일을 읽게합니다.
202408301009338.png-water_print

코드 감사 초점 :
1
2
3
파일 개체의 OpEntext 및 OpenRead 메소드
filemode.open 및 filemode. Filestream 객체의 읽기
response.writefile은 일반적으로 파일 다운로드에 사용됩니다

5. 查找程序入口点​

.NET 웹 프로젝트에서 진입 점은 프로그램이 실행되기 시작하여 응용 프로그램의 초기화 프로세스를 결정합니다. 진입 점은 프로젝트 유형에 따라 다르며 여기에는 일부 공통 .NET 웹 프로젝트 유형 및 입력 지점에 대한 개요가 있습니다.

5.1. ASP.NET Core 项目​

ASP.NET CORE 프로젝트의 진입 점은 일반적으로 Program.cs 파일에 있습니다. 이 파일에는 기본 메소드가 포함되어 있으며,이 방법은 응용 프로그램에 대한 실제 항목입니다.
예:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
공개 수업 프로그램
{
public static void main (String [] args)
{
CreateHostBuilder (args) .build (). run ();
}
public static ihostbuilder createhostbuilder (String [] args)=
host.createdefaultBuilder (Args)
.configureWebHostDefaults (webBuilder=
{
webBuilder.usestartupstartup ();
});
}
Main** 메소드 ** : 응용 프로그램이 여기에서 실행되기 시작합니다. CreateHostBuilder 메소드는 응용 프로그램의 호스트를 작성하고 구성하는 데 사용됩니다.
Startup** 클래스 ** : 시작하는 동안 응용 프로그램 서비스 및 미들웨어를 구성하기 위해 클래스를 지정합니다.

5.2. ASP.NET MVC 项目​

ASP.NET MVC 프로젝트에서 진입 점은 Global.asax.cs 파일, 일반적으로 application_start 메소드에 있습니다.
예:
1
2
3
4
5
6
7
8
9
10
공개 클래스 MVCapplication : System.Web.httPapplication
{
보호 된 void application_start ()
{
arearegistration.registerallareas ();
FilterConfig.registerGloBalfilters (GlobalFilters.Filters);
RouteConfig.registerRoutes (loutetable.routes);
bundleconfig.registerbundles (bundletable.bundles);
}
}
Application_Start** 메소드 ** : 이것은 MVC 응용 프로그램의 진입 점입니다. 응용 프로그램이 시작되면 ASP.NET 은이 메소드를 호출하여 경로, 필터, 번들 등을 구성합니다.

5.3. ASP.NET Web Forms 项目​

ASP.NET 웹 양식 프로젝트의 진입 점도 Global.asax.cs 파일에 있으며 Application_Start 메서드를 사용하여 초기화됩니다.
예:
1
2
3
4
5
6
7
공개 클래스 글로벌 : System.Web.httPapplication
{
보호 된 void application_start (객체 발신자, EventArgs e)
{
//응용 프로그램이 시작될 때 구성 코드
}
}

6. 查找路由​

.NET 웹 프로젝트에서 라우팅은 URL 요청이 특정 컨트롤러 및 운영 방법 (또는 핸들러)에 매핑되는 방법을 정의합니다. 프로그램 입력 지점과 위험한 안전하지 않은 함수를 결정한 후 취약점으로 페이지에 액세스하는 방법은 무엇입니까? 웹 양식 프로젝트는 매우 간단합니다. 해당 xxx.aspx에 직접 액세스하십시오. 다른 아키텍처에서 라우팅 정의를 찾아야합니다.

6.1. ASP.NET Core 项目​

ASP.NET CORE는 startup.cs 파일의 구성 메소드를 사용하여 라우팅을 구성합니다. 일반적으로 다음과 유사한 코드가 표시됩니다.
1
2
3
4
5
6
7
8
9
10
11
public void configure (iapplicationBuilder 앱, ihostingenvironment env)
{
app.userouting ();
app.useendPoints (endPoints=
{
endpoints.mapcontrollerRoute (
이름 : '기본값',
Pattern: '{controller=home}/{action=index}/{id?}');
});
}
여기서 MapControllErroute 메소드는 기본 라우팅 패턴을 정의하여 프로젝트의 모든 경로를보고 정의 할 수 있습니다.

6.2. ASP.NET MVC 项目​

ASP.NET MVC 프로젝트에서 라우팅은 일반적으로 APP_START 폴더에 위치한 RouteConfig.cs 파일에 구성됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
공개 클래스 Routeconfig
{
공개 정적 void RegisterRoutes (RouteCollection Routes)
{
lours.ignorerOute ( '{resource} .axd/{*pathinfo}');
lours.maproute (
이름 : '기본값',
url: '{컨트롤러}/{action}/{id}',
defaults: new {controller='home', action='index', id=urlparameter.o
 
返回
上方