ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๊ฐœ์š”

"insecure Direct Object References"๋ผ๊ณ  ๋ถˆ๋ฆฌ๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ IDOR ์ทจ์•ฝ์ ์€ OWASP top 10์˜ A5 ์ธ Broken Access Control ๋ฒ”์ฃผ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๋‚ด๋ถ€์— ๊ตฌํ˜„๋œ ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ฅผ ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ๋“ค ์—๊ฒŒ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ๋…ธ์ถœ์‹œํ‚ฌ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š” ์ทจ์•ฝ์ ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. DB๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ ๊ฒ€์ฆ์ ˆ์ฐจ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์œผ๋ฉด ๊ณต๊ฒฉ์ž๋Š” ํ—ˆ๊ฐ€ ์—†์ด ์ง์ ‘ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ํ•˜์—ฌ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์กฐ์ž‘์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

 

์‰ฝ๊ฒŒ ์–˜๊ธฐํ•ด ํŒจ์Šค์›Œ๋“œ ๋ณ€๊ฒฝ, ์ดˆ๊ธฐํ™”, ์ƒํ’ˆ ๊ตฌ๋งค ํŽ˜์ด์ง€์— ๊ตฌํ˜„๋˜์–ด์žˆ๋Š” ๊ฐ๊ฐ์˜ ์ฝ˜ํ…์ธ ๋“ค์ด ์„œ๋ฒ„ ๋‚ด๋ถ€์˜ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š์•„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ด๋Š” ๊ฐ’ ex) ์ƒํ’ˆ = 5000์› ์ธ ๊ฒƒ์„ ์ƒํ’ˆ = 100 ์›์œผ๋กœ ์กฐ์ž‘ํ•˜์—ฌ ์ด์šฉ์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

 

