웹/보안

파일업로드 필터링 방식 및 우회

parktest0325 2019. 10. 24. 09:16

1. 자바스크립트 필터링

 - 자바스크립트는 브라우저단에서 동작하기 때문에 패킷이 브라우저를 떠난 이후에 조작한다.

 - 프록시에서 변경

 

 

2. 파일 사이즈 필터링

 - 한줄웹쉘같은 작은 파일 올리면된다. 

 

 

3. 확장자 필터링

 - 블랙리스트 : 인기없는 확장자로 변경

    * PHP : pht, phpt, phtml, php3, php4, php5, php6

    * JSP : jspx, jsw, jsv

    * ASP : 

 

 

 - 블랙리스트2 : 마지막 .을 기준으로 오른쪽에 있는 확장자를 검사하는데, test.php. 과 같이 확장자가 없는 경우에 통과될 수 있다. 이때 업로드경로에서 .을 지운뒤 접근하면 실행될 수 있다. 

FileExt = System.IO.Path.GetExtension(FileName);
string[] noUpdateExt = ".exe,.com,.cmd,.bat,.aspx,.asa,.asax,.ascx,.ashx,.asmx,.axd,.cdx,.idc,.cer,.asp,.cdx,.htr,.cgi,.jsp,.php,.php3,.html,.htm,.war".Split(',');
if (noUpdateExt.Any((item => item == FileExt)))
{
	myFunction.PrintMsgBack(string.Format("확장자가 {0} 파일은 업로드 하실수 없습니다.", FileExt));
}

 

 - 화이트리스트 : 필터링에 따라 다름

   -> 연속적인 확장자 사용 : shell.jpg.php

   -> 널바이트 삽입 : shell.php%00.gif,  폼데이터 방식에서는 hex값을 수정해서 Null 삽입 58(X) -> 00(\0)

 - 대소문자 우회 : php -> PhP, Php, phP   *소문자로 이뤄진 확장자가 아니면 스크립트를 실행하지 않는 서버도 있다.

 - 다중확장자 : 확장자 우선순위? 에 따라 앞에있는 확장자가 실행될 수 있다. test.php.jpg

 

 

4. Content-Type 필터링

1
2
$mimetype = mime_content_type($_FILES['file']['tmp_name']);
if(in_array($mimetype, array('image/jpeg', 'image/gif', 'image/png')))

 - 업로드한 파일의 Content-Type을 검사하는 경우 프록시로 변경하면 된다.

 - image/jpeg, image/gif, image/png

 

 

5. 파일 헤더 검사

 - GIF89a 같은 파일 헤더를 검사할 수 있다. 

 - 이미지 파일 내에 스크립트를 삽입하면 된다. 

 

 

6. form-data에서 파일명 파라미터 삭제 

 

 

 

확장자