ํฐ์คํ ๋ฆฌ ๋ทฐ
๊ฐ์
"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์์ ๊ฒ์ฆ์ ํ๋ ๊ฒ๋ ์ฌ์ด ์ผ์ด ์๋๋๋ค. ํ์ง๋ง ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์๊ฒฌํ์ง ์๊ณ ์กฐ์น๋ฅผ ํ์ง ์๋๋ค๋ฉด ๋์ ์ฌ์ดํธ๋ ํฐ ํผ๋์ ๋น ์ง ๊ฐ๋ฅ์ฑ์ ์ถฉ๋ถํด ๋ณด์ ๋๋ค.
'WEB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
FTP(File Transfer Protocol) ์ทจ์ฝ์ ๊ณต๊ฒฉ (0) | 2020.10.28 |
---|---|
Heartbleed(CVE-2014-0160) ์ทจ์ฝ์ (0) | 2020.10.27 |
WebDAV ์ทจ์ฝ์ (0) | 2020.10.25 |
robots.txt ์ ๋ณด ๋ ธ์ถ ์ทจ์ฝ์ (0) | 2020.10.24 |
ShellShock(CVE-2014-6271) ์ทจ์ฝ์ (0) | 2020.10.23 |