KoreanHackerTeam
Moderator
文件上传漏洞
1 前言
사격장 환경 : https://github.com/c0ny1/upload-labs환경 구성 :
1
2
Docker PULL C0NY1/UPLOAD-LABS
Docker Run -D -P 80:80 업로드 랩
업로드 취약성의 유형을 결정하려면 :

파일 업로드 취약점은 주로 다음 측면에서 존재합니다.
Parsable 접미어는 언어가 PHP 언어의 파르슨 접미사와 같은 다수의 파싱 가능한 접미사를 가지고 있음을 의미합니다. PHP, PHP2, PHP3 등입니다.
케이스 믹스, 시스템이 단단히 필터링되지 않으면 상단 및 소문자로 우회 할 수 있습니다.
미들웨어, 각 미들웨어는 기본적으로 취약점을 해결합니다. 예를 들어, IIS는 xxx.asp;jpg를 ASP로 실행할 수 있습니다.
시스템 기능, 특히 Windows의 접미사 플러스 점, 공간 및 : $ 데이터는 대상 시스템을 우회 할 수 있습니다.
언어 취약성. 인기있는 세 가지 스크립팅 언어에는 기본적으로 00 잘림 취약점이 있습니다.
이중 접미사, 이것은 시스템 및 미들웨어와 관련이 없으며 때로는 코드 로직에 존재합니다.
1.1 可解析的后缀
많은 언어에는 다수의 접미사가 있습니다. 대상 사이트가 블랙리스트를 채택하면 종종 불완전합니다.语言可解析后缀ASP/ASPX
ASP, ASPX, ASA, ASAX, ASCX, ASHX, ASMX, CER
PHP
PHP, PHP5, PHP4, PHP3, PHP2, PHTML, PHT
JSP
JSP, JSPA, JSPX, JSW, JSV, JSPF, JHTML
1.2 中间件漏洞
1.2.1 IIS
IIS에는 세 가지 해상도 취약점이 있습니다.IIS 6.0 파일 파싱 xx.asp;jpg
IIS 6.0 디렉토리 분석 xx.asp/1.jpg
IIS 7.5 변형 분석 xxx.jpg/x.php
1.2.2 Apahce
두 개의 Apache 관련 구문 분석 취약점이 있습니다.%0A (CVE-2017-15715)
알 수없는 접미사 test.php.xxx
1.2.3 nginx
세 가지 NGINX 해상도 취약점이 있습니다.링크 plus /xxx.php에 액세스하십시오. 즉, test.jpg /xxx.php
변형 분석 취약성 test.jpg%00xxx.php
CVE-2013-4547 Test.jpg (비 코딩 된 공간) \0x.php
1.2.4 tomcat
바이 패스 업로드에 사용되는 세 가지 유형의 Tomcat이 있으며 그 중 일부는 Windows 운영 체제로 제한됩니다.xxx.jsp/
xxx.jsp%20
xxx.jsp: $ 데이터
1.3 系统特性
정보를 검색 한 후 시스템 수준에서 업로드 된 취약점으로 다음 기능을 악용 할 수 있습니다.Windows의 파일 이름은 대소 문자를 사용하고 Linux의 파일 이름은 대소 문자를 사용합니다.
Windows에서 광고 스트리밍 기능은 파일 xxx.php: $ data=xxx.php를 업로드합니다.
Windows에서는 파일 이름 끝에. 공백 ,0x81-0xff와 같은 문자가 추가되며 최종 생성 파일은 Windows에서 무시됩니다.
2 WriteUP
2.1 PASS - 01
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
스크립트 유형='텍스트/JavaScript'
함수 checkfile () {
var file=document.getElementsByName ( 'upload_file') [0] .Value;
if (file==null || file=='') {
Alert ( '업로드 할 파일을 선택하십시오!');
거짓을 반환합니다.
}
//업로드 할 수있는 파일 유형을 정의합니다
var allow_ext='.jpg | .png | .gif';
//업로드 된 파일 유형을 추출합니다
var ext_name=file.substring (file.lastindexof ( '.'));
//파일 유형 업로드가 허용되는지 판단합니다
if (allow_ext.indexof (ext_name)==-1) {
var errmsg='이 파일은 업로드 할 수 없습니다.' + allow_ext + '파일을 업로드하십시오. 현재 파일 유형은 다음과 같습니다.' + ext_name;
경고 (errmsg);
거짓을 반환합니다.
}
}
/스크립트
프론트 엔드에서 JS를 비활성화하고 웹 쉘을 직접 업로드하십시오
2.2 PASS - 02
바이 패스 마임 감지 및 Burpsuite를 통해 컨텐츠 유형을 수정하십시오
2.3 PASS - 03
12
3
4
5
6
7
$ deny_ext=array ( '. asp', '. aspx', '. php', '. jsp');
$ file_name=trim ($ _ files [ 'upload_file'] [ 'name']);
$ file_name=deldot ($ file_name); //파일 이름의 끝에서 포인트 삭제
$ file_ext=strchr ($ file_name, '.');
$ file_ext=strtolower ($ file_ext); //소문자로 변환합니다
$ file_ext=str_ireplace ( ': $ data', '', $ file_ext); //String 제거 : $ data
$ file_ext=trim ($ file_ext); //닫고 비어 있습니다
백엔드 필터 .php 및 .php3, php5, php7, phtml, pht 등과 같은 접미사를 사용하여 탐지를 우회합니다.

2.4 PASS - 04
파일 구문 분석 규칙 바이 패스를 다시 작성합니다.htaccess라는 파일을 업로드하면 내용은 다음과 같습니다.1
2
3
fiilematch '04 .jpg '
Sethandler Application/X-HTTPD-PHP
/fiilematch
다른 03.jpg 및 access 03.jpg를 업로드합니다. 즉, PHP 파일로 구문 분석하십시오.

