'a' 'a' ට සමාන නොවන විට. එක් හැක් කිරීමකදී

මගේ මිතුරෙකුට වඩාත්ම අප්රසන්න කතාවක් සිදු විය. නමුත් මිහායිල්ට එය අප්‍රසන්න වූවා සේම, එය මට විනෝදජනක විය.

මගේ මිතුරා ඉතා හොඳ බව මම පැවසිය යුතුයි යුනික්ස්-පරිශීලක: පද්ධතියම ස්ථාපනය කළ හැකිය mysql, php සහ සරල සැකසුම් කරන්න nginx.
ඔහුට ඉදිකිරීම් මෙවලම් සඳහා කැප වූ වෙබ් අඩවි දුසිමක් හෝ එකහමාරක් ඇත.

දම්වැල් කියත් සඳහා කැප වූ මෙම වෙබ් අඩවි වලින් එකක් සෙවුම් යන්ත්‍රවල ඉහළම ස්ථානයේ ස්ථිරව පිහිටා ඇත. මෙම වෙබ් අඩවිය වාණිජ නොවන සමාලෝචකයකි, නමුත් යමෙකු එයට පහර දීමට පුරුදු වී ඇත. එම DDoS, පසුව තිරිසන් බලය, පසුව ඔවුන් අසභ්‍ය අදහස් ලියා සත්කාරක සමාගමට සහ RKN වෙත අපයෝජන යවයි.
හදිසියේම, සියල්ල සන්සුන් වූ අතර මෙම සන්සුන් භාවය හොඳ නැති බව පෙනී ගිය අතර, වෙබ් අඩවිය සෙවුම් ප්රතිඵලවල ඉහළම පේළිවලින් ඉවත් වීමට පටන් ගත්තේය.

'a' 'a' ට සමාන නොවන විට. හැක් කිරීමකදී

ඒක කියමනක්, එතකොට ඇඩ්මින්ගෙ කතාවම තමයි.

එය නින්දට ආසන්න වූ විට දුරකථනය නාද විය: "සැන්, ඔබ මගේ සේවාදායකය දෙස බලන්නේ නැද්ද? මාව කපා කොටා ඇති බව මට පෙනේ, මට එය ඔප්පු කළ නොහැක, නමුත් හැඟීම තුන්වන සතිය සඳහා මා හැර ගියේ නැත. සමහර විට මට ව්‍යාකූලත්වයට ප්‍රතිකාර ගැනීමට කාලය පැමිණ තිබේද? ”

ඉන්පසුව සිදුවූයේ පැය භාගයක සාකච්ඡාවක් වූ අතර එය මෙසේ සාරාංශගත කළ හැකිය.

  • අනවසරයෙන් ඇතුළුවීම සඳහා පස තරමක් සාරවත් විය;
  • ප්රහාරකයෙකුට සුපිරි පරිශීලක අයිතිවාසිකම් ලබා ගත හැකිය;
  • ප්රහාරය (එය සිදු වූයේ නම්) මෙම වෙබ් අඩවියට විශේෂයෙන් ඉලක්ක කර ඇත;
  • ගැටළු සහිත ප්‍රදේශ නිවැරදි කර ඇති අතර කිසියම් විනිවිද යාමක් සිදුවී ඇත්ද යන්න ඔබ තේරුම් ගත යුතුය;
  • හැක් කිරීම අඩවි කේතයට සහ දත්ත සමුදායට බලපෑවේ නැත.

අවසාන කරුණ සම්බන්ධයෙන්.

'a' 'a' ට සමාන නොවන විට. හැක් කිරීමකදී

සුදු ඉදිරිපස IP පමණක් ලෝකය දෙස බලයි. http(s) හැර පසුපෙළ සහ ඉදිරිපස අතර හුවමාරුවක් නොමැත, පරිශීලකයන්/මුරපද වෙනස් වේ, යතුරු හුවමාරු කර නැත. අළු ලිපින මත, 80/443 හැර අනෙකුත් සියලුම වරායන් වසා ඇත. සුදු පසුපෙළ IPs දන්නේ Mikhail සම්පූර්ණයෙන්ම විශ්වාස කරන පරිශීලකයින් දෙදෙනෙකුට පමණි.

ඉදිරිපස මත ස්ථාපනය කර ඇත ඩේබියන් 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

හැකි හැක් කිරීමක් සොයමින්

මම මුලින්ම සේවාදායකය ආරම්භ කරමි ගලවා ගැනීමේ මාදිලිය. මම තැටි සවි කර ඒවා හරහා පෙරළමි auth-සටහන්, ඉතිහාසය, පද්ධති ලඝු-සටහන් යනාදිය හැකි නම්, මම ගොනු නිර්මාණය කිරීමේ දිනයන් පරීක්ෂා කරමි, නමුත් සාමාන්‍ය රතිඤ්ඤා තමාගෙන් පසු “අතුගා” ඇති බව මට වැටහෙන නමුත්, ඔහු තමා සොයමින් සිටියදී මිෂා ඒ වන විටත් බොහෝ “පාගලා” ඇත. .

