๐น๏ธ ๋ชจ์ํดํน ์ฒดํ ๋์
๐น๏ธ ๋ชจ์ํดํน ์ฒดํ ๋ฐ๋ผํ๊ธฐ โถ
STEP_1) ๋ฑ๋ก๋ ๊ฒ์๊ธ ์กฐํ
STEP_2) ์ฒจ๋ถ๋ ํ์ผ(test.txt) ํ์ผ ํด๋ฆญ

STEP_3) ํ๋ก์ ํด์ธ Burp Suite์ ์ด์ฉํ์ฌ, ์์ฒญํ๋ ํ์ผ๋ช
์ ์์คํ
ํ์ผ(/etc/passwd)์ ์๋ ๊ฒฝ๋ก๋ก ๋ณ์กฐ ํ ์์ฒญ

STEP_4) ์์คํ
ํ์ผ(/etc/passwd)์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ฉฐ, ํด๋น ํ์ผ ๋ด ์์ฑ๋ FLAG ๊ฐ ํ์ธ ๊ฐ๋ฅ

O ํ์ผ ๋ค์ด๋ก๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํ์ฌ ์๋ฒ์ ์์ค์ฝ๋, ์์คํ
ํ์ผ ๋ฑ ์ฃผ์ ํ์ผ์ ๋ค์ด๋ก๋ ํ ์ ์๋ ์ทจ์ฝ์
O ๊ทผ๊ฑฐ ์๋ฃ
โ ์ฃผ์์ ๋ณดํต์ ๊ธฐ๋ฐ์์ค ๊ธฐ์ ์ ์ทจ์ฝ์ ๋ถ์ ํ๊ฐ ์์ธ ๊ฐ์ด๋(p.715)
O ํ๋จ ๊ธฐ์ค
์ํธ | ๋ค์ด๋ก๋ ํ์ผ์ด ์ ์ฅ๋ ๋๋ ํฐ๋ฆฌ ์ด์ธ์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ |
์ทจ์ฝ | ๋ค์ด๋ก๋ ํ์ผ์ด ์ ์ฅ๋ ๋๋ ํฐ๋ฆฌ ์ด์ธ์ ์ ๊ทผ์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ |
O ์ ๊ฒ ๋ฐฉ๋ฒ
- ๊ฒฝ๋ก์ด๋๋ฌธ์(../ ํน์ ..\)๋ฅผ ์ด์ฉํ์ฌ ๋ค์ด๋ก๋ ํ์ผ์ ๊ฒฝ๋ก ์กฐ์
- '../' ๋ฐ '..\'๋ฑ์ ํํฐ๋งํ ๊ฒฝ์ฐ '…/./' ๋ฐ '…\.\'๋ฑ์ผ๋ก ํํฐ๋ง ์ฐํ
- /(%2F) , \(%5C) URL ์ธ์ฝ๋ฉ์ ์ด์ฉํ์ฌ ํํฐ๋ง ์ฐํ
# ์์คํ
ํ์ผ ๋ค์ด๋ก๋ ์์
- Linux ์์คํ
ํ์ผ : ../../../../../etc/passwd
- Windows ์์คํ
ํ์ผ : ..\..\..\..\..\Windows\System32\Drivers\etc\host
O ์กฐ์น ๋ฐฉ๋ฒ
- ์ฌ์ฉ์๋ก๋ถํฐ ๋ฐ์ ๊ฐ์ "../", "..\" ์กด์ฌ ์ ์ค๋ฅ ์ฒ๋ฆฌ
- ์
๋ก๋ ๋ฐ ๋ค์ด๋ก๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ถ๋ฆฌ๋ ํ๋์จ์ด ๋๋ ํํฐ์
์ ์์นํ๋๋ก ์ค์
- ์ดํ๋ฆฌ์ผ์ด์
์ด ๋ค์ด๋ก๋ ๋ฐ์ ์ ์๋ ์์น ์ด์ธ์ ๊ฒฝ๋ก์์ ๋ค์ด๋ก๋ ์ ํ
- ํ์ผ ๊ฒฝ๋ก ์
๋ ฅ ์ ์ ์ฒด ๊ฒฝ๋ก ์ฌ์ฉ ๋ฐ ๋
ธ์ถ ๊ธ์ง
- ๋ค์ด๋ก๋ ๊ฐ๋ฅํ ํ์ผ๋ช
์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ์ฌ ๋ค์ด๋ก๋ ํ์ผ์ ์ฌ์ฉ์์ ์์ฒญ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐธ์กฐํ๋๋ก ๊ตฌํ
O ์ํ์ด ์ฝ๋ฉ(Secure Coding) ์์
# ํ์ผ๋ช
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐธ์กฐ ๋ชจ๋ โถ
==== com.example.demo.board.service.BoardService.java ====
public FileVO fileDetailService(int bno) throws Exception{
return mBoardMapper.fileDetail(bno);
}
==== com.example.demo.board.mapper.BoardMapper.java ====
public FileVO fileDetail(int bno) throws Exception;
==== com.example.demo.board.mapper.BoardMapper.xml ====
SELECT * FROM Files WHERE BNO = #{bno}
# JSP โถ
.....
String UPLOAD_PATH= "/var/www/upload/";
String filename= response.getParameter("filename");
String filepathname = UPLOAD_PATH + filename;
if(filename.equalsIgnoreCase("..") || filename.equalsIgnoreCase("/"))
// ํ์ผ ์ด๋ฆ ์ฒดํฌ
return 0;
}
// ํ์ผ ์ ์ก ๋ฃจํด
response.setContentType("application/unknown; charset=euc-kr");
response.setHeader("Content-Disposition","attachment;filename=" + filename + ";");
response.setHeader("Content-Transfer-Encoding:" , "base64");
try {
BufferedInputStream in =
new BufferedInputStream(new FileInputStream(filepathname));
.....
} catch(Exception e) { ย ย
// ์๋ฌ ์ฒดํฌ [ํ์ผ ์กด์ฌ ์ ๋ฌด ๋ฑ]
}
# ASP โถ
<%
file = Request.Form ("file") // ํ์ผ ์ด๋ฆ
Response.ContentType = "application/unknown" // ContentType ์ ์ธ
Response.AddHeader "Content-Disposition","attachment; filename=" & file
Set objStream = Server.Create Object("ADODB.Stream") // Stream ์ด์ฉ
strFile = Server.MapPath("./upfiles/") & "โฉ" & file // ์๋ฒ ์ ๋๊ฒฝ๋ก
strFname=Mid(Fname,InstrRev(file,"โฉ")+1) // ํ์ผ ์ด๋ฆ ์ถ์ถ, ..โฉ ๋ฑ์ ํ์ ๊ฒฝ๋ก ํ์์ ์ ๊ฑฐ๋จ
strFPath = Server.MapPath("./upfiles/") & "โฉ" & strFname // ์น ์๋ฒ์ ํ์ผ ๋ค์ด๋ก๋ ์ ๋ ๊ฒฝ๋ก
ย ย // ์ฌ์ฉ์๊ฐ ๋ค์ด ๋ฐ๋ ํ์ผ๊ณผ ์น ์๋ฒ์ ํ์ผ ๋ค์ด๋ก๋ ๊ฒฝ๋ก๊ฐ ๋ง๋์ง ๋น๊ต
If strFile = strFPath Then
objStream.Open
objStream.Type = 1
objStream.LoadFromFile strFile
download = objStream.Read
Response.BinaryWrite download
End If
// ๊ฐ์ฒด ์ด๊ธฐํ
Set objstream = nothing
%>
# PHP โถ
.....
// ๋๋ ํฐ๋ฆฌ์ ํน์๋ฌธ์ ์ฒดํฌ
if (preg_match("/[^a-z0-9_-]/i",$up_dir))
print "๋๋ ํฐ๋ฆฌ์ ํน์๋ฌธ์ ์ฒดํฌ";
exit;
// ํ์ผ ์ด๋ฆ์ ํน์๋ฌธ์ ์ฒดํฌ ย
if (preg_match("/[^\xA1-\xFEa-z0-9._-]|\.\./i",urldecode($dn_file_name)))
print "ํ์ผ์ด๋ฆ์ ํน์๋ฌธ์ ์ฒดํฌ";
exit;
// ํ์ผ ์กด์ฌ ์ฌ๋ถ ์ฒดํฌ
$dn_path = "/var/www/data/$up_dir/$dn_file_name";
if (!file_exists($dn_path))
print "ํ์ผ์ด ์กด์ฌ์ฌ๋ถ ์ฒดํฌ";
exit;
// ํ์ผ ์ ์ก ๋ฃจํด
header("Content-Type: doesn/matter");
header("Content-Length: ".filesize("$dn_path"));
header("Content-Disposition: filename=".$dn_file_name]);
header("Content-Transfer-Encoding: binary\r\n");
header("Pragma: no-cache");
header("Expires: 0");
.....
๐น๏ธ ๋ชจ์ํดํน ์ฒดํ ๋์
๐น๏ธ ๋ชจ์ํดํน ์ฒดํ ๋ฐ๋ผํ๊ธฐ โถ
STEP_1) ๋ฑ๋ก๋ ๊ฒ์๊ธ ์กฐํSTEP_2) ์ฒจ๋ถ๋ ํ์ผ(test.txt) ํ์ผ ํด๋ฆญ
STEP_3) ํ๋ก์ ํด์ธ Burp Suite์ ์ด์ฉํ์ฌ, ์์ฒญํ๋ ํ์ผ๋ช ์ ์์คํ ํ์ผ(/etc/passwd)์ ์๋ ๊ฒฝ๋ก๋ก ๋ณ์กฐ ํ ์์ฒญ
STEP_4) ์์คํ ํ์ผ(/etc/passwd)์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ฉฐ, ํด๋น ํ์ผ ๋ด ์์ฑ๋ FLAG ๊ฐ ํ์ธ ๊ฐ๋ฅ
O ํ์ผ ๋ค์ด๋ก๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํ์ฌ ์๋ฒ์ ์์ค์ฝ๋, ์์คํ ํ์ผ ๋ฑ ์ฃผ์ ํ์ผ์ ๋ค์ด๋ก๋ ํ ์ ์๋ ์ทจ์ฝ์
O ๊ทผ๊ฑฐ ์๋ฃ
โ ์ฃผ์์ ๋ณดํต์ ๊ธฐ๋ฐ์์ค ๊ธฐ์ ์ ์ทจ์ฝ์ ๋ถ์ ํ๊ฐ ์์ธ ๊ฐ์ด๋(p.715)
O ํ๋จ ๊ธฐ์ค
O ์ ๊ฒ ๋ฐฉ๋ฒ
- ๊ฒฝ๋ก์ด๋๋ฌธ์(../ ํน์ ..\)๋ฅผ ์ด์ฉํ์ฌ ๋ค์ด๋ก๋ ํ์ผ์ ๊ฒฝ๋ก ์กฐ์
- '../' ๋ฐ '..\'๋ฑ์ ํํฐ๋งํ ๊ฒฝ์ฐ '…/./' ๋ฐ '…\.\'๋ฑ์ผ๋ก ํํฐ๋ง ์ฐํ
- /(%2F) , \(%5C) URL ์ธ์ฝ๋ฉ์ ์ด์ฉํ์ฌ ํํฐ๋ง ์ฐํ
# ์์คํ ํ์ผ ๋ค์ด๋ก๋ ์์
- Linux ์์คํ ํ์ผ : ../../../../../etc/passwd
- Windows ์์คํ ํ์ผ : ..\..\..\..\..\Windows\System32\Drivers\etc\host
O ์กฐ์น ๋ฐฉ๋ฒ
- ์ฌ์ฉ์๋ก๋ถํฐ ๋ฐ์ ๊ฐ์ "../", "..\" ์กด์ฌ ์ ์ค๋ฅ ์ฒ๋ฆฌ
- ์ ๋ก๋ ๋ฐ ๋ค์ด๋ก๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ถ๋ฆฌ๋ ํ๋์จ์ด ๋๋ ํํฐ์ ์ ์์นํ๋๋ก ์ค์
- ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋ค์ด๋ก๋ ๋ฐ์ ์ ์๋ ์์น ์ด์ธ์ ๊ฒฝ๋ก์์ ๋ค์ด๋ก๋ ์ ํ
- ํ์ผ ๊ฒฝ๋ก ์ ๋ ฅ ์ ์ ์ฒด ๊ฒฝ๋ก ์ฌ์ฉ ๋ฐ ๋ ธ์ถ ๊ธ์ง
- ๋ค์ด๋ก๋ ๊ฐ๋ฅํ ํ์ผ๋ช ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ์ฌ ๋ค์ด๋ก๋ ํ์ผ์ ์ฌ์ฉ์์ ์์ฒญ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐธ์กฐํ๋๋ก ๊ตฌํ
O ์ํ์ด ์ฝ๋ฉ(Secure Coding) ์์
# ํ์ผ๋ช ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐธ์กฐ ๋ชจ๋ โถ
# JSP โถ
# ASP โถ
# PHP โถ