2.5 PASS - 05
은 여전히 블랙리스트이며 .htaccess가 추가되었지만 접미사는 케이스에 유입되지 않으므로 케이스로 우회 할 수 있습니다.
2.6 PASS - 06
Windows 시스템의 파일 이름 기능을 활용하십시오. 파일 이름은 끝에 점과 공백이 추가되며 06.php [Space]로 작성됩니다.업로드 후 Windows 시스템에 저장된 마지막 파일 이름이 제거되고 저장된 파일 이름은 실제로 06.php입니다.

2.7 PASS - 07
원칙은 Pass-06과 동일합니다. 파일 이름 뒤에 점을 추가하고 07.php로 변경하십시오.
2.8 PASS - 08
Windows 파일 흐름 기능 바이 패스, 파일 이름은 08.php: $로 변경됩니다. 업로드가 성공한 후 저장된 파일 이름은 실제로 08.php입니다.PHP 창 환경에서 파일 이름 + : $ 데이터가 파일 스트림으로 처리되는 경우 파일 이름 + : $ 데이터가 파일 스트림으로 처리되는 경우. 접미사 이름은 감지되지 않으며 : $ 이전의 파일 이름이 유지됩니다.

2.9 PASS - 09
원칙은 Pass-06과 동일합니다. 파일 이름을 업로드 한 후 dot + space + dot을 추가하고 09.php로 변경하십시오.
2.10 PASS - 10
파일 이름 바이 패스, 파일 이름을 10.pphphp로 변경하십시오.
2.11 PASS - 11
업로드 경로 이름 %00 Truncate 바이 패스. 업로드 된 파일 이름은 11.jpg로 작성되며 Save_Path는 ./upload/11.php%00으로 변경되고 마지막 저장된 파일은 11.php입니다.
2.12 PASS - 12
원칙은 Pass-11과 동일하며 업로드 경로는0x00 우회입니다. 이 시간에 Post를 통해 전달되거나 00을 사용하여 절단 된 Save_Path는 이번에는 이진 시스템에서 수정해야합니다. Post는 Get처럼 자동으로 %00을 디코딩하지 않기 때문입니다.Burpsuite의 16 진수 기능을 사용하여 Save_Path를 양식으로 변경하십시오 ./upload/12.php] 00]

2.13 PASS - 13
파일 헤더 검사를 우회하고 GIF 사진의 파일 헤더 GIF89A를 추가하고 GIF 사진 검사를 우회하십시오.
2.14 PASS - 14
여기에서 getImagesize를 사용하여 파일 유형을 얻거나 그림 말을 직접 사용하여 우회 할 수 있습니다.2.15 PASS - 15
여기서는 php_exif 모듈을 사용하여 파일 유형을 결정하거나 그림 말을 직접 사용하여 우회 할 수 있습니다.2.16 PASS - 16
원칙 : 정상적으로 표시된 이미지를 서버에 업로드하십시오. 이미지가 렌더링되고 원본 이미지 부분과 비교 될 때 여전히 동일한 데이터 블록 부분을 찾고 있습니다.이 섹션에 웹 쉘 코드를 삽입하고 업로드하십시오. 특정 구현에는 파이썬 프로그램을 직접 작성해야합니다. 기본적으로 인간의 시도로 렌더링 기능을 우회 할 수있는 이미지 웹 쉘을 구성하는 것은 불가능합니다.
참조 :
2.17 PASS - 17
조건부 경쟁을 사용하여 파일 바이 패스를 삭제하십시오.스크립트가 실행될 때 웹 쉘에 액세스하십시오
2.18 PASS - 18
업로드를 사용하여 경쟁 이름 + Apache 해상도 취약점을 성공적으로 우회했습니다.이름 18.php.7z의 파일을 업로드하고 패킷을 빠르게 반복적으로 제출하면 파일이 업로드되었지만 이름이 바뀌지 않도록 프롬프트합니다.

2.19 PASS - 19
이 레벨은 CVE-2015-2348 MOVE_UPLOADED_FILE () 00 잘림을 검사하고 원칙은 Pass-11과 동일하며 업로드 된 파일 이름은0x00에 의해 우회됩니다. 19.php [BAINER 00] .1.jpg로 변경하십시오
2.20 PASS - 20
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ file=empty ($ _ post [ 'save_name'])? $ _files [ 'upload_file'] [ 'name'] : $ _post [ 'save_name'];
if (! is_array ($ file)) {
$ file=exploit ( '.', strtolower ($ file));
}
$ ext=end ($ 파일);
$ allow_suffix=array ( 'jpg', 'png', 'gif');
if (! in_array ($ ext, $ allow_suffix)) {
$ msg='이 접미사 파일 업로드 사용!';
}또 다른{
$ file_name=Reset ($ 파일). '.' . $ 파일 [count ($ file) -1];
$ temp_file=$ _files [ 'upload_file'] [ 'tmp_name'];
$ img_path=upload_path. '/'. $ file_name;
if (move_uploaded_file ($ temp_file, $ img_path)) {
$ msg='파일 업로드가 성공했습니다! ';
$ is_upload=true;
} 또 다른 {
$ msg='파일 업로드 실패! ';
}
먼저, 최종 함수는 POST 매개 변수 배열에서 마지막 값을 가져옵니다. $ file_name=Reset ($ file). '.' . $ 파일 [count ($ 파일) -1]. [0] 및 [2]라는 매개 변수를 게시 한 다음 $ file [count ($ file) -1]이 비어 있고 $ file_name은 최종적으로 재설정 ($ file), 즉 $ file [0]이므로 판단을 우회 할 수 있습니다.
