๐Ÿค– Backend/Web

SQL Injection๊ณผ XSS (Cross-Site Scripting)

sckwon770 2023. 12. 29. 23:20

์‚ฌ์‹ค ๋ฐฑ์—”๋“œ ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ ์ธํ”„๋ผ ๋‹จ์—์„œ๋งŒ ๋ณด์•ˆ๊ณผ ํ•ดํ‚น ๋ฐฉ์–ด๋ฅผ ์กฐ์‹ฌํ–ˆ์ง€๋งŒ, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‹จ์—์„œ์˜ ๋ณด์•ˆ์€ ํฌ๊ฒŒ ์•Œ์•„๋ณธ ์ ์€ ์—†์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๊ธฐ๋ณธ์ ์ธ ์„ค์ •์€ ์ „๋ถ€ ๋˜์–ด ์žˆ์–ด์˜€์ง€๋งŒ, ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์•ˆํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์•„์˜ˆ ๋ชจ๋ฅด๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ์ตœ๊ทผ ์ฐธ์—ฌํ•œ ๋ชจ ๊ธฐ์—…์˜ ์ฑ„์šฉ ํ•„๊ธฐ ํ…Œ์ŠคํŠธ์—์„œ ์ด์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ๊ฐ€ ๋‚˜์™”์—ˆ๊ณ , ์ตœ๊ทผ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋กœ์ ํŠธ์—์„œ ์„œ๋ฒ„ ๋ฆฌ๋“œ๊ฐ€ UUID/ULID๋ฅผ DB PK๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์ฐพ์•„๋ณด๋˜ ์ค‘ ์ด์™€ ์—ฐ๊ด€๋˜์–ด ํ•œ ๋ฒˆ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

 


SQL Injection

์›Œ๋‚™ ์œ ๋ช…ํ•ด ๋‹ค๋“ค ํ•œ ๋ฒˆ์ฏค์€ ๋“ค์–ด๋ดค์„ํ…๋ฐ, ์ž„์˜์˜ SQL๋ฌธ์„ ์ฃผ์ž…ํ•˜๊ณ  ์‹คํ–‰๋˜๊ฒŒ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋น„์ •์ƒ์ ์ธ ๋™์ž‘์„ ํ•˜๋„๋ก ์กฐ์ž‘ํ•˜๋Š” ํ–‰์œ„์ด๋‹ค. ๋‹ค์–‘ํ•œ ๊ณต๊ฒฉ๋ฒ•์ด ์žˆ์ง€๋งŒ, ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ Error based SQL Injection์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณด์ž.

 

 

๊ณต๊ฒฉ ๋ฐฉ๋ฒ•

Error based SQL Injection์€ ๋…ผ๋ฆฌ์  ์—๋Ÿฌ๋ฅผ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. ์•„๋ž˜ ์‚ฌ์ง„์€ ๋กœ๊ทธ์ธ ์‹œ ์‚ฌ์šฉํ•˜๋Š” SQL ์˜ˆ๋ฌธ์ด๋‹ค. ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ๊ฒ€์ฆ์ด ์—†์–ด ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๊ฐ€ ๊ณต๊ฒฉํ•˜๊ธฐ ์œ„ํ•œ SQL ๊ตฌ๋ฌธ์„ ์ฃผ์ž…ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

24'-- ๋ผ๋Š” ๊ตฌ๋ฌธ์„ ์ฃผ์ž…ํ•จ์œผ๋กœ์จ, 24' ๋ถ€๋ถ„์ด id๊ฐ€ 24์ธ ์กฐ๊ฑด์ ˆ์„ ์™„์„ฑํ•˜๊ณ  -- ๋ถ€๋ถ„์ด ๋’ค์˜ password ๊ฒ€์ฆ ์กฐ๊ฑด์ ˆ์„ ์ฃผ์„์ฒ˜๋ฆฌํ•˜์—ฌ 24๋ฒˆ ์œ ์ €์˜ ๊ฐœ์ธ ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ password ์ปฌ๋Ÿผ์ด ์•”ํ˜ธํ™”๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด, ๊ณ„์ •๊นŒ์ง€ ํƒˆ์ทจ๋  ๊ฒƒ์ด๋‹ค.

 

๋ฐฉ์–ด ๋ฐฉ๋ฒ•

