21๋
์ ์ธ 2019๋
XNUMX์ XNUMX์ผ,
์ด๋ ์ฌ๊ฐํ ์ทจ์ฝ์ ์ด๊ธฐ ๋๋ฌธ์... ์์ฒญ์๋ ์ธ์
์ฟ ํค๋ ํฌํจ๋์ด ์์ต๋๋ค. ๋ช ์๊ฐ ํ, 13๋ฐ์ดํธ๋ฅผ ํํฐ๋งํ๋ ์์ ์์ ์ด ์ด๋ฃจ์ด์ก์ต๋๋ค(๋์ค์ ๋ฐํ์ก์ง๋ง ํค๋๋ฅผ ์กฐ์ํ ์ ์๋ CRLF/ASCII 10, XNUMX์ ์ฃผ์
ํ ๊ฐ๋ฅ์ฑ์ด ์ฌ์ ํ ์์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์์ต๋๋ค. HTTP ์๋ต ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ ๋ ์ค์ํ์ง๋ง ์ฌ์ ํ ๋ถ์พํฉ๋๋ค). ๋์์ ๋ฒ๊ทธ์ ์์ธ์ ์ฐพ์ ์ ๊ฑฐํ๊ธฐ ์ํด ๋ฌธ์ ๋ฅผ ๋ณด์ ๋ถ์๊ฐ์ ๊ฐ๋ฐ์์๊ฒ ์ ๋ฌํ์ต๋๋ค.
Mail.ru ๋ฉ์ผ์ ๋งค์ฐ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์
์ผ๋ก, ์คํ ์์ค(๋ชจ๋ ๋ฌด๋ฃ ์ํํธ์จ์ด ๊ฐ๋ฐ์์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค)์ ์์ฒด ๊ฐ๋ฐ๋ ๋ค์ํ ํ๋ฐํธ์๋/๋ฐฑ์๋ ๊ตฌ์ฑ ์์๊ฐ ์๋ต ์์ฑ์ ํฌํจ๋ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ nginx์ openresty๋ฅผ ์ ์ธํ ๋ชจ๋ ๊ตฌ์ฑ ์์๋ฅผ ์ ์ธํ๊ณ ํธ์ถํ๊ธฐ ์ ์ ๋ฌธ์ ๋ฅผ ํ์งํํ์ต๋๋ค.
OpenResty๋ nginx ๋ด๋ถ์์ Lua ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ ์ ์๋ ๋งค์ฐ ์ธ๊ธฐ ์๋ ํ๋ฌ๊ทธ์ธ์ด๋ฉฐ ์ฌ๋ฌ Mail.ru ํ๋ก์ ํธ์์ ์ฌ์ฉ๋๋ฏ๋ก ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ผ๋ง ํ ๊ทธ๋ค์ ์ง์ ํ ์ด์ ์ ๊ฐ๋ฅํ ๊ฒฐ๊ณผ๋ฅผ ์ดํดํ๊ณ ๊ฐ๋ฐ์์๊ฒ ๊ถ์ฅ ์ฌํญ์ ์ ์ํ๊ธฐ ์ํด ๋ง์นจ๋ด ๋ค์ ๋์์์ต๋๋ค. ์์ค์ฝ๋ ๋ฐ๊ตด์ ์ฐธ์ฌํ์ต๋๋ค.
- nginx์์ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ก ๋ค์ ์ฐ๊ธฐ๋ฅผ ์ฌ์ฉํ ๋ ์ผ๋ถ ๊ตฌ์ฑ์์๋ ๋๋ ํฐ๋ฆฌ ํ์(์๋ง๋ SSRF)์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์์ง๋ง ์ด๋ ์๋ ค์ง ์ฌ์ค์ด๋ฉฐ ๋ค์์ ์ ์ ๊ตฌ์ฑ ๋ถ์๊ธฐ์ ์ํด ๊ฐ์ง๋์ด์ผ ํฉ๋๋ค.
Nginx ์ฆํญ ะธ๊ธฐ์ Yandex์์ ์ ๊ณตํฉ๋๋ค(์, ์ ํฌ๋ ๊ทธ๊ฑธ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค). OpenResty๋ฅผ ์ฌ์ฉํ ๋ ์ด ๊ธฐ๋ฅ์ ๋์น๊ธฐ ์ฝ์ง๋ง ์ด๋ ๊ตฌ์ฑ์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.๊ตฌ์ฑ ์:
location ~ /rewrite { rewrite ^.*$ $arg_x; } location / { root html; index index.html index.htm; }
๊ฒฐ๊ณผ
curl localhost:8337/rewrite?x=/../../../../../../../etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
... - Nginx์๋ ๋ค์ ์ฐ๊ธฐ ๋ผ์ธ์ ๋ ๋ฐ์ดํธ๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ผ์ผํค๋ ๋ฒ๊ทธ๊ฐ ์์ต๋๋ค. ๋ฆฌ๋ค์ด๋ ํธ๊ฐ ๋ฐ์ํ๋ฉด nginx๋ ๋ผ์ธ์ ์ ์ฒด ๊ธธ์ด์ ํด๋นํ๋ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ๋ฅผ ํ ๋นํ์ง๋ง XNUMX๋ฐ์ดํธ๊ฐ ๋ผ์ธ ์ข
๊ฒฐ์์ธ line ํจ์๋ฅผ ํตํด ๊ฑฐ๊ธฐ์ ๋ผ์ธ์ ๋ณต์ฌํ๋ฏ๋ก ๋ผ์ธ์ XNUMX๊น์ง๋ง ๋ณต์ฌ๋ฉ๋๋ค. ๋ฐ์ดํธ; ๋ฒํผ์ ๋๋จธ์ง ๋ถ๋ถ์๋ ์ด๊ธฐํ๋์ง ์์ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ฉ๋๋ค. ์์ธํ ๋ถ์์ ๋ณด์ค ์ ์์ต๋๋ค
์ฌ๊ธฐ์ .๊ตฌ์ฑ ์(^@ XNUMX๋ฐ์ดํธ)
location ~ /memleak { rewrite ^.*$ "^@asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdasdf"; } location / { root html; index index.html index.htm; }
๊ฒฐ๊ณผ
curl localhost:8337/secret -vv
...
curl localhost:8337/memleak -vv
...
Location: http://localhost:8337/secret
...
- Nginx๋ ์๋น์ค ๋ฌธ์ ์ฃผ์
์ผ๋ก๋ถํฐ GET ๋งค๊ฐ๋ณ์๋ฅผ ๋ณดํธํ๊ณ ์ฌ์์ฑ ์ GET ๋งค๊ฐ๋ณ์๋ง ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค. ๋ฐ๋ผ์ nginx์์๋ ์ฌ์ฉ์๊ฐ ์ ์ดํ๋ โโ๋งค๊ฐ๋ณ์๋ฅผ ํตํ ์ฃผ์
์ ์ด์ฉํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. POST ๋งค๊ฐ๋ณ์๋ ๋ณดํธ๋์ง ์์ต๋๋ค. OpenResty๋ฅผ ์ฌ์ฉํ๋ฉด GET ๋ฐ POST ๋งค๊ฐ๋ณ์ ๋ชจ๋๋ก ์์
ํ ์ ์์ผ๋ฏ๋ก OpenResty๋ฅผ ํตํด POST ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ ๋ ํน์ ๋ฌธ์๋ฅผ ์ฝ์
ํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ง๋๋ค.
๊ตฌ์ฑ ์:
location ~ /memleak { rewrite_by_lua_block { ngx.req.read_body(); local args, err = ngx.req.get_post_args(); ngx.req.set_uri( args["url"], true ); } } location / { root html; index index.html index.htm; }
๊ฒฐ๊ณผ :
curl localhost:8337 -d "url=secret" -vv
...
curl localhost:8337 -d "url=%00asdfasdfasdfasdfasdfasdfasdfasdf" -vv
...
Location: http://localhost:8337/{...ะผะพะถะตั ัะพะดะตัะถะฐัั secret...}
...
์ถ๊ฐ ๋ฐ์
์ด ๋ฌธ์ ๋ nginx ๋ฐ OpenResty ๊ฐ๋ฐ์์๊ฒ ๋ณด๊ณ ๋์์ผ๋ฉฐ ๊ฐ๋ฐ์๋ ์ด ๋ฌธ์ ๋ฅผ nginx์ ๋ณด์ ๋ฒ๊ทธ๋ก ๊ฐ์ฃผํ์ง ์์ต๋๋ค. nginx ์์ฒด์๋ ํน์ ๋ฌธ์๋ฅผ ์ฝ์
ํ์ฌ ์ค๋ฅ๋ฅผ ์
์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
ํฌํธ์๊ฑฐ
๊ทธ๋ ๋ค๋ฉด ์ค์๋ ๋ฌด์์ด๋ฉฐ ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฌด์์ ํ ์ ์์ต๋๊น?
nginx์ ๋ฒ๊ทธ๊ฐ ์์๋์? ๋ค, ๊ทธ๋ ์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋ด์ฉ ์ ์ถ์ ์ด๋ค ๊ฒฝ์ฐ์๋ ์ค๋ฅ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
OpenResty์ ๋ฒ๊ทธ๊ฐ ์์๋์? ์, ์ต์ํ OpenResty๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ๋ณด์ ๋ฌธ์ ๋ ์กฐ์ฌ ๋ฐ ๋ฌธ์ํ๋์ง ์์์ต๋๋ค.
OpenResty์ ๊ตฌ์ฑ/์ฌ์ฉ ์ค๋ฅ๊ฐ ์์๋์? ์, ๋ช ์์ ์ธ ์ค๋ช ์ด ์์ผ๋ฉด ์ฌ์ฉ ์ค์ธ ๊ธฐ๋ฅ์ ๋ณด์์ ๋ํด ํ์ธ๋์ง ์์ ๊ฐ์ ์ด ์ด๋ฃจ์ด์ก๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ค์ ์ค ํ์๊ธ์ด 10000๋ฌ๋ฌ์ธ ๋ณด์ ์ทจ์ฝ์ ์ ๋ฌด์์ ๋๊น? ์ฐ๋ฆฌ์๊ฒ ์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์ค์ํ์ง ์์ต๋๋ค. ๋ชจ๋ ์ํํธ์จ์ด, ํนํ ์ฌ๋ฌ ๊ตฌ์ฑ ์์์ ๊ต์ฐจ์ , ํนํ ๋ค์ํ ํ๋ก์ ํธ์ ๊ฐ๋ฐ์๊ฐ ์ ๊ณตํ๋ ์ํํธ์จ์ด์์๋ ๋๊ตฌ๋ ์์ ์ ๋ชจ๋ ๊ธฐ๋ฅ์ด ์๋ ค์ ธ ์๊ณ ๋ฌธ์ํ๋์ด ์์ผ๋ฉฐ ์ค๋ฅ๊ฐ ์๋ค๊ณ ๋ณด์ฅํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ๋ณด์ ์ทจ์ฝ์ ์ ๋ณด์์ ์ํฅ์ ๋ฏธ์น๋ ๊ณณ์์ ์ ํํ๊ฒ ๋ฐ์ํฉ๋๋ค.
์ด๋ค ๊ฒฝ์ฐ๋ ๋ช ์์ ์ธ ์ง์นจ์ด ์๊ณ ์ด๊ฒ์ด ํ์ํ์ง ์๋ค๋ ๋ช ํํ ์ดํด๊ฐ ์๋ ํ ์ธ๋ถ ๋ชจ๋/API์ ๋ค์ด๊ฐ๋ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฅํ ํ ๋ง์ด ์ ๊ทํํ๊ฑฐ๋ ์ ํ/ํํฐ๋งํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์๋ผํ
๊ฒฝํ์์
๋ฒ๊ทธ ํ์๊ธ - ๋ฒ๊ทธ ์ฌ๋ฅ ๋ํ
๋ฒ๊ทธ ๋ณด๊ณ ์ - ์ค๋ฅ ์๋ฆผ
๋ฆฌ๋๋ ์
- ๋ฆฌ๋๋ ์
์คํ ์์ค - ์คํ ์์ค
์ ์คํ - ์ค์์ ๋ํด ๋
ธ๋ ฅํ๋ผ
์ถ์ฒ : habr.com