เบเปˆเบฝเบงเบเบฑเบšเบŠเปˆเบญเบ‡เป‚เบซเบงเปˆเบ™เบถเปˆเบ‡เปƒเบ™...

เบเปˆเบฝเบงเบเบฑเบšเบŠเปˆเบญเบ‡เป‚เบซเบงเปˆเบ™เบถเปˆเบ‡เปƒเบ™...

เปœเบถเปˆเบ‡เบ›เบตเบเปˆเบญเบ™, เบงเบฑเบ™เบ—เบต 21 เบกเบตเบ™เบฒ 2019, in เป‚เบ„เบ‡เบเบฒเบ™ bug bounty Mail.Ru เบญเบฑเบ™เบ—เบตเปˆเบ”เบตเบซเบผเบฒเบเบกเบฒเบซเบฒ HackerOne เบšเบปเบ”โ€‹เบฅเบฒเบโ€‹เบ‡เบฒเบ™ bugโ€‹ เบˆเบฒเบ maxarr. เป€เบกเบทเปˆเบญเปเบ™เบฐเบ™เปเบฒ zero byte (ASCII 0) เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ POST เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ‚เบญเบ‡เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เป webmail API เบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™ HTTP redirect, เบ•เปˆเบญเบ™เบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ uninitialized เป„เบ”เป‰เบ–เบทเบเบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เปƒเบ™เบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบ›เปˆเบฝเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡, เป€เบŠเบดเปˆเบ‡ fragments เบˆเบฒเบ GET parameters เปเบฅเบฐ headers เบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบญเบทเปˆเบ™เป†เป„เบ›เบซเบฒ เป€เบŠเบตเบšเป€เบงเบตเบ”เบฝเบงเบเบฑเบ™.

เบ™เบตเป‰โ€‹เปเบกเปˆเบ™โ€‹เบ„เบงเบฒเบกโ€‹เบชเปˆเบฝเบ‡โ€‹เบ—เบตเปˆโ€‹เบชเปเบฒโ€‹เบ„เบฑเบ™โ€‹เป€เบ™เบทเปˆเบญเบ‡โ€‹เบˆเบฒเบโ€‹เบงเปˆเบฒ ... เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบเบฑเบ‡เบกเบตเบ„เบธเบเบเบตเบ‚เบญเบ‡เป€เบŠเบ”เบŠเบฑเบ™. เบชเบญเบ‡เบชเบฒเบกเบŠเบปเปˆเบงเป‚เบกเบ‡เบ•เปเปˆเบกเบฒ, เบเบฒเบ™เปเบเป‰เป„เบ‚เบŠเบปเปˆเบงเบ„เบฒเบงเป„เบ”เป‰เบ–เบทเบเป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบชเบนเบ™ byte (เบเป‰เบญเบ™เบงเปˆเบฒเบกเบฑเบ™เป„เบ”เป‰เบซเบฑเบ™เบญเบญเบเบ•เปเปˆเบกเบฒ, เบ™เบตเป‰เปเบกเปˆเบ™เบšเปเปˆเบžเบฝเบ‡เบžเป, เป€เบžเบฒเบฐเบงเปˆเบฒเบเบฑเบ‡เบกเบตเบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ‚เบญเบ‡เบเบฒเบ™เบชเบฑเบเบขเบฒ CRLF / ASCII 13, 10, เป€เบŠเบดเปˆเบ‡เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบˆเบฑเบ”เบเบฒเบ™เบชเปˆเบงเบ™เบซเบปเบงเปเบฅเบฐ. เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ•เบญเบšโ€‹เบชเบฐโ€‹เบซเบ™เบญเบ‡ HTTPโ€‹, เบ™เบตเป‰โ€‹เปเบกเปˆเบ™โ€‹เบชเปเบฒโ€‹เบ„เบฑเบ™โ€‹เบซเบ™เป‰เบญเบโ€‹, เปเบ•เปˆโ€‹เบเบฑเบ‡โ€‹เบšเปเปˆโ€‹เบžเปโ€‹เปƒเบˆโ€‹)โ€‹. เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™, เบšเบฑเบ™เบซเบฒเป„เบ”เป‰เบ–เบทเบเป‚เบญเบ™เป„เบ›เบซเบฒเบ™เบฑเบเบงเบดเป€เบ„เบฒเบฐเปเบฅเบฐเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบ”เป‰เบฒเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเป€เบžเบทเปˆเบญเบŠเบญเบเบซเบฒเปเบฅเบฐเบฅเบปเบšเบฅเป‰เบฒเบ‡เบชเบฒเป€เบซเบ”เบ‚เบญเบ‡เปเบกเบ‡เป„เบกเป‰.