1. ์ž…๋ ฅ ๊ฐ’์— ๋Œ€ํ•œ ๊ฒ€์ฆ : ์„œ๋ฒ„ ๋‹จ์—์„œ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ ๊ฐ’์„ ๊ฒ€์ฆํ•˜๊ณ  ๊ณต๊ฒฉ์„ ์‚ฌ์ „์— ์ฐจ๋‹จํ•œ๋‹ค. ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒ€์ฆํ•˜๊ฒŒ ๋˜๋ฉด ์ˆ˜๋งŽ์€ ์ฐจ๋‹จ๋ฆฌ์ŠคํŠธ๋ฅผ ๋“ฑ๋กํ•ด์•ผ ํ•˜๊ณ  ํ•˜๋‚˜๋ผ๋„ ๋น ์ง€๋ฉด ๊ณต๊ฒฉ์— ์„ฑ๊ณตํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒ€์ฆํ•ด์•ผ ํ•œ๋‹ค.

 

2. Prepared Statement ๊ตฌ๋ฌธ ์‚ฌ์šฉ :  DBMS๊ฐ€ SQL ๊ตฌ๋ฌธ์„ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผํ•˜์—ฌ ์‹คํ–‰๊ณ„ํš์„ ์ƒ์„ฑํ•˜๊ณ , ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ์ž…๋ ฅ๋ฐ›์•„ ๋ฐ”๋กœ ์‹คํ–‰ํ•œ๋‹ค. ์ฆ‰, SQL String์„ Java ๋‹จ์—์„œ ๋“ค๊ณ  ์žˆ๋‹ค๊ฐ€ ์ž…๋ ฅ๊ฐ’์„ ์น˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ DB์— ๋ฏธ๋ฆฌ ์‹คํ–‰๊ณ„ํš์„ ์ƒ์„ฑํ•ด๋‘๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’๋งŒ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ, ์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ฐ’์ด SQL ์‹คํ–‰ ๊ณ„ํš์„ ๋ณ€๊ฒฝ์‹œํ‚ค์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์œ„์˜ ์‚ฌ์ง„ ์˜ˆ์‹œ์—์„œ๋Š” 24'-- ๋ผ๋Š” id๋ฅผ ์ฐพ๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

 

3. Error Message ๋…ธ์ถœ ๋ฐฉ์ง€ : ๊ณต๊ฒฉ์ž๊ฐ€ SQL Injection์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๊ฒช์œผ๋ฉฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ •๋ณด(ํ…Œ์ด๋ธ”๋ช…, ์ปฌ๋Ÿผ๋ช… ๋“ฑ)์„ ์ฐพ์•„๋‚ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์—๋Ÿฌ ํ•ธ๋“ค๋ง์„ ํ†ตํ•ด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ์ฟผ๋ฆฌ๋ฌธ๊ณผ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœ์‹œํ‚ค์ง€ ์•Š์Œ์œผ๋กœ์จ, ๊ณต๊ฒฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ •๋ณด๋ฅผ ์•Œ๊ธฐ ํž˜๋“ค๊ฒŒ ๋งŒ๋“ ๋‹ค.

 

์Šคํ”„๋ง์—์„œ๋Š”?

์Šคํ”„๋ง์—์„œ๋Š” JPA ์ •ํ™•ํžˆ๋Š” ORM ๊ตฌํ˜„์ฒด์ธ Hibernate๊ฐ€ Prepared Satement ๊ตฌ๋ฌธ์œผ๋กœ SQL์„ ์‹คํ–‰์‹œํ‚ค๊ณ  ์žˆ๋‹ค.

https://github.com/hibernate/hibernate-orm/blob/main/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/StatementPreparerImpl.java

 

๋‹จ, MyBatis๋Š” ์ผ๋ฐ˜ Statement๋„ ํ•จ๊ป˜ ์“ฐ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์ฟผ๋ฆฌ๋ฌธ์— ${}๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด Statement, #{}๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด Prepared Statement๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 


XSS (Cross-Site Scripting)

SQL Injetion์€ SQL์„ ์›น์— ์ฃผ์ž…ํ•ด ์„œ๋ฒ„๋ฅผ ๊ณต๊ฒฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด, XSS๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์›น์— ์ฃผ์ž…ํ•ด ์‚ฌ์šฉ์ž๋ฅผ ๊ณต๊ฒฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. XSS์—๋Š” ์„ธ ๊ฐ€์ง€ ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์ด ์žˆ๋‹ค.

 

 

๊ณต๊ฒฉ ๋ฐฉ๋ฒ•

1. Stored XSS : XSS์— ์ทจ์•ฝํ•œ ์›น ์‚ฌ์ดํŠธ์˜ ๊ฒŒ์‹œํŒ์— ๊ณต๊ฒฉ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ•œ ๊ฒŒ์‹œ๊ธ€์„ ์—…๋กœ๋“œํ•œ๋‹ค. ์›น์‚ฌ์ดํŠธ ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์„ ํด๋ฆญํ•˜๋ฉด, ๊ณต๊ฒฉ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค.

 

2. Reflected XSS : ๊ณต๊ฒฉ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จ๋œ URL์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘์†ํ•˜๊ฒŒ ์œ ๋„ํ•œ๋‹ค. ํ•ด๋‹น URL๋กœ ์›น ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•  ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ •์ƒ HTML์„ ๋ฐ›๊ณ  URL์— ํฌํ•จ๋œ ๊ณต๊ฒฉ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ถ”์ถœํ•ด ํ•จ๊ป˜ ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ณต๊ฒฉ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

 

3. DOM XSS :  ๊ณต๊ฒฉ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จ๋œ URL์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘์†ํ•˜๊ฒŒ ์œ ๋„ํ•œ๋‹ค. ํ•ด๋‹น URL๋กœ ์›น ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•  ๊ฒฝ์šฐ, ์„œ๋ฒ„๊ฐ€ URL ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฒ€์ฆ์—†์ด ์‘๋‹ต HTML์— ๋‹ด๊ณ  ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €๋Š” ์‘๋‹ต๋ฐ›์€ ๋น„์ •์ƒ HTML์„ ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ณต๊ฒฉ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

https://junhyunny.github.io/information/security/dom-based-cross-site-scripting/

 

๋ฐฉ์–ด ๋ฐฉ๋ฒ•

์ž…๋ ฅ๊ฐ’๊ณผ ์ถœ๋ ฅ๊ฐ’์— ๊ฒ€์ฆ์„ ํ†ตํ•ด ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž…๋ ฅ๊ฐ’์„ ๊ฒ€์ฆํ•  ๋•Œ๋Š” ๊ณต๊ฒฉ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์— ์‚ฌ์šฉ๋˜๋Š” ํŠน์ˆ˜๋ฌธ์ž๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ฑฐ๋‚˜ HTML ์—”ํ‹ฐํ‹ฐ๋กœ ์ธ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค. (HTML Entity: < -> &lt; , > -> &gt; ์™€ ๊ฐ™์ด ํŠน์ˆ˜๋ฌธ์ž๋ฅผ ๋‹ค๋ฅธ ํฌ๋ฉง์œผ๋กœ ๋ณ€ํ™˜) ์ถœ๋ ฅ๊ฐ’์„ ๊ฒ€์ฆํ•  ๋•Œ๋Š” X-XSS-Protection ํ—ค๋”๋‚˜ CSP(Content Security Policy)ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ XSS ๊ณต๊ฒฉ์„ ๊ฐ์ง€๋  ๊ฒฝ์šฐ ์ฐจ๋‹จํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋Ÿฐ ๋™์ž‘์ด ๋””ํดํŠธ๋กœ ์ž‘๋™ํ•œ๋‹ค.

 

์Šคํ”„๋ง์—์„œ๋Š”?

์ด๋Š” WAS๊ฐ€ ์•„๋‹ˆ๋ผ WA์—์„œ ์‹ ๊ฒฝ์จ์•ผํ•  ๋ถ€๋ถ„์ด๋‹ค. ํ•˜์ง€๋งŒ ์Šคํ”„๋ง MVC ๋“ฑ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์‹ ๊ฒฝ์จ์•ผ ํ•˜๊ณ , ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ง๋ผํ•˜๋Š” ๋„คํŠธ์›Œํฌ ์ •๋„๋Š” ์•Œ์•„์•ผ ํ•  ๊ฒƒ ๊ฐ™์•„์„œ ํ•จ๊ป˜ ์ •๋ฆฌํ•ด๋ดค๋‹ค.