මම සාමාන්‍ය ප්‍රකාරයේදී ආරම්භ කරමි, සෙවිය යුත්තේ කුමක් දැයි තවමත් තේරුම් ගෙන නැත, මම වින්‍යාසයන් අධ්‍යයනය කරමි. පළමුවෙන්ම, මම උනන්දු වෙමි nginx මක්නිසාද යත්, පොදුවේ ගත් කල, එය හැර පෙරමුනේ වෙන කිසිවක් නැත.
වින්‍යාසයන් කුඩා ය, ගොනු දුසිමකට හොඳින් ව්‍යුහගත කර ඇත, මම ඒවා දෙස බලමි cat'ඔහ් එකින් එක. සෑම දෙයක්ම පිරිසිදු බව පෙනේ, නමුත් මට යමක් මග හැරී ඇත්දැයි ඔබ කිසි විටෙකත් නොදනී ඇතුළත් වේ, මට සම්පූර්ණ ලැයිස්තුවක් කිරීමට ඉඩ දෙන්න:

$ 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" භාවිතයෙන් ලැයිස්තුගත කිරීමේ ප්‍රතිදානය හේතුවක් නිසා සඟවා ඇත. අනවසරයෙන් ඇතුළුවීම පිළිබඳ තවදුරටත් සැකයක් නොමැති අතර ඔබට එය සරලව පිළිගත හැකි අතර (Misha කෙසේ හෝ සේවාදායකය නව එකක් සමඟ ප්‍රතිස්ථාපනය කළ බැවින්) ගැටළුව විසඳා ඇති බව සලකා බලන්න.

ඇත්ත වශයෙන්ම, යමෙකුට අයිතිවාසිකම් ලැබී ඇති බැවින් මූල'ආහ්, එහෙනම් ඒක කරන්න තේරුමක් තියෙනවා පද්ධතිය නැවත ස්ථාපනය, සහ එහි ඇති වැරැද්ද කුමක්දැයි සොයා බැලීමෙන් පලක් නොවූවත් මෙවර කුතුහලය නින්ද පරාජය කළේය. ඔවුන්ට අපෙන් සැඟවීමට අවශ්‍ය වූයේ කුමක්දැයි සොයා ගන්නේ කෙසේද?

අපි සොයා ගැනීමට උත්සාහ කරමු:

$ 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 භාවිතයෙන් එය ස්ථාපනය කිරීමට උත්සාහ කරමු gdb, වාසනාවකට මෙන් යතුරක් තිබේ --with-cc-opt -g වර්තමාන සහ ප්‍රශස්තිකරණය බලාපොරොත්තු වේ -O2 එය අපට හානියක් නොවනු ඇත. ඒ සමගම, මම කෙසේ දැයි නොදන්නා නිසා ngx_dump_config තුළ සැකසිය හැක නඩුව 'ටී':, අපි මෙම බ්ලොක් එක අමතන්නේ නැත, නමුත් එය භාවිතයෙන් ස්ථාපනය කරන්න නඩුව 't':

ඔබට '-t' මෙන්ම '-T' භාවිතා කළ හැක්කේ ඇයි?බ්ලොක් සැකසුම් if(ngx_dump_config) ඇතුළත සිදු වේ if(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;
    }

ඇත්ත වශයෙන්ම, මෙම කොටසෙහි කේතය වෙනස් කර නොමැති නම් නඩුව 'ටී':, එතකොට මගේ ක්‍රමය හරියන්නේ නැහැ.

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

පියවර:

  • ශ්‍රිතයේ කඩඉමක් සකසන්න main ()
  • වැඩසටහන ක්රියාත්මක කරන්න
  • config හි ප්‍රතිදානය තීරණය කරන විචල්‍යයේ අගය වෙනස් කරන්න 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':

'a' 'a' ට සමාන නොවන විට. හැක් කිරීමකදී

මේ අනුව, සෙවුම් යන්ත්‍ර බොට් වලට සාමාන්‍ය 100% සිරිලික් අකුරු වෙනුවට ලතින් භාෂාවෙන් තනුක කරන ලද නවීකරණය කරන ලද කසළ ලැබේ. 'ඒ' и 'ඕ'. මෙය SEO වලට බලපාන්නේ කෙසේද යන්න ගැන සාකච්ඡා කිරීමට මම නිර්භීත නොවෙමි, නමුත් එවැනි අකුරු පටලැවිල්ලක් සෙවුම් ප්‍රතිඵලවල ස්ථාන කෙරෙහි ධනාත්මක බලපෑමක් ඇති කරනු ඇතැයි සිතිය නොහැක.

මම මොනවා කියන්නද පරිකල්පන ශක්තියක් තියෙන යාලුවනේ.

යොමු

GDB සමඟ නිදොස් කිරීම
gdb(1) — Linux man පිටුව
strace(1) — Linux man පිටුව
Nginx - මොඩියුලය ngx_http_sub_module
කියත්, දම්වැල් සහ විදුලි කියත් ගැන

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න