Mail.ru mail เป€เบ›เบฑเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™เบซเบผเบฒเบ; เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบˆเบฑเบ”เบเบฒเบ™เป€เบžเบทเปˆเบญเบเบปเบเป€เบงเบฑเป‰เบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบฑเบ‡เบซเบกเบปเบ”เบเบปเบเป€เบงเบฑเป‰เบ™ nginx เปเบฅเบฐ openresty เปเบฅเบฐ localize เบšเบฑเบ™เบซเบฒเบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเป‚เบ—เบซเบฒ ngx.req.set_uri() เปƒเบ™เบชเบฐเบ„เบฃเบดเบš OpenResty เบ—เบตเปˆเบšเปเปˆเบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบปเบงเบ•เบฒเบกเบ—เบตเปˆเบ„เบฒเบ”เป„เบงเป‰ (เบเบฒเบ™เปƒเบชเปˆ null byte เบซเบผเบท line feed เบœเปˆเบฒเบ™เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต GET เบ”เป‰เบงเบเบเบฒเบ™เบ‚เบฝเบ™เบ„เบทเบ™เปƒเบซเบกเปˆเปƒเบ™ ngx_http_rewrite_module, เป€เบŠเบดเปˆเบ‡, เบญเบตเบ‡เบ•เบฒเบกเป€เบญเบเบฐเบชเบฒเบ™, เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปเบฅเบฐ, เบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒ, เบ„เบงเบ™เป€เบฎเบฑเบ”เบงเบฝเบเปƒเบ™เปเบšเบšเบ”เบฝเบงเบเบฑเบ™, เบˆเบฐ. เบšเปเปˆเป€เบฎเบฑเบ”เบงเบฝเบ). เบœเบปเบ™เบชเบฐเบ—เป‰เบญเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เป„เบ”เป‰เบ–เบทเบเบฅเบปเบšเบฅเป‰เบฒเบ‡, เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบกเบขเปˆเบฒเบ‡เป€เบ‚เบฑเป‰เบกเบ‡เบงเบ”เป€เบ—เบปเปˆเบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰, เปเบฅเบฐเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เป„เบ”เป‰เบ–เบทเบเบเบงเบ”เบชเบญเบšเป€เบžเบทเปˆเบญเบฅเบปเบšเบฅเป‰เบฒเบ‡ vectors เบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบฑเบ‡เบซเบกเบปเบ”. เปเบ•เปˆเบเบปเบ™เป„เบเบ—เบตเปˆเบ™เปเบฒเป„เบ›เบชเบนเปˆเบเบฒเบ™เบฎเบปเปˆเบงเป„เบซเบฅเบ‚เบญเบ‡เป€เบ™เบทเป‰เบญเปƒเบ™เบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเบเบฑเบ‡เบ„เบปเบ‡เป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบฅเบถเบเบฅเบฑเบš. เบ™เบถเปˆเบ‡เป€เบ”เบทเบญเบ™เบ•เปเปˆเบกเบฒ, เบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบ‚เบญเบ‡เปเบกเบ‡เป„เบกเป‰เป„เบ”เป‰เบ–เบทเบเบ›เบดเบ”เบฅเบปเบ‡เบ•เบฒเบกเบเบฒเบ™เปเบเป‰เป„เบ‚, เปเบฅเบฐเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบชเบฒเป€เบซเบ”เบ‚เบญเบ‡เปเบกเบ‡เป„เบกเป‰เป„เบ”เป‰เบ–เบทเบเป€เบฅเบทเปˆเบญเบ™เบญเบญเบเป„เบ›เบˆเบปเบ™เบเปˆเบงเบฒเป€เบงเบฅเบฒเบ—เบตเปˆเบ”เบตเบ‚เบถเป‰เบ™.

OpenResty เป€เบ›เบฑเบ™ plugin เบ—เบตเปˆเบ™เบดเบเบปเบกเบซเบผเบฒเบเบ—เบตเปˆเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบ‚เบฝเบ™เบ•เบปเบงเบญเบฑเบเบชเบญเบ™ Lua เบžเบฒเบเปƒเบ™ nginx, เปเบฅเบฐเบกเบฑเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™ Mail.ru เบซเบผเบฒเบ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบšเบฑเบ™เบซเบฒเบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเปเบเป‰เป„เบ‚. เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเป€เบงเบฅเบฒเปƒเบ”เบซเบ™เบถเปˆเบ‡, เปƒเบ™เบ—เบตเปˆเบชเบธเบ”เบžเบงเบเป€เบ‚เบปเบฒเป„เบ”เป‰เบเบฑเบšเบ„เบทเบ™เป„เบ›เบซเบฒเบกเบฑเบ™เป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเปƒเบˆเป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡, เบœเบปเบ™เบชเบฐเบ—เป‰เบญเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เปเบฅเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบชเปเบฒเบฅเบฑเบšเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ. เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเปƒเบ™เบเบฒเบ™เบ‚เบธเบ”เบ„เบปเป‰เบ™เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡ Denis Denisov ะธ Nikolay Ermishkin. เบกเบฑเบ™โ€‹เป„เบ”เป‰โ€‹เบซเบฑเบ™โ€‹เบญเบญเบโ€‹เบงเปˆเบฒโ€‹:

  • เปƒเบ™ nginx, เป€เบกเบทเปˆเบญเปƒเบŠเป‰ rewrite เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบœเบนเป‰เปƒเบŠเป‰, เบกเบตเบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ‚เบญเบ‡ traversal เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต (เปเบฅเบฐเบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™ SSRF) เปƒเบ™เบšเบฒเบ‡เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ, เปเบ•เปˆเบ™เบตเป‰เปเบกเปˆเบ™เบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบเปเบฅเบฐเบ„เบงเบ™เบˆเบฐเบ–เบทเบเบเบงเบ”เบžเบปเบšเป‚เบ”เบเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ„เบปเบ‡เบ—เบตเปˆเปƒเบ™. Nginx Amplify ะธ เบˆเบตเบŠเบต เบˆเบฒเบ 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 เบกเบต bug เบ—เบตเปˆเป€เบฎเบฑเบ”เปƒเบซเป‰เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบฎเบปเปˆเบงเป„เบซเบผเบ–เป‰เบฒเป€เบชเบฑเป‰เบ™ rewrite เบกเบต byte null. เป€เบกเบทเปˆเบญเบเบฒเบ™เบ›เปˆเบฝเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ–เบทเบเบญเบญเบ, nginx เบˆเบฑเบ”เบชเบฑเบ™ buffer เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเปƒเบซเบกเปˆเบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบšเบ„เบงเบฒเบกเบเบฒเบงเป€เบ•เบฑเบกเบ‚เบญเบ‡เป€เบชเบฑเป‰เบ™, เปเบ•เปˆเบ„เบฑเบ”เบฅเบญเบเป€เบชเบฑเป‰เบ™เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™เป‚เบ”เบเบœเปˆเบฒเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบชเบฑเป‰เบ™เบ—เบตเปˆเบชเบนเบ™ byte เป€เบ›เบฑเบ™เบ•เบปเบงเบชเบดเป‰เบ™เบชเบธเบ”เบ‚เบญเบ‡เป€เบชเบฑเป‰เบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เป€เบชเบฑเป‰เบ™เบˆเบฐเบ–เบทเบเบ„เบฑเบ”เบฅเบญเบเบžเบฝเบ‡เปเบ•เปˆเป€เบ–เบดเบ‡เบชเบนเบ™เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™. byte; เบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบฅเบทเบญเบ‚เบญเบ‡ buffer เบกเบตเบ‚เปเป‰เบกเบนเบ™ uninitialized. เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰ เบ—เบตเปˆเบ™เบตเป‰.

    เบ•เบปเบงเบขเปˆเบฒเบ‡เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ (^@ zero byte)

    
    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, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เป€เบกเบทเปˆเบญเบ™เปเบฒเปƒเบŠเป‰เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต 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=%00asdfasdfasdfasdfasdfasdfasdfasdf" -vv
    ...
    Location: http://localhost:8337/{...ะผะพะถะตั‚ ัะพะดะตั€ะถะฐั‚ัŒ secret...}
    ...

เบ•เบดเบเบดเบฃเบดเบเบฒเป€เบžเบตเปˆเบกเป€เบ•เบตเบก

เบšเบฑเบ™เบซเบฒเป„เบ”เป‰เบ–เบทเบเบฅเบฒเบเบ‡เบฒเบ™เปƒเบซเป‰เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบ‚เบญเบ‡ nginx เปเบฅเบฐ OpenResty, เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบšเปเปˆเป„เบ”เป‰เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบšเบฑเบ™เบซเบฒเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป€เบ›เบฑเบ™เบšเบฑเบ™เบซเบฒเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเปƒเบ™ nginx, เป€เบžเบฒเบฐเบงเปˆเบฒ. เปƒเบ™ nginx เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เบšเปเปˆเบกเบตเบงเบดเบ—เบตเบเบฒเบ™เบ‚เบธเบ”เบ„เบปเป‰เบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™เบชเบตเบ”เบ‚เบญเบ‡เบฅเบฑเบเบชเบฐเบ™เบฐเบžเบดเป€เบชเบ”, เปเบเป‰เป„เบ‚ เบเบฒเบ™เป€เบ›เบตเบ”เป€เบœเบตเบเบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒ เบˆเบฑเบ”เบžเบตเบกเบกเบฒเปƒเบ™เบงเบฑเบ™เบ—เบต 16 เป€เบ”เบทเบญเบ™เบ—เบฑเบ™เบงเบฒ. เปƒเบ™เป„เบฅเบเบฐ 4 เป€เบ”เบทเบญเบ™เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบเบฒเบ™เบฅเบฒเบเบ‡เบฒเบ™, เบšเปเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เปƒเบ”เป†เบ•เปเปˆ OpenResty, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบกเบตเบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒเบ•เป‰เบญเบ‡เปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™ ngx.req.set_uri() เบชเบฐเบšเบฑเบšเบ—เบตเปˆเบ›เบญเบ”เป„เบž. เปƒเบ™เบงเบฑเบ™เบ—เบต 18 เบกเบตเบ™เบฒ 2020 เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบœเบตเบเปเบœเปˆเบ‚เปเป‰เบกเบนเบ™, เปƒเบ™เบงเบฑเบ™เบ—เบต 21 เบกเบตเบ™เบฒ OpenResty เป€เบ›เบตเบ”เป€เบœเบตเบ เป€เบงเบตเบŠเบฑเปˆเบ™ 1.15.8.3, เป€เบŠเบดเปˆเบ‡เป€เบžเบตเปˆเบกเบเบฒเบ™เบเบงเบ”เบชเบญเบš URI.

เบžเบญเบ”เบชเบฐเบงเบดเบเป€เบเบต wrote เบšเบปเบ”เบ„เบงเบฒเบกเบ—เบตเปˆเบ”เบตเปเบฅเบฐเป„เบ”เป‰เป€เบญเบปเบฒเบ„เปเบฒเบ„เบดเบ”เป€เบซเบฑเบ™เบˆเบฒเบ OpenResty เปเบฅเบฐ Nginx (เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบ„เปเบฒเบ„เบดเบ”เบ„เปเบฒเป€เบซเบฑเบ™เบ—เบตเปˆเบกเบตเบžเบฝเบ‡เปเบ•เปˆเบชเปˆเบงเบ™เบ™เป‰เบญเบเป†เบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ—เบตเปˆเบ–เบทเบเป€เบ›เบตเบ”เป€เบœเบตเบเปเบกเปˆเบ™เบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เปเบฅเบฐเป€เบ‚เบปเป‰เบฒเปƒเบˆเบœเบดเบ”, เบ™เบตเป‰เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป‚เบ”เบเบ„เบงเบฒเบกเบเบฒเบงเบ‚เบญเบ‡เป€เบชเบฑเป‰เบ™เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰ byte null เปเบฅเบฐ, เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบšเปเปˆเบกเบตเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบขเปˆเบฒเบ‡เบŠเบฑเบ”เป€เบˆเบ™เบเปˆเบฝเบงเบเบฑเบš. เบ„เบงเบฒเบกเบเบฒเบง, เบชเบฒเบกเบฒเบ”เบ„เบงเบšเบ„เบธเบกเป‚เบ”เบเบœเบนเป‰เป‚เบˆเบกเบ•เบต).

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปเบกเปˆเบ™เบซเบเบฑเบ‡เปเบฅเบฐเบชเบดเปˆเบ‡เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ›เป‰เบญเบ‡เบเบฑเบ™เบกเบฑเบ™เป„เบ”เป‰?

เบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เปƒเบ™ nginx เบšเป? เปเบกเปˆเบ™เปเบฅเป‰เบง, เบกเบฑเบ™เปเบกเปˆเบ™, เป€เบžเบฒเบฐเบงเปˆเบฒเบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเบฎเบปเปˆเบงเป„เบซเบผเปเบกเปˆเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เบเปเบฅเบฐเบ™เบตเปƒเบ”เบเปเปˆเบ•เบฒเบก.

เบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เปƒเบ™ OpenResty เบšเป? เปเบกเปˆเบ™เปเบฅเป‰เบง, เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเบšเบฑเบ™เบซเบฒเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ‚เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ—เบตเปˆเบชเบฐเป€เบซเบ™เบตเป‚เบ”เบ OpenResty เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบชเบทเบšเบชเบงเบ™เปเบฅเบฐเป€เบญเบเบฐเบชเบฒเบ™.

เบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ / เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบเบฑเบš OpenResty เบšเป? เปเบกเปˆเบ™เปเบฅเป‰เบง, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบšเปเปˆเบกเบตเบ„เปเบฒเบ–เบฐเปเบซเบผเบ‡เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™, เบเบฒเบ™เบชเบปเบกเบกเบธเบ”เบ•เบดเบ–เบฒเบ™เบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบขเบฑเป‰เบ‡เบขเบทเบ™เป„เบ”เป‰เป€เบเบตเบ”เบ‚เบถเป‰เบ™เบเปˆเบฝเบงเบเบฑเบšเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ‚เบญเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰.

เปเบกเบ‡เป„เบกเป‰เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบญเบฑเบ™เปƒเบ”เป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบชเปˆเบฝเบ‡เบ”เป‰เบฒเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ—เบตเปˆเบกเบตเป€เบ‡เบดเบ™เบฅเบฒเบ‡เบงเบฑเบ™ 10000 เป‚เบ”เบฅเบฒ? เบชเปเบฒเบฅเบฑเบšเบžเบงเบเป€เบฎเบปเบฒ, เบ™เบตเป‰เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เบšเปเปˆเบชเปเบฒเบ„เบฑเบ™. เปƒเบ™เบŠเบญเบšเปเบงเปƒเบ”เบเปเปˆเบ•เบฒเบก, เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเบขเบนเปˆเปƒเบ™เบˆเบธเบ”เบ•เบฑเบ”เบเบฑเบ™เบ‚เบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡, เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเปเบกเปˆเบ™เบเบฒเบ™เบชเบฐเบซเบ™เบญเบ‡เป‚เบ”เบเป‚เบ„เบ‡เบเบฒเบ™เปเบฅเบฐเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เบšเปเปˆเบกเบตเปƒเบœเบชเบฒเบกเบฒเบ”เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบงเปˆเบฒเบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเปเบกเปˆเบ™เป€เบ›เบฑเบ™เบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบเปเบฅเบฐเป€เบ›เบฑเบ™เป€เบญเบเบฐเบชเบฒเบ™เปเบฅเบฐเบšเปเปˆเบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบŠเปˆเบญเบ‡เป‚เบซเบงเปˆเบ”เป‰เบฒเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเปƒเบ”เป†เบเปเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™เบขเปˆเบฒเบ‡เปเบ™เปˆเบ™เบญเบ™เบงเปˆเบฒเบกเบฑเบ™เบกเบตเบœเบปเบ™เบเบฐเบ—เบปเบšเบ•เปเปˆเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž.

เปƒเบ™เบเปเบฅเบฐเบ™เบตเปƒเบ”เบเปเปˆเบ•เบฒเบก, เบกเบฑเบ™เป€เบ›เบฑเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบˆเบฐเบ›เบปเบเบเบฐเบ•เบดเบซเบผเบทเบˆเปเบฒเบเบฑเบ” / เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบซเบผเบฒเบเป€เบ—เบปเปˆเบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ›เป‰เบญเบ™เป€เบ‚เบปเป‰เบฒเบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เป‚เบกเบ”เบนเบ™เบžเบฒเบเบ™เบญเบ / API, เป€เบงเบฑเป‰เบ™เป€เบชเบเปเบ•เปˆเบงเปˆเบฒเบกเบตเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เปเบฅเบฐเบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเปƒเบˆเบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบงเปˆเบฒเบ™เบตเป‰เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡.

เบญเบตเบฃเบฒเบ™เบ•เบฒ

เบˆเบฒเบเบ›เบฐเบชเบปเบšเบเบฒเบ™ เบšเบปเบ”เบ„เบงเบฒเบกเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ, เบชเปเบฒเบฅเบฑเบš sake เบ‚เบญเบ‡เบเบฒเบ™เบฎเบฑเบเบชเบฒเบ„เบงเบฒเบกเบšเปเบฅเบดเบชเบธเบ”เบ‚เบญเบ‡เบžเบฒเบชเบฒ:

bug bounty - เบเบฒเบ™โ€‹เปเบ‚เปˆเบ‡โ€‹เบ‚เบฑเบ™โ€‹เบเบฒเบ™โ€‹เบฅเปˆเบฒโ€‹เบชเบฑเบ”โ€‹เปเบกเบ‡โ€‹เป„เบกเป‰โ€‹
เบšเบปเบ”โ€‹เบฅเบฒเบโ€‹เบ‡เบฒเบ™ bugโ€‹ - เปเบˆเป‰เบ‡โ€‹เบเบฒเบ™โ€‹เบ„เบงเบฒเบกโ€‹เบœเบดเบ”โ€‹เบžเบฒเบ”โ€‹
เบ›เปˆเบฝเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡ - เบเบฒเบ™เบ›เปˆเบฝเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡
เปเบซเบผเปˆเบ‡เป€เบ›เบตเบ” - เปเบซเบผเปˆเบ‡เป€เบ›เบตเบ”
เบœเบดเบ”เบžเบฒเบ” - เป€เบฎเบฑเบ”เบงเบฝเบเบเปˆเบฝเบงเบเบฑเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com