๐Ÿšช Intro

์ทจ์•ฝ์ ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ๋ถ„์„ํ•˜๊ณ  ์žˆ๋Š” ์˜คํ”ˆ์†Œ์Šค ์›น ์„œ๋น„์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉฐ์น  ๋™์•ˆ ์‚ฝ์งˆ์„ ํ†ตํ•ด ๋ฐœ๊ฒฌํ•œ ์ทจ์•ฝ์ (?)์„ ๊ธฐ๋ก ๋ฐ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ’ก Analysis

ํ•ด๋‹น ์ทจ์•ฝ์ ์€ ์›น ๊ด€๋ฆฌ์ž๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋ฉฐ, php dynamic variable ์„ ํ†ตํ•ด ๋‹ค๋ฅธ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ overwrite ํ•˜์—ฌ Stored XSS๋ฅผ ๋™์ž‘ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์—๋Š” ์•„๋ž˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ ์–ด๋–ค ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ํ•ด๋‹น ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•ด ๋ณธ ๊ฒฐ๊ณผ, ์ˆซ์ž ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

[๊ทธ๋ฆผ 1] ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€ ๊ธฐ๋Šฅ ์ค‘ ์ผ๋ถ€

 

์œ„ ์‚ฌ์ง„์—์„œ 100 ์ด๋ผ๋Š” ๊ฐ’์€ ์•„๋ž˜ ์‚ฌ์ง„ 56๋ฒˆ์งธ ์ค„์ธ `$mb_id1_to` ๋ณ€์ˆ˜์— ์ €์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ๊ฐ์˜ ๊ฐ’์„ `$ma_last_option` ๋ณ€์ˆ˜์— ์ด์–ด ๋ถ™์ด๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[๊ทธ๋ฆผ 2]

 

์ตœ์ข…์ ์œผ๋กœ `$ma_last_option` ๋ณ€์ˆ˜์˜ ๊ฐ’์€ DB์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ €์žฅ ๋ฉ๋‹ˆ๋‹ค.

mb_id1=1||mb_id1_from=1||mb_id1_to=100||mb_email=admin@domain.com||mb_mailling=1||mb_level_from=1||mb_level_to=10||gr_id=

 

์œ„์—์„œ ์ €์žฅ๋œ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ณผ์ •์€ ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

27๋ฒˆ์งธ ์ค„์—์„œ `||` ๋ฌธ์ž์—ด์„ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค.

์ดํ›„ for๋ฌธ์„ ํ†ตํ•ด ํ•œ๋ฒˆ ๋” `=` ๋ฌธ์ž์—ด์„ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ์ด๋Š” key์™€ value ๋ฅผ ๋‚˜๋ˆ„๊ธฐ ์œ„ํ•จ ์ž…๋‹ˆ๋‹ค.

31๋ฒˆ์งธ ์ค„์—์„œ key๋ฅผ `$var` ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ณ  value ๊ฐ’์ด ์žˆ๋‹ค๋ฉด, `Dynamic variable` ์„ ์‚ฌ์šฉํ•˜์—ฌ `$$var` ๋ณ€์ˆ˜์— value๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

[๊ทธ๋ฆผ 3] Dynamic variable ๋™์ž‘ ๊ณผ์ •

 

์œ„ ๊ณผ์ •์„ ๋ณด๋ฉด ์–ด๋””์—๋„ `||` ๋ผ๋Š” ๋ฌธ์ž์—ด์„ ํ•„ํ„ฐ๋ง ํ•˜๋Š” ์ฝ”๋“œ๋Š” ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ณต๊ฒฉ์ž๋Š” [๊ทธ๋ฆผ 1]์—์„œ `||` ๋ฌธ์ž์—ด๊ณผ overwrite ํ•  ๋ณ€์ˆ˜ ์ด๋ฆ„๊ณผ ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์ฝ”๋“œ ํ๋ฆ„์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

SQLI ๋ฅผ ์‹œ๋„ํ•˜๋ ค๊ณ  ํ–ˆ์œผ๋‚˜, overwrite ํ•  ๋ณ€์ˆ˜๊ฐ€ ๋งˆ๋•…ํžˆ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์•„์‰ฌ์šด๋Œ€๋กœ ์•„๋ž˜ ์ฝ”๋“œ์— ์žˆ๋Š” `$ma_id` ๋ณ€์ˆ˜๋ฅผ ํƒ€๊ฒŸ์œผ๋กœ ์ •ํ•ด overwrite ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ ์–ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

[๊ทธ๋ฆผ 4] ํƒ€๊ฒŸ ๋ณ€์ˆ˜

 

๐Ÿšฉ PoC

์œ„์—์„œ ์„ค๋ช…ํ–ˆ๋“ฏ์ด [๊ทธ๋ฆผ 1]์—์„œ ๊ณต๊ฒฉ์„ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์‚ฌ์ง„ ์ฒ˜๋Ÿผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

[๊ทธ๋ฆผ 5] payload ์ž…๋ ฅ

 

๊ทธ๋Ÿผ [๊ทธ๋ฆผ 2]์˜ `$ma_last_option` ๋ณ€์ˆ˜์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ’์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

[๊ทธ๋ฆผ 6] $ma_last_option ๋ณ€์ˆ˜์˜ ๊ฐ’ ์ „ํ›„ ๋น„๊ต

 

์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ `||` ๋ฌธ์ž์—ด๊ณผ `=` ๋ฌธ์ž์—ด๋กœ ๋ถ„๋ฆฌ ์‹œํ‚ค๊ณ , ์ด๋ฅผ 32๋ฒˆ์งธ ์ค„์—์„œ `$ma_id` ๋ณ€์ˆ˜ ๊ฐ’์ด `"><script>alert(1)</script>` ๋กœ overwrite ๋ฉ๋‹ˆ๋‹ค. 

[๊ทธ๋ฆผ 7] Dynamic variable ๋™์ž‘ ๊ณผ์ •

 

๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด XSS๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[๊ทธ๋ฆผ 8] XSS ๋™์ž‘

 

 

๐Ÿ’€ ETC

XSS ๋ณด๋‹ค ์ข€ ๋” ๊ฐ•๋ ฅํ•œ(?) ๊ฒƒ์„ ์ฐพ์•„๋ณด๋ ค๊ณ  ํ–ˆ์œผ๋‚˜, ์œ„ ์ทจ์•ฝ์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฒŒ ์—†๋„ค์š”..

๋˜ํ•œ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์—์„œ๋งŒ ๋˜๋Š”๊ฑฐ๋ผ ๋ถ„์„ ํ›„ ํŠธ๋ฆฌ๊ฑฐ ํ•œ ๊ฒƒ์— ๋งŒ์กฑํ•ด์•ผ ๊ฒ ๋„ค์š”.