جڏهن ته ’الف‘ ’ا‘ جي برابر نه آهي. هيڪ جي رستي تي

منهنجي هڪ دوست سان هڪ تمام اڻ وڻندڙ ​​ڪهاڻي ٿي. پر جيتري ناخوشگوار ڳالهه ميخائل لاءِ هئي، اوتري ئي منهنجي لاءِ دلڪش هئي.

مون کي چوڻ گهرجي ته منهنجو دوست ڪافي آهي يونيڪساستعمال ڪندڙ: سسٽم پاڻ کي انسٽال ڪري سگهو ٿا هن MySQL, پي PHP حفاظتي ۽ سادي سيٽنگون ٺاهيو نگنڪس.
۽ هن وٽ هڪ درجن يا هڪ اڌ ويب سائيٽون تعميراتي اوزارن لاءِ وقف آهن.

انهن سائيٽن مان هڪ زنجير لاءِ وقف ڪئي وئي آهي مضبوط طور تي سرچ انجڻ جي ٽاپ ۾. هي سائيٽ هڪ غير تجارتي نظرثاني ڪندڙ آهي، پر ڪو ماڻهو ان تي حملو ڪرڻ جي عادت ۾ پئجي ويو. اهو خوفناڪ، پوءِ وحشي قوت، پوءِ اهي فحش تبصرا لکندا آهن ۽ ميزباني ۽ آر ڪي اين ڏانهن گاليون موڪليندا آهن.
اوچتو، سڀڪنھن شيء کي خاموش ٿي ويو ۽ اهو پرسڪون نڪتو سٺو نه هو، ۽ سائيٽ آهستي آهستي ڳولا جي نتيجن جي مٿين لائينن کي ڇڏڻ شروع ڪيو.

جڏهن ته ’الف‘ ’ا‘ جي برابر نه آهي. هيڪ جي نتيجي ۾

اها هڪ چوڻي هئي، پوءِ خود منتظم جي ڪهاڻي.

سمهڻ جو وقت ويجهو هو ته فون جي گهنٽي وڳي: ”سائين، تون منهنجي سرور کي نه ڏسندين؟ مون کي لڳي ٿو ته مون کي هيڪ ڪيو ويو آهي، مان اهو ثابت نه ٿو ڪري سگهان، پر اهو احساس مون کي ٽئين هفتي تائين نه ڇڏيو آهي. ٿي سگهي ٿو اهو صرف وقت آهي مون لاءِ پروانويا جو علاج ڪرڻ لاءِ؟

جنهن بعد اڌ ڪلاڪ بحث ٿيو جنهن جو اختصار هن ريت ڪري سگهجي ٿو:

  • هيڪنگ لاءِ زمين ڪافي زرخيز هئي.
  • هڪ حملو ڪندڙ سپر يوزر حق حاصل ڪري سگهي ٿو؛
  • حملو (جيڪڏهن اهو ٿيو هجي) خاص طور تي هن سائيٽ تي نشانو بڻايو ويو هو؛
  • مسئلن جي علائقن کي درست ڪيو ويو آهي ۽ توهان کي صرف اهو سمجهڻ جي ضرورت آهي ته ڇا ڪا دخول هئي.
  • هيڪ سائيٽ ڪوڊ ۽ ڊيٽابيس کي متاثر نه ڪري سگهيو.

آخري نقطي جي حوالي سان.

جڏهن ته ’الف‘ ’ا‘ جي برابر نه آهي. هيڪ جي نتيجي ۾

صرف سفيد فرنٽ اينڊ IP دنيا ۾ نظر اچي ٿو. پسمنظر ۽ فرنٽ اينڊ جي وچ ۾ ڪوبه مٽاسٽا نه آهي سواءِ http(s)، استعمال ڪندڙ/پاسورڊ مختلف آهن، ڪي به چاٻيون مٽائي نه ويون آهن. گرين ايڊريس تي، 80/443 کان سواءِ سڀ بندرگاھون بند آھن. سفيد پس منظر IPs صرف ٻن استعمال ڪندڙن لاءِ سڃاتل آھن، جن تي ميخائل مڪمل طور تي ڀروسو ڪري ٿو.

فرنٽ اينڊ تي انسٽال ٿيل ديبين 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

هڪ ٻيو سوال لسٽنگ سوال ۾ شامل ڪيو ويو آهي: "ڇو nginx جو اهڙو قديم نسخو؟"

ان کان سواء، سسٽم مڃي ٿو ته جديد نسخو نصب ٿيل آهي:

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

مان سڏيان ٿو:
- ميشا، توهان ڇو ٻيهر گڏ ڪيو؟ نگنڪس?
- انتظار ڪريو، مون کي خبر ناهي ته اهو ڪيئن ڪجي!
- چڱو، سمهڻ وڃ ...

نينڪس اهو واضح طور تي ٻيهر ٺهيل آهي ۽ "-T" استعمال ڪندي لسٽنگ جي پيداوار هڪ سبب لاء لڪيل آهي. هيڪنگ جي باري ۾ هاڻي ڪو به شڪ ناهي ۽ توهان صرف ان کي قبول ڪري سگهو ٿا ۽ (جڏهن ته ميشا سرور کي نئين سان تبديل ڪيو آهي) ان مسئلي کي حل ڪرڻ تي غور ڪريو.

۽ حقيقت ۾، جڏهن کان ڪنهن کي حق مليا آهن پاڙ”ها، ته پوءِ اهو ڪرڻ ئي سمجهه ۾ اچي ٿو سسٽم ٻيهر انسٽال ڪرڻ۽ اهو ڳولڻ بيڪار هو ته اتي ڇا غلط هو، پر هن ڀيري تجسس ننڊ کي شڪست ڏني. اسان ڪيئن ڳولي سگهون ٿا ته اهي اسان کان ڇا لڪائڻ چاهيندا هئا؟

اچو ته ٽريڪ ڪرڻ جي ڪوشش ڪريون:

$ strace nginx -T

اسان ان کي ڏسندا آهيون، واضح طور تي ڪافي لائينون نه آهن ٽريس a la ۾

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 اچو ته ان کي استعمال ڪندي انسٽال ڪرڻ جي ڪوشش ڪريون جي ڊي بي، خوشقسمتيء سان اتي هڪ چاٻي آهي --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' ان وانگر 'o' ! = 'o':

جڏهن ته ’الف‘ ’ا‘ جي برابر نه آهي. هيڪ جي نتيجي ۾

اهڙيءَ طرح، سرچ انجڻ جا بوٽ وصول ڪن ٿا، عام 100٪ سيريلڪ ٽيڪسٽ جي بدران، تبديل ٿيل ڪچرو لاطيني سان ملائي 'هڪ' и 'او'. مان بحث ڪرڻ جي جرئت نه ٿو ڪريان ته اهو ايس اي او کي ڪيئن اثر انداز ڪري ٿو، پر اهو ممڪن ناهي ته خطن جي اهڙي جملي ڳولا جي نتيجن ۾ پوزيشن تي مثبت اثر پوي.

مان ڇا چئي سگهان ٿو، ماڻهو تخيل سان.

حوالن

GDB سان ڊيبنگ
gdb (1) - لينڪس مين پيج
strace(1) - لينڪس مين پيج
نينگڪس - ماڊل ngx_http_sub_module
آري، زنجير ۽ برقي آري بابت

جو ذريعو: www.habr.com

تبصرو شامل ڪريو