
ΠΡΠ΅Π΄ΠΈ Π³ΠΎΠ΄ΠΈΠ½Π°, Π½Π° 21 ΠΌΠ°ΡΡ 2019 Π³., Π² Π² HackerOne ΠΏΠΎΡΡΡΠΏΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠ±ΡΠΎ ΠΎΡ . ΠΡΠΈ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° Π½ΡΠ»Π΅Π² Π±Π°ΠΉΡ (ASCII 0) Π² POST ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π½Π° Π΅Π΄ΠΈΠ½ ΠΎΡ API Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ Π½Π° ΡΠ΅Π± ΠΏΠΎΡΠ°ΡΠ°, ΠΊΠΎΡΡΠΎ Π²ΡΡΡΠ°ΡΠ΅ HTTP ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π°Π½Π΅, Π² Π΄Π°Π½Π½ΠΈΡΠ΅ Π½Π° ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π°Π½Π΅ΡΠΎ ΡΠ΅ ΠΏΠΎΡΠ²ΡΠ²Π°Ρ
Π° ΠΏΠ°ΡΡΠ΅ΡΠ° Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° ΠΏΠ°ΠΌΠ΅Ρ, Π² ΠΊΠΎΠΈΡΠΎ Π½Π°ΠΉ-ΡΠ΅ΡΡΠΎ ΡΠ΅ ΡΠ°Π·ΠΊΡΠΈΠ²Π°Ρ
Π° ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠΈ ΠΎΡ GET ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΈ Π·Π°Π³Π»Π°Π²ΠΊΠΈ Π½Π° Π΄ΡΡΠ³ΠΈ Π·Π°ΡΠ²ΠΊΠΈ ΠΊΡΠΌ ΡΡΡΠΈΡ ΡΡΡΠ²ΡΡ.
Π’ΠΎΠ²Π° Π΅ ΠΊΡΠΈΡΠΈΡΠ½Π° ΡΡΠ·Π²ΠΈΠΌΠΎΡΡ, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ°Ρ ΠΈ ΡΠ΅ΡΠΈΠΉΠ½ΠΈ Π±ΠΈΡΠΊΠ²ΠΈΡΠΊΠΈ. Π‘Π»Π΅Π΄ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°ΡΠ° Π±Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ ΡΠΈΠ»ΡΡΠΈΡΠ°ΡΠ΅ Π½ΡΠ»Π΅Π²ΠΈΡ Π±Π°ΠΉΡ (ΠΊΠ°ΠΊΡΠΎ Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ ΡΠ΅ ΠΎΠΊΠ°Π·Π°, ΡΠΎΠ²Π° Π±Π΅ΡΠ΅ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΎΡΡΠ°Π²Π°ΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡ Π½Π° CRLF / ASCII 13, 10, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°Π³Π»Π°Π²ΠΊΠΈΡΠ΅ ΠΈ Π΄Π°Π½Π½ΠΈΡΠ΅ Π½Π° HTTP ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ°; ΡΠΎΠ²Π° Π΅ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΊΡΠΈΡΠΈΡΠ½ΠΎ, Π½ΠΎ Π²ΡΠ΅ ΠΏΠ°ΠΊ Π½Π΅ΠΏΡΠΈΡΡΠ½ΠΎ). Π ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡΡ Π±Π΅ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π΄Π΅Π½ Π½Π° Π°Π½Π°Π»ΠΈΡΠΈΡΠΈ ΠΏΠΎ ΡΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ° ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π·Π° ΠΏΡΠΎΡΡΠ²Π°Π½Π΅ ΠΈ ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΈΡΠΈΠ½ΠΈΡΠ΅ Π·Π° Π²ΡΠ·Π½ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π±ΡΠ³Π°.
ΠΠΎΡΠ°ΡΠ° Mail.ru Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΠΎΠΆΠ΅Π½ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, ΠΏΡΠΈ ΡΠΎΡΠΌΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ°ΡΡΠ²Π°Ρ Π³ΠΎΠ»ΡΠΌΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΠΎΠ½ΡΠ΅Π½Π΄/Π±Π΅ΠΊΠ΅Π½Π΄ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ, ΠΊΠ°ΠΊΡΠΎ Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ (Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠΈΠΌ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ Π½Π° ΡΠ²ΠΎΠ±ΠΎΠ΄Π΅Π½ ΡΠΎΡΡΡΠ΅Ρ), ΡΠ°ΠΊΠ° ΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ. Π£ΡΠΏΡΡ ΠΌΠ΅ Π΄Π° ΠΈΠ·ΠΊΠ»ΡΡΠΈΠΌ Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ ΠΎΡΠ²Π΅Π½ nginx ΠΈ openresty ΠΈ Π΄Π° Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π΄ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ Π² OpenResty ΡΠΊΡΠΈΠΏΡΠ°, ΠΊΠΎΠΉΡΠΎ Π½Π΅ ΡΠ΅ Π΄ΡΡΠΆΠ΅ΡΠ΅ ΡΠ°ΠΊΠ°, ΠΊΠ°ΠΊΡΠΎ ΡΠ΅ ΠΎΡΠ°ΠΊΠ²Π°ΡΠ΅ (Π½Π΅ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° Π²ΠΊΠ°ΡΠ°ΡΠ΅ Π½ΡΠ»Π΅Π² Π±Π°ΠΉΡ ΠΈΠ»ΠΈ Π½ΠΎΠ² ΡΠ΅Π΄ ΡΡΠ΅Π· GET ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Ρ ΠΏΡΠ΅Π·Π°ΠΏΠΈΡ Π² ngx_http_rewrite_module, ΠΊΠΎΠΉΡΠΎ ΡΠΏΠΎΡΠ΅Π΄ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΈ Π±ΠΈ ΡΡΡΠ±Π²Π°Π»ΠΎ Π΄Π° ΡΠ°Π±ΠΎΡΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΎ). ΠΡΡ Π° ΠΎΡΡΡΡΠ°Π½Π΅Π½ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΈΡΠΈ, Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΎ Π±Π΅ΡΠ΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΎ ΡΡΡΠΎΠ³ΠΎ ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ ΠΈ Π±Π΅ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½ΠΎ, ΡΠ΅ ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ ΠΏΡΠ΅ΠΌΠ°Ρ Π²Π° Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈ Π²Π΅ΠΊΡΠΎΡΠΈ. ΠΠΎ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΡΡ, ΠΊΠΎΠΉΡΠΎ Π²ΠΎΠ΄Π΅ΡΠ΅ Π΄ΠΎ ΠΈΠ·ΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ°, ΠΎΡΡΠ°Π½Π° Π·Π°Π³Π°Π΄ΠΊΠ°. Π‘Π»Π΅Π΄ ΠΌΠ΅ΡΠ΅Ρ Π±ΡΠ³ΡΠ΅ΠΏΠΎΡΡΡΡ Π±Π΅ΡΠ΅ Π·Π°ΡΠ²ΠΎΡΠ΅Π½ ΠΊΠ°ΡΠΎ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½, Π° Π°Π½Π°Π»ΠΈΠ·ΡΡ Π½Π° ΠΏΡΠΈΡΠΈΠ½ΠΈΡΠ΅ Π·Π° Π²ΡΠ·Π½ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π±ΡΠ³Π° Π±Π΅ΡΠ΅ ΠΎΡΠ»ΠΎΠΆΠ΅Π½ Π·Π° ΠΏΠΎ-Π΄ΠΎΠ±ΡΠΈ Π²ΡΠ΅ΠΌΠ΅Π½Π°.
OpenResty Π΅ Π΄ΠΎΡΡΠ° ΠΏΠΎΠΏΡΠ»ΡΡΠ΅Π½ ΠΏΠ»ΡΠ³ΠΈΠ½, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ ΠΏΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Lua ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ Π²ΡΡΡΠ΅ Π² nginx, ΠΈ ΡΠΎΠΉ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π° Mail.ru, Π·Π°ΡΠΎΠ²Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΡΡ Π½Π΅ ΡΠ΅ ΡΡΠΈΡΠ°ΡΠ΅ Π·Π° ΡΠ΅ΡΠ΅Π½. Π ΡΠ»Π΅Π΄ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΎΡΠ½ΠΎΠ²ΠΎ ΡΠ΅ Π²ΡΡΠ½Π°Ρ Π° Π½Π° Π½Π΅Π³ΠΎ, Π·Π° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ°Ρ ΠΈΡΡΠΈΠ½ΡΠΊΠΈΡΠ΅ ΠΏΡΠΈΡΠΈΠ½ΠΈ, Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡ ΠΈ Π΄Π° ΡΡΡΡΠ°Π²ΡΡ ΠΏΡΠ΅ΠΏΠΎΡΡΠΊΠΈ Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅. Π ΡΠ°Π·ΠΊΠΎΠΏΠΊΠΈΡΠ΅ Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ ΡΡΠ°ΡΡΠ²Π°Ρ Π° ΠΈ Π£ΡΡΠ°Π½ΠΎΠ²Π΅Π½ΠΎ Π΅, ΡΠ΅:
- Π nginx, ΠΏΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° rewrite Ρ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ Π΄Π°Π½Π½ΠΈ, ΠΈΠΌΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° directory traversal (ΠΈ Π²Π΅ΡΠΎΡΡΠ½ΠΎ SSRF) Π² Π½ΡΠΊΠΎΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, Π½ΠΎ ΡΠΎΠ²Π° Π΅ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΡΠ°ΠΊΡ ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΠΎΡΠΊΡΠΈΡΠΎ ΠΎΡ ΡΡΠ°ΡΠΈΡΠ½ΠΈΡΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠΈ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π² ΠΈ ΠΎΡ Π―Π½Π΄Π΅ΠΊΡ (Π΄Π°, Π½ΠΈΠ΅ ΡΡΡΠΎ Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ). ΠΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° 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 ΠΈΠΌΠ° Π³ΡΠ΅ΡΠΊΠ°, ΠΊΠΎΡΡΠΎ Π²ΠΎΠ΄ΠΈ Π΄ΠΎ ΠΈΠ·ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ°, Π°ΠΊΠΎ ΡΠ΅Π΄ΡΡ rewrite ΡΡΠ΄ΡΡΠΆΠ° Π½ΡΠ»Π΅Π² Π±Π°ΠΉΡ. ΠΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΠ΅Π΄ΠΈΡΠ΅ΠΊΡ, nginx ΠΎΡΠ΄Π΅Π»Ρ Π½ΠΎΠ² Π±ΡΡΠ΅Ρ ΠΏΠ°ΠΌΠ΅Ρ, ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π°Ρ Π½Π° ΠΏΡΠ»Π½Π°ΡΠ° Π΄ΡΠ»ΠΆΠΈΠ½Π° Π½Π° ΡΠ΅Π΄Π°, Π½ΠΎ ΠΊΠΎΠΏΠΈΡΠ° ΡΠ΅Π΄Π° ΡΡΠ΅Π· ΡΡΡΠΈΠ½Π³ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΡ, Π² ΠΊΠΎΡΡΠΎ Π½ΡΠ»Π΅Π²ΠΈΡΡ Π±Π°ΠΉΡ Π΅ ΡΠ΅ΡΠΌΠΈΠ½Π°ΡΠΎΡ Π½Π° ΡΠ΅Π΄Π°, ΠΏΠΎΡΠ°Π΄ΠΈ ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅Π΄ΡΡ ΡΠ΅ ΠΊΠΎΠΏΠΈΡΠ° ΡΠ°ΠΌΠΎ Π΄ΠΎ Π½ΡΠ»Π΅Π²ΠΈΡ Π±Π°ΠΉΡ, Π° ΠΎΡΡΠ°ΡΡΠΊΡΡ ΠΎΡ Π±ΡΡΠ΅ΡΠ° ΡΡΠ΄ΡΡΠΆΠ° Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Π΄Π°Π½Π½ΠΈ. ΠΠΎΠ΄ΡΠΎΠ±Π΅Π½ Π°Π½Π°Π»ΠΈΠ· ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π½Π°ΠΌΠ΅ΡΠ΅Π½ .
ΠΏΡΠΈΠΌΠ΅ΡΠ½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ (^@ Π½ΡΠ»Π΅Π² Π±Π°ΠΉΡ)
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 ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ ΠΎΡ ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡ Π½Π° ΡΠ»ΡΠΆΠ΅Π±Π½ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈ ΠΈ Π΄Π°Π²Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π² rewrite ΡΠ°ΠΌΠΎ Π½Π° GET ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ, Π΅ΠΊΡΠΏΠ»ΠΎΠ°ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡ ΡΡΠ΅Π· ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°Π½ΠΈ ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π² nginx Π½Π΅ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ. POST ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ ΠΎΠ±Π°ΡΠ΅ Π½Π΅ ΡΠ° Π·Π°ΡΠΈΡΠ΅Π½ΠΈ. OpenResty ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΡΠ°Π±ΠΎΡΠ° ΠΈ Ρ GET, ΠΈ Ρ POST ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, Π·Π°ΡΠΎΠ²Π° ΠΏΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° POST ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΏΡΠ΅Π· OpenResty ΡΠ΅ ΠΏΠΎΡΠ²ΡΠ²Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡ Π½Π° ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈ.
ΠΏΡΠΈΠΌΠ΅ΡΠ½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ:
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=asdfasdfasdfasdfasdfasdfasdfasdf" -vv
...
Location: http://localhost:8337/{...ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ΄ΡΡΠΆΠ° secret...}
...
Π‘Π»Π΅Π΄Π²Π°ΡΠ° ΡΠ΅Π°ΠΊΡΠΈΡ
ΠΡΠΎΠ±Π»Π΅ΠΌΡΡ Π±Π΅ΡΠ΅ Π΄ΠΎΠΊΠ»Π°Π΄Π²Π°Π½ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° nginx ΠΈ OpenResty, ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π΅ ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΊΠ°ΡΠΎ Π³ΡΠ΅ΡΠΊΠ° Π² ΡΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ° Π² nginx, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π² ΡΠ°ΠΌΠΈΡ nginx Π½ΡΠΌΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° Π΅ΠΊΡΠΏΠ»ΠΎΠ°ΡΠ°ΡΠΈΡ Π½Π° Π³ΡΠ΅ΡΠΊΠ°ΡΠ° ΡΡΠ΅Π· ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡ Π½Π° ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈ, ΠΏΠΎΠΏΡΠ°Π²ΠΊΠ° Π±Π΅ΡΠ΅ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½Π° Π½Π° 16 Π΄Π΅ΠΊΠ΅ΠΌΠ²ΡΠΈ. ΠΠ° 4 ΠΌΠ΅ΡΠ΅ΡΠ° ΠΎΡ ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π½Π° ΡΠ΅ΠΏΠΎΡΡΠ°, Π² OpenResty ΡΡΡΠΎ Π½Π΅ Π±ΡΡ Π° Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΈ Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ, Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΠΈΠΌΠ°ΡΠ΅ ΡΠ°Π·Π±ΠΈΡΠ°ΡΠ΅Π»ΡΡΠ²ΠΎ, ΡΠ΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° ngx.req.set_uri(). ΠΠ° 18 ΠΌΠ°ΡΡ 2020 ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Ρ ΠΌΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, Π½Π° 21 ΠΌΠ°ΡΡ OpenResty ΠΈΠ·Π΄Π°Π΄Π΅ , ΠΊΠΎΡΡΠΎ Π΄ΠΎΠ±Π°Π²Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° URI.
Portswigger Π΄ΠΎΠ±ΡΠ° ΡΡΠ°ΡΠΈΡ ΠΈ ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ ΠΎΡ OpenResty ΠΈ Nginx (Π²ΡΡΠ½ΠΎ, ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΡΡ, ΡΠ΅ ΡΠ΅ ΡΠ°Π·ΠΊΡΠΈΠ²Π° ΡΠ°ΠΌΠΎ ΠΌΠ°Π»ΠΊΠ° ΡΠ°ΡΡ ΠΎΡ ΠΏΠ°ΠΌΠ΅ΡΡΠ°, Π΅ Π½Π΅Π²Π΅ΡΠ΅Π½ ΠΈ ΠΏΠΎΠ΄Π²Π΅ΠΆΠ΄Π°Ρ; ΡΠΎΠ²Π° ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ ΠΎΡ Π΄ΡΠ»ΠΆΠΈΠ½Π°ΡΠ° Π½Π° ΡΠ΅Π΄Π°, ΡΠ»Π΅Π΄Π²Π°Ρ Π½ΡΠ»Π΅Π²ΠΈΡ Π±Π°ΠΉΡ, ΠΈ ΠΏΡΠΈ ΠΎΡΡΡΡΡΠ²ΠΈΠ΅ Π½Π° ΡΠ²Π½ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π·Π° Π΄ΡΠ»ΠΆΠΈΠ½Π°, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ° ΠΎΡ Π°ΡΠ°ΠΊΡΠ²Π°ΡΠΈΡ).
ΠΠ°ΠΊΠ²Π° Π±Π΅ΡΠ΅ Π³ΡΠ΅ΡΠΊΠ°ΡΠ° ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ, Π·Π° Π΄Π° Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΠΌ?
ΠΠΌΠ°ΡΠ΅ Π»ΠΈ Π³ΡΠ΅ΡΠΊΠ° Π² nginx? ΠΠ°, ΠΈΠΌΠ°ΡΠ΅, Π·Π°ΡΠΎΡΠΎ ΠΈΠ·ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ ΠΎΡ ΠΏΠ°ΠΌΠ΅ΡΡΠ° Π΅ Π²ΡΠ² Π²ΡΠ΅ΠΊΠΈ ΡΠ»ΡΡΠ°ΠΉ Π³ΡΠ΅ΡΠΊΠ°.
ΠΠΌΠ°ΡΠ΅ Π»ΠΈ Π³ΡΠ΅ΡΠΊΠ° Π² OpenResty? ΠΠ°, ΠΏΠΎΠ½Π΅ΠΆΠ΅ Π²ΡΠΏΡΠΎΡΡΡ Π·Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡΠ° Π½Π° ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ Π½Π° OpenResty Π½Π΅ Π±Π΅ΡΠ΅ ΠΈΠ·ΡΠ»Π΅Π΄Π²Π°Π½ ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠ°Π½.
ΠΠΎΠΏΡΡΠ½Π°ΡΠ° Π»ΠΈ Π΅ Π³ΡΠ΅ΡΠΊΠ° Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° / ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° OpenResty? ΠΠ°, Π·Π°ΡΠΎΡΠΎ ΠΏΡΠΈ Π»ΠΈΠΏΡΠ° Π½Π° ΡΡΠ½ΠΎ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅, Π±Π΅ΡΠ΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΎ Π½Π΅ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½ΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡΠ° Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ.
ΠΠΎΡ ΠΎΡ ΡΠ΅Π·ΠΈ Π³ΡΠ΅ΡΠΊΠΈ Π΅ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡ Ρ Π±Π°Π³Π° Π½Π° $10000? ΠΠ° Π½Π°Ρ ΡΠΎΠ²Π° Π΄ΠΎ ΠΈΠ·Π²Π΅ΡΡΠ½Π° ΡΡΠ΅ΠΏΠ΅Π½ Π½Π΅ Π΅ Π²Π°ΠΆΠ½ΠΎ. ΠΡΠ² Π²ΡΡΠΊΠΎ ΠΠ, ΠΎΡΠΎΠ±Π΅Π½ΠΎ Π½Π° Π³ΡΠ°Π½ΠΈΡΠ°ΡΠ° Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ΠΈ ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ, Π½ΠΈΠΊΠΎΠΉ ΠΈ Π½ΠΈΠΊΠΎΠ³Π° Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π³Π°ΡΠ°Π½ΡΠΈΡΠ°, ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΠΎΡΠΎΠ±Π΅Π½ΠΎΡΡΠΈ Π½Π° ΡΡΡ Π½Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ° ΡΠ° ΠΈΠ·Π²Π΅ΡΡΠ½ΠΈ ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠ°Π½ΠΈ ΠΈ ΡΠ΅ Π½ΡΠΌΠ° Π³ΡΠ΅ΡΠΊΠΈ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ Π²ΡΡΠΊΠ° ΡΡΠ·Π²ΠΈΠΌΠΎΡΡ Π·Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡΠ° Π²ΡΠ·Π½ΠΈΠΊΠ²Π° ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΌ, ΠΊΡΠ΄Π΅ΡΠΎ Π·Π°ΡΡΠ³Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ°.
ΠΡΠ² Π²ΡΠ΅ΠΊΠΈ ΡΠ»ΡΡΠ°ΠΉ, Π΄ΠΎΠ±ΡΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ° Π΅ Π΄Π° ΡΠ΅ Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·ΠΈΡΠ°Ρ ΠΈΠ»ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ°Ρ/ΡΠΈΠ»ΡΡΠΈΡΠ°Ρ Π²Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΎΡΠΈΠ²Π°Ρ ΠΊΡΠΌ Π²ΡΠ½ΡΠ΅Π½ ΠΌΠΎΠ΄ΡΠ»/API, Π°ΠΊΠΎ Π½ΡΠΌΠ° ΡΡΠ½ΠΈ ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΠΈ Π΅Π΄Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎ ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅, ΡΠ΅ ΡΠΎΠ²Π° Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ.
Errata
ΠΠΎ ΠΎΠΏΠΈΡ , Π·Π° Π΄Π° ΡΠ΅ Π·Π°ΠΏΠ°Π·ΠΈ ΡΠΈΡΡΠΎΡΠ°ΡΠ° Π½Π° Π΅Π·ΠΈΠΊΠ°:
Π±Π°Π³ Π±Π°ΡΠ½ΡΠΈ β ΠΊΠΎΠ½ΠΊΡΡΡ Π·Π° ΠΎΡΠΊΡΠΈΠ²Π°Π½Π΅ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ
Π±Π°Π³ΡΠ΅ΠΏΠΎΡΡ β ΠΈΠ·Π²Π΅ΡΡΠΈΠ΅ Π·Π° Π³ΡΠ΅ΡΠΊΠ°
ΡΠ΅Π΄ΠΈΡΠ΅ΠΊΡ β ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π°Π½Π΅
ΠΎΡΠΊΡΠΈΡΠΈ ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ β Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄
errata β ΡΠ°Π±ΠΎΡΠ° ΠΏΠΎ Π³ΡΠ΅ΡΠΊΠΈΡΠ΅
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