๊ณต๊ฒฉํฌ์ธํŠธ
(1) URL Prameter -> GET ๋ฐฉ์‹์œผ๋กœ ๋…ธ์ถœ๋˜๋Š” ๋ณ€์ˆ˜ ํ™œ์šฉ ๋˜๋Š” ์ „๋‹ฌ
(2) Body ์˜์—ญ์— ํฌํ•จ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜ -> Body ์˜์—ญ์— ๋…ธ์ถœ๋˜์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด ํŽ˜์ด์ง€ ์†Œ์Šค๋ฅผ ํ†ตํ•ด ์œ ์ถ”
(3) html ์†Œ์Šค
์ทจ์•ฝํ•œ ์ฝ”๋“œํ™˜๊ฒฝ
  if(isset($_REQUEST["ticket_quantity"]))
{    
   if($_COOKIE["security_level"] != "2")
   {
     if(isset($_REQUEST["ticket_price"]))
       {
         $ticket_price = $_REQUEST["ticket_price"];
       }        
    }    
    $ticket_quantity = abs($_REQUEST["ticket_quantity"]);
    $total_amount = $ticket_quantity * $ticket_price;

ticket_price ๊ฐ’์„ ๋ณ€์กฐํ•ด์„œ ๋ณด๋‚ด๋„ ์˜ฌ๋ฐ”๋ฅธ ์š”์ฒญ์ธ์ง€ ๊ฒ€์ฆ์„ ํ•˜์ง€ ์•Š๊ณ  ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๋ณด๋‚ธ ์š”์ฒญ์„ ๊ทธ๋Œ€๋กœ ์‹ ๋ขฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ์ „ํ•œ ์ฝ”๋“œ ํ™˜๊ฒฝ
 <form action= "/bWAPP/insecure_direct_object_ref_2.php" method= "POST">
  <p>How many movie tickets would you like to order? (15 EUR per ticket)</p>
  <p>I would like to order <input name= "ticket_quantity" value= "1" size= "2"
  type= "text"> tickets.</p>                    --> ์ทจ์•ฝํ• ๊ฒฝ์šฐ ticket_price ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋…ธ์ถœ์‹œํ‚ด
  <button type= "submit" name= "action" value= "order">Confirm</button>
 </form>

๋งค๊ฐœ๋ณ€์ˆ˜์— ticket_price ๊ฐ€๊ฒฉ์„ ๋“œ๋Ÿฌ๋‚ธ ๋ถ€๋ถ„์ด ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์„œ๋ฒ„ ์ธก์—์„œ ๊ฐ’์„ ๋ฐ›์•„์™€ DB์— ์ „๋‹ฌ๋  ๋•Œ๊นŒ์ง€ ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜์ •์„ ๋ชปํ•˜๋„๋ก ๋Œ€์‘ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์™ธ์—๋„ ์ž„์˜์˜ ํ† ํฐ์„ ๋ฐœํ–‰ํ•˜์—ฌ ์ƒํ˜ธ ๊ฐ„์— ์ธ์ฆ์ ˆ์ฐจ๋ฅผ ํ•œ ๋ฒˆ ๋” ๊ฑฐ์น˜๊ฒŒ ๋˜์–ด๋„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์ทจ์•ฝ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™˜๊ฒฝ์—์„œ ์ง„ํ–‰ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

ํ˜„์žฌ ํ‹ฐ์ผ“ ์ฃผ๋ฌธํŽ˜์ด์ง€์—์„œ 1๊ฐœ์˜ ํ‹ฐ์ผ“๋‹น 15์œ ๋กœ ์ •๋„์˜ ๊ฐ€๊ฒฉ์œผ๋กœ ์ฑ…์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ticket_price value = 15๋ผ๋Š” ์ฝ”๋“œ๊ฐ€ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ ์š”์ฒญ์„ ๊ทธ๋Œ€๋กœ ์‹ ๋ขฐํ•˜๊ณ  ์žˆ์œผ๋‹ˆ ticket_price=15๋ผ๊ณ  ์ ํ˜€์žˆ๋Š” ๊ฐ’์„ " 1 " ๋กœ ๋ณ€๊ฒฝํ•ด์„œ ๊ฐ’์„ 1๊ฐœ ํ‹ฐ์ผ“์˜ ๊ฐ’์ธ 1์œ ๋กœ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์„ฑ๊ณต์ ์œผ๋กœ 1๊ฐœ์˜ ํ‹ฐ์ผ“ ๊ฐ€๊ฒฉ์„ 1 EUR๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ฃผ๋ฌธํ•  ์ˆ˜ ์žˆ์Œ์„ ํ™•์ธํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

๋งŒ์•ฝ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ๋  ๊ฒƒ์„ ๋ฏธ์—ฐ์— ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ticket_price๋ผ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ body ์˜์—ญ์— ํฌํ•จ์‹œ์ผœ๋‘์ง€ ์•Š์•„ ๋ณ€์ˆ˜๋ช… ์ž์ฒด๊ฐ€ ํ™•์ธ๋˜์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ html ์†Œ์Šค ์ž์ฒด๋ฅผ ๋’ค์ง€๋‹ค ๋ณด๋ฉด body ์˜์—ญ์— ํฌํ•จ์‹œ์ผœ๋‘์ง€ ์•Š์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๊ณ  ์ฐพ์€ ๋ณ€์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ๋’ค์— "&" ์— ํผ์„ผ๋“œ ๊ตฌ๋ถ„์ž๋กœ ์ถ”๊ฐ€ํ•˜์—ฌ ์š”์ฒญํ•˜๋ฉด ๊ฐ’์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

 

ํ…Œ์ŠคํŠธํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ์ƒํ’ˆ์˜ ๊ธˆ์•ก์„ ์กฐ์ ˆํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ด๋Ÿฌํ•œ ์ ์„ ์ด์šฉํ•ด ๋“ฑ๋ก๋œ ๋ฒˆํ˜ธ๋กœ๋งŒ ์ธ์ฆ์ด ๊ฐ€๋Šฅํ•œ ํ™˜๊ฒฝ์—์„œ 1ํšŒ์šฉ ์ธ์ฆ์ˆ˜๋‹จ์ธ OTP์˜ ์ˆ˜์‹ ๋ฒˆํ˜ธ๋ฅผ ์›ํ•˜๋Š” ๋ฒˆํ˜ธ๋กœ ์กฐ์ž‘ํ•˜์—ฌ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๋Œ€์‘ ๋ฐฉ์•ˆ(์ƒ๋‹จ์˜ Secure SourceCode ์ฐธ๊ณ )
(1) html ์†Œ์Šค์ฝ”๋“œ์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋…ธ์ถœ์‹œํ‚ค์ง€ ์•Š๋„๋ก
(2) ์กฐ์ž‘๋˜๋ฉด ์•ˆ ๋˜๋Š” ์ปจํ…์ธ  ์˜์—ญ์€ ๋ชจ๋‘ DB๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์ธ์ง€ ๋น„๊ตํ•˜์—ฌ ์ ์šฉ (3) ๊ฐ’์ด DB๋กœ ์ „๋‹ฌ๋  ๋•Œ๊นŒ์ง€ ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜์ •์„ ๋ชปํ•˜๋„๋ก
(4) ๊ฐ ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ๊ฐ’์„ ๋‚˜๋ˆ ์ค€๋‹ค๋ฉด token()์„ ๋ถ€์—ฌํ•˜์—ฌ ๋ณ€์กฐ๋˜์ง€ ์•Š๋„๋ก ์œ ์ผ ๊ฐ’ ์ ์šฉ

OWASP top 10 ๋ฒ”์ฃผ์— ์†ํ•ด์žˆ๋Š” ๋งŒํผ ๋นˆ๋„์ˆ˜๊ฐ€ ๋†’์€ ๊ณต๊ฒฉ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

 

๊ตญ๋‚ด ์œ ๋ช… ์‡ผํ•‘๋ชฐ์—์„œ ์‹ค์ œ๋กœ ๋ฐœ์ƒํ–ˆ๋˜ ์ ์ด ์žˆ๋˜ ์ทจ์•ฝ์ ์ž…๋‹ˆ๋‹ค. ์‡ผํ•‘๋ชฐ์„ ํ™•์ธํ•ด๋ณด๋ฉด ๊ฐ€๊ฒฉ / ํฌ์ธํŠธ ์ ์šฉ / ํ• ์ธ% / ์ˆ˜๋Ÿ‰ ๋“ฑ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์™€ ์ ์šฉ์‹œํ‚ค๋Š” ๊ธฐ๋Šฅ๋“ค์ด ๋งŽ์ด ์ž๋ฆฌ ์žก๊ณ  ์žˆ์–ด ์‹œ๋„ํ•ด๋ณผ ๋งŒํ•œ ํฌ์ธํŠธ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๊ธฐ์— ์ทจ์•ฝํ•œ ์ง์ ‘ ๊ฐ์ฒด ์ฐธ์กฐ ์ทจ์•ฝ์ ์˜ ๊ฒฝ์šฐ ์–ด๋– ์–ด๋– ํ•œ ๊ณต๊ฒฉ์ด๊ณ  ์ด๋Ÿฐ ํ”ผํ•ด๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.๋ผ๊ณ  ์ •์˜ ๋‚ด๋ฆฌ๊ธฐ์—๋Š” ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ๋ฒ”์ฃผ๊ฐ€ ๋„ˆ๋ฌด ๋„“์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›๊ฑฐ๋‚˜ ๋ณด์—ฌ์ฃผ๋Š” ๊ณณ๋„ ๊ต‰์žฅํžˆ ๋‹ค์–‘ํ•˜๋ฉฐ ์ธ์ฆ์ˆ˜๋‹จ๋„ ๋‹ค์–‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

์ธ์ฆ์ˆ˜๋‹จ์— ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜๋ผ๋˜๊ฐ€ ๋ฃจํ‹ด์„ ์‰ฝ๊ฒŒ ๋…ธ์ถœํ•ด์„œ๋Š” ์•ˆ๋˜๊ณ ( ๋…ธ์ถœ๋  ๊ฒฝ์šฐ ๊ณต๊ฒฉ์ž๋Š” ์ง์ ‘ ๊ฐ์ฒด์— ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•œ์ง€ ์‹œ๋„๋ฅผ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ ) ๊ธฐ๋ณธ์ ์œผ๋กœ 2๊ฐ€์ง€ ์˜ ์ธ์ฆ์ˆ˜๋‹จ์„ ์ ์šฉํ•ด์„œ ์˜ฌ๋ฐ”๋ฅธ ์š”์ฒญ, ๊ฐ’์ด ๋งž๋Š”์ง€ ํ™•์ธํ•ด์•ผ ๋ฉ๋‹ˆ๋‹ค.

 

๊ฐœ๋ฐœ๋‹จ๊ณ„์—์„œ๋„ ์ด๋Ÿฌํ•œ ๊ฐ๊ฐ์˜ ์˜์—ญ์— ๋Œ€ํ•ด ์˜ฌ๋ฐ”๋ฅธ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ํ•˜๋„๋ก DB์—์„œ ๊ฒ€์ฆ์„ ํ•˜๋Š” ๊ฒƒ๋„ ์‰ฌ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์˜ˆ๊ฒฌํ•˜์ง€ ์•Š๊ณ  ์กฐ์น˜๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋Œ€์ƒ ์‚ฌ์ดํŠธ๋Š” ํฐ ํ˜ผ๋ž€์— ๋น ์งˆ ๊ฐ€๋Šฅ์„ฑ์€ ์ถฉ๋ถ„ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๊ณต์œ ํ•˜๊ธฐ ๋งํฌ
Comment