[SegFault] Authentication Bypass (Admin)
Admin is Mine.
admin ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธํ์!
๋ฌธ์ ํ์
- ์์ ํ์ด์ง์ ์ ์ํ๋ฉด ์๋์ ๊ฐ์ ํ๋ฉด์ด ๋์จ๋ค.
- ์๊ณ ์๋ ๊ณ์ : [ID/PW] : doldol / dol1234
- Burp Suite์ ์ด์ฉํ์ฌ ์ฌ์ดํธ ์ ์ ๊ณผ์ ์ ์ํ์ฝ๋(Status code) ํ์ธ
- 200 OK : ์ ์์ ์ธ ์๋ต
- ๋ก๊ทธ์ธ ๊ณผ์ ์ ๊ตฌ์กฐ๋ฅผ ์๊ธฐ ์ํด, ๋จผ์ ์๊ณ ์๋ ์ ๋ณด๋ก ๋ก๊ทธ์ธ ํด๋ณธ๋ค.
- ์ ๊ณต๋ ID/PW๋ฅผ ์ ๋ ฅํ์์๋ ํด๋น ์ฐฝ์์ ๋์ด๊ฐ์ง ์์์ ํ์ธ, ๋ก๊ทธ์ธ์ด ์งํ๋์ง ์๋๋ค?!
- ๋ก๊ทธ์ธ ๊ณผ์ ์ ํ์คํ ๋ฆฌ(HTTP history) ํ์ธ ํด๋ณด์ !
- ID์ PW๋ฅผ ์ ๋ ฅํ์์๋ ํ๋ผ๋ฏธํฐ(Params)๊ฐ ๋ค์ด๊ฐ์ง ์๊ณ ์์์ ํ์ธํ ์ ์๋ค.
- ์์ฒญ(Request)๊ณผ ์๋ต(Response)์ ์ดํด๋ณด์ !
<script>location.href='login.php';</script>
- ๊ฐ์ ๋ก ๋ฆฌ๋๋ ์ ์ํค๊ณ ์์์ ํ์ธํ ์ ์๋ค.
<script src="js/login.js">
- login.js์ด ์กด์ฌํ๋ ๊ฒ์ ํ์ธํ๊ณ ,, ๋ด๋ถ๋ฅผ ๋ค์ฌ๋ค ๋ณธ๋ค.
const userId = loginForm.querySelector("#inputUserid").value;
const userPw = loginForm.querySelector("#inputPassword").value;
const url = `/4/loginProc.php?userId=${userId}&userPw=${userPw}`;
- ์์ login.js ๋ฅผ ํตํด loginProc์ผ๋ก์ parameter ์ ์ก ๋ฐฉ์์ ํ์ธํ ์ ์๋ค.
ํ์ด ๊ณผ์ (ํด๊ฒฐ ๋ฐฉ์)
1. intercopt ํ, ๋ธ๋ผ์ฐ์ ์ฐฝ ๋ฐ ํ์คํ ๋ฆฌ(HTTP history) ํ์ธํด๋ณธ๋ค.
2. ๊ฒฝ๋ก๋ฅผ /4/loginProc.php๋ก ์ค์ ํ๊ณ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ด์์ Forward ํด์ค๋ค.
1. (์ ๊ณต๋) ๋ก๊ทธ์ธ ์๋
2. ์ธํฐ์ ํธ(Intercept) : /4/
3. GET /4/loginProc.php?userId=doldol&userPw=dol1234 ์ผ๋ก ๋ณ๊ฒฝ
4. Forward -> GET /4/index.php
5. GET /4/loginProc.php?userId=admin&userPw=dol1234 ์ผ๋ก ๋ณ๊ฒฝ
6. Forward -> ์๋ก๊ณ ์นจ
3. ๊ฐ์ ๋ก ๋ก๊ทธ์ธ ์์ผ์ฃผ๋ฉด, ๋ก๊ทธ์ธ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์? ๊ฐ์ ๋ก ๋ก๊ทธ์ธ ์์ผ์ค๋ค๋ฉด ๋ก๊ทธ์ธ์ด ๋๋ ๊ฒ์ผ๊น?
์ด ๋ฌธ์ ์ ๊ฒฝ์ฐ ์ด๋ฏธ ์ ๋ต(๋ก๊ทธ์ธ์ด ๋๊ณ ์์๋ค)์ ๋ฟ๋ ค์ฃผ๊ณ ์์๋ค.
ํ์ง๋ง!
ํ ํฐ์ด ์๋ ๊ฒฝ์ฐ js์ ์ํด์ ๋ฆฌ๋๋ ์ ์ํค๊ณ ์์์ ๋ฟ์ด๋ค.
๊ทธ๋์ ํ ํฐ ๋ฆฌ๋๋ ์ ์ ๊ฐ์ ๋ก ์์ผ์ฃผ๋ฉด ๋ก๊ทธ์ธ์ด ๋๋ ๊ฒ ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ์ด๋ค.
4. ๋ธ๋ผ์ฐ์ ๋ฅผ ์๋ก๊ณ ์นจํ๋ฉด Flag๊ฐ ๋์ค๋๊ฒ์ ํ์ธํ ์ ์๋ค.
ํ์ด ๋ฐฉ์์ ์ค๋ฅ
์ฌ์ค ํด๋น ํ์ด ๋ฐฉ๋ฒ์ ์๋ชป๋์๋ค.
์์ ํ์ด๋ก ํ์ด์ก๊ธฐ์ ๋์ด๊ฐ ๋ค์ ๊นจ๋ฌ์๋ค๋ ์ฌ์ค์ ๋ฐ์ฑํ๋ฉฐ ์ ๋ฆฌํด๋ณด๋ ค ํ๋ค.
์๋ชป๋ ํ์ด (์ ๊ฐ๋ฅํ๋๊ฐ?)
ํด๋น ๋ฌธ์ ๊ฐ ์์ ํ์ด ๋ฐฉ๋ฒ์ผ๋ก ํ๋ฆฐ ์ด์ ๋ฅผ ๋จผ์ ์๊ฐํด๋ณด์.
๊ธฐ์กด์ ์ฃผ์ด์ง id/pw๋ก ๋ก๊ทธ์ธํ์ฌ ์ธ์ฆ ์ฑ๊ณต์์ ์ธ์ ์๋ ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ด ๋ด๊ธด๋ค.
$_SESSION['loginUser'] = 'doldol';
$_SESSION['loginStatus'] = 'ok';
์ฌ๊ธฐ์ ์๋๋ผ๋ฉด ๋ก๊ทธ์ธ ์ธ์ฆ์ ์คํจํ๋ ๊ฒฝ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ด ํ์ํ๋ค.
$_SESSION['loginStatus'] = 'ok'; ์ ๊ฐ์
$_SESSION['loginStatus'] = 'fail'; ๊ณผ ๊ฐ์ด fail๋ก ๋ฐ๊ฟ์ค์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ๋ณธ ๋ฌธ์ ์ ๊ฒฝ์ฐ ๋ก๊ทธ์ธ ์ธ์ฆ ์คํจ์ ์ ๋ฃ์ด ์ค ๊ฒ์ด๋ค.(์ ๋ชป ๋๊ฒ)
๊ทธ๋์ admin์ผ๋ก ์ฌ์์ฒญ์ ์ธ์ ์ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์๋ค.
$_SESSION['loginUser'] = 'admin';
$_SESSION['loginStatus'] = 'ok';
์์ ๊ฐ์ด ๋ ์๊ฐ ๊ฒฝ์ฐ์ด๊ธฐ ๋๋ฌธ์ admin์ผ๋ก ๋ก๊ทธ์ธ์ด ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ด๋ค.
์ฌ์ค ๋ฌธ์ ์ ๋ ๋ค๋ฅธ ์ทจ์ฝ์ ์ ์ํด ๋ฌธ์ ๊ฐ ํ๋ฆฐ ๊ฒ์ด์๊ณ , ํด๋น ๋ฌธ์ ์ ์๋์๋ ๋ฌ๋๋ค๋ ๊ฒ์ด๋ค.
๋ฌธ์ ์ ์๋ ์๋ (์ฌ๋ฐ๋ฅธ ํ์ด๋ฒ)
๋ณธ ๋ฌธ์ ์ ์ฌ๋ฐ๋ฅธ ํ์ด๋ฒ์ ๋ค์๊ณผ ๊ฐ์ด 2๊ฐ์ง ์ด๋ค.
1. fail ๋ก ์ฒ๋ฆฌ๋์ด ์๋ ์๋ต์ ๋ณ์กฐํ์ฌ ok๋ก ๋ฐ๊พธ์ด ์งํํ๋ค.
2. ์๋ต์ javascript๋ฅผ ์ญ์ ํ์ฌ ๋ฆฌ๋๋ ์ ์ ์ ์งํ๋ค.
(๊ฒฐ๊ตญ ์๋ต์ ๋ณ์กฐํ๋ค๋ ๊ฒ์ผ๋ก ๋ณด๋ฉด ๊ฐ์ ํ์ด๋ฒ์ด๋ค.)
์ทจ์ฝ์ ์ ๊ดํ ๊ณ ์ฐฐ
๋ณธ ๋ฌธ์ ์ ์ทจ์ฝ์ ์ ์ธ์ฆ ์ทจ์ฝ์ ์ผ๋ก์ ์๋ต ๋ณ์กฐ๋ฅผ ํตํ์ฌ ์ธ์ฆ์ ๋ฌด์ํ๋ ๊ฒ์ ์๋ค.
์๋ต ๋ณ์กฐ (Response Mod) ๋ฅผ ํตํ์ฌ ๋ก๊ทธ์ธ์ ์คํจํ์ฌ $_SESSION['loginStatus'] = fail ์ด๋ผ๊ณ ๋์ค๊ณ ์๋ ์๋ต์ $_SESSION['loginStatus'] = ok๋ก ๋ณ์กฐํ๊ฑฐ๋, ๊ฐ์ ๋ก ํ์ด์ง๋ฅผ ๋ฆฌ๋๋ ์ ์ํค๊ณ ์๋ javascript๋ฅผ ์ญ์ ํ๋ฏ๋ก์จ ์งํ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์ ์๊ฐํด๋ณผ ์ ์ ํด๋น ์ทจ์ฝ์ ์ ๊ฒฝ์ฐ ์ด๋ฐ ๊ฒ๋ ์๋ค ๋ผ๊ณ ์๋ ค์ฃผ๊ธฐ ์ํด ์ธ์์ ์ผ๋ก ๋ง๋ ์ทจ์ฝ์ ์ผ๋ก์ ํ๋ก๊ทธ๋๋ฐ ์์ฒด๋ฅผ ์๋ชปํ ๊ฒ์ด๋ผ๊ณ ํ ์ ์๋ค. ์ผ๋ฐ์ ์ผ๋ก๋ ๋์ค์ง ์๋ ์ทจ์ฝ์ ์ด๋ผ๋ ๊ฒ์ด๋ค.
login ์ฒ๋ฆฌ ๊ตฌํ
์ฌ๋ฐ๋ฅธ ์์ : id/pw -> ์ธ์ฆ ์ฑ๊ณต -> session=admin
ํด๋น ๋ฌธ์ ์ ๊ฒฝ์ฐ
์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ผ๋จ ์ธ์ ์ ๋ฃ์ด๋๋ค. (session=admin) -> id/pw ๊ฒ์ฆ
์์ ๊ฐ์ด ์ด๋ฏธ ์ธ์ ์ ๊ฐ์ด ๋ค์ด์๋ ๊ฒฝ์ฐ์ ํด๋นํ๋ ์ทจ์ฝ์ ์ผ๋ก์ ์นํ์ด์ง์์๋ ๋ง์ด ๋์ค์ง ์๋ ์ทจ์ฝ์ ์ด๋ผ๊ณ ํ๋ค.(ํ์ง๋ง ๋ชจ๋ฐ์ผ ์ฑ์์๋ ์๊ฐ๋ณด๋ค ๋ง์ด ๋์ค๋ ์ทจ์ฝ์ ์ด๋ผ๊ณ ํ๋ ์๊ฐํด๋ณผ๋ง ํ๋ค.)
์ง๋ฌธ ํ์, ์์ ๋ฐ ๋ณด์์ ๋ํ ์ง์ ํ์