Beans moduli html nome php. Jdoc:include - metodo per visualizzare il contenuto nella pagina. Aggiunta di barre semplici
Abbiamo brevemente toccato l'argomento delle modalità di visualizzazione del contenuto nel corpo di un modello. Vediamo ora più da vicino cos'è e con cosa si mangia. Quindi, dichiarazioni di metodo jdoc sono presenti in ogni template Joomla e visualizzare questa o quella informazione nel corpo del modello (cioè nella pagina del sito). In generale, la dichiarazione del metodo è simile alla seguente:
Questa riga visualizza informazioni dai componenti del sito, ad esempio articoli da com_content. Il tipo di elementi di output è specificato nell'attributo.
1. tipo - tipi di elementi di output.
- componente- come ho scritto sopra, visualizza il contenuto principale della pagina. Può essere chiamato solo una volta per modello.
- Testa- viene annunciato anche una volta dopo il tag di apertura . Serve per visualizzare stili, script,
e metadati della pagina corrente. - Messaggio- visualizza i messaggi di sistema. Dichiarato una volta nel corpo del documento.
- installazione- non visualizza nulla ed è una “istruzione” per l'installazione.
- modulo - visualizza un singolo modulo sulla pagina. Il numero di annunci è illimitato.
- moduli- a differenza della tipologia precedente, permette di visualizzare nella sua posizione più di un numero di moduli.
Per le prime quattro tipologie elencate è sufficiente indicarle nella pagina. Nel caso del tipo modulo il compito diventa un po’ più complicato. Per visualizzare un modulo sulla pagina, dobbiamo prima creare un modulo per esso posizione modulare con un identificatore univoco (nome della posizione del modulo). Questo viene fatto utilizzando l'attributo name="position name" e l'aggiunta obbligatoria della riga:
2. stile: descrizione dello stile di output (mod chrome).
L'aspetto e la struttura del guscio del modulo dipendono dallo stile specificato. Sembra
:
- xhtml- visualizza il modulo in un blocco con la funzione titolo modChrome_xhtml($module, &$params, &$attribs)
{
if (!empty ($modulo->contenuto)): ?>
">
titolo spettacolo != 0): ?>
titolo; ?>
contenuto; ?>
} - tavolo - visualizza il modulo in un layout con struttura a tabella
funzione modChrome_table($modulo, &$params, &$attribs)
{ ?>
">
titolo spettacolo != 0): ?>
titolo; ?>
contenuto; ?>
} - cavallo - visualizza il contenuto di un modulo in una cella di tabella, funzione orizzontale modChrome_horz($module, &$params, &$attribs)
{ ?>
} - arrotondato- visualizza il modulo in diversi blocchi annidati per uno stile complesso sotto forma di bordi grafici (ad esempio angoli arrotondati) funzione modChrome_rounded($module, &$params, &$attribs)
{ ?>
">
titolo spettacolo != 0): ?>
titolo; ?>
contenuto; ?>
} - contorno- aggiunge stili CSS preimpostati alla funzione del blocco modulo modChrome_outline($module, &$params, &$attribs)
{
statico $css=falso;
se (!$css)
{
$css=vero;
jimport("joomla.environment.browser");
$doc = JFactory::getDocument();
$browser = JBrowser::getInstance();
$doc->addStyleDeclaration(".mod-preview-info (imbottitura: 2px 4px 2px 4px; bordo: 1px nero pieno; posizione: assoluta; colore di sfondo: bianco; colore: rosso;)");
$doc->addStyleDeclaration(".mod-preview-wrapper ( background-color:#eee; border: 1px punteggiato nero; color:#700;)");
if ($browser->getBrowser()=="msie")
{
if ($browser->getMajor()<= 7) {
$doc->addStyleDeclaration(".mod-preview-info (filtro: alpha(opacity=80);)");
$doc->addStyleDeclaration(".mod-preview-wrapper (filtro: alpha(opacity=50);)");
}
altro(
$doc->addStyleDeclaration(".mod-preview-info (-ms-filter: alpha(opacity=80);)");
$doc->addStyleDeclaration(".mod-preview-wrapper (-ms-filter: alpha(opacity=50);)");
}
}
altro
{
$doc->addStyleDeclaration(".mod-preview-info (opacità: 0.8;)");
$doc->addStyleDeclaration(".mod-preview-wrapper (opacità: 0.5;)");
}
}
?>
posizione."[".$modulo->stile."]"; ?>
contenuto; ?>
} - nessuno- simile allo stile non specificato affatto. Visualizza un modulo senza design e funzione titolo modChrome_none($module, &$params, &$attribs)
{
echo $modulo->contenuto;
}
Tutti gli stili preimpostati si trovano nel file templates/system/html/modules.php. Ma non ci limitiamo a utilizzare solo le opzioni fornite, ma siamo perfettamente in grado di crearne di nostre.
3. Crea una modalità Chrome personalizzata.
Pertanto, i tipi di rappresentazione dei moduli predefiniti forniti non soddisfano i requisiti attuali. Devi aggiungere il tuo stile di design. Ad esempio, scegliamo una situazione ripetuta abbastanza frequentemente. Secondo l'incarico, invece di
inserisci il titolo del modulo nel tag , che è semanticamente neutro. È inoltre necessario posizionare il blocco del contenuto del modulo in un blocco separato . Per creare il tuo stile di output del modulo, utilizzeremo strumenti standard. La maggior parte dei template Joomla hanno una cartella html/ (templates/nome template/html/), che viene utilizzata per i cosiddetti template. Cioè, se copi un modello di modulo in questa cartella, invece del modello dalla directory modules/my_module/tmpl/default, verrà generato il file da templates/template name/html/my_modules/default. I componenti sono modellati allo stesso modo. Comodo e pratico. Nella cartella html/ del tuo template, crea un file module.php. Se nel modello non è presente una cartella di questo tipo, la creeremo. Scriviamolo in un file function modChrome_modbox($module, &$params, &$attribs) // Chiama la funzione
{
if (!empty ($module->content)) : /* Controlla se la posizione contiene un modulo abilitato */?>
">
showtitle != 0) : /* controlla se il titolo del modulo è incluso */ ?>
titolo; /* Stampa il titolo */ ?>
contenuto; /* Emette il contenuto del modulo */ ?>
}
?> Fatto. Ora devi solo specificarlo come stile di output. Assegniamo un modulo alla nostra posizione e guardiamo il risultato.
Uno degli aspetti migliori di PHP è il modo in cui funziona con i moduli HTML. La cosa principale qui è che ogni elemento del modulo diventa automaticamente disponibile per i tuoi programmi PHP. Per informazioni dettagliate sull'utilizzo dei moduli in PHP, leggere la sezione. Ecco un esempio di modulo HTML:
Esempio n. 1 Modulo HTML più semplice
Non c'è niente di speciale in questo modulo. Questo è un normale modulo HTML senza tag speciali. Quando l'utente compila il modulo e fa clic sul pulsante di invio, verrà richiamata la pagina action.php. Questo file potrebbe avere qualcosa del tipo:
Esempio n.2 Visualizzazione dei dati del modulo
Ciao,
.
A teanni.
Esempio di output di questo programma:
Ciao, Sergey. Hai 30 anni.
Se non prendi in considerazione i pezzi di codice con htmlspecialchars() E (int), il principio di funzionamento del codice dovrebbe essere semplice e comprensibile. htmlspecialchars() Garantisce che i caratteri HTML "speciali" siano codificati correttamente in modo che nella tua pagina non vengano inseriti HTML o Javascript dannosi. Possiamo semplicemente convertire il campo dell'età, che sappiamo dovrebbe essere un numero numero intero, che eliminerà automaticamente i caratteri indesiderati. PHP può anche farlo automaticamente utilizzando l'estensione filter. Le variabili $_POST["name"] e $_POST["age"] vengono impostate automaticamente da PHP. In precedenza utilizzavamo la variabile superglobale $_SERVER, ma qui utilizziamo anche la variabile superglobale $_POST, che contiene tutti i dati POST. notare che metodo di invio(metodo) del nostro modulo è POST. Se usassimo il metodo OTTENERE, allora le informazioni sul nostro modulo sarebbero nella variabile superglobale $_GET . In alternativa, puoi utilizzare la variabile $_REQUEST se l'origine dati non è importante. Questa variabile contiene una combinazione di dati GET, POST e COOKIE.
15 anni fa
Secondo la specifica HTTP, dovresti utilizzare il metodo POST quando usi il modulo per modificare lo stato di qualcosa sul server. Ad esempio, se una pagina ha un modulo per consentire agli utenti di aggiungere i propri commenti, come questo pagina qui, il modulo dovrebbe utilizzare POST. Se fai clic su "Ricarica" o "Aggiorna" su una pagina che hai raggiunto tramite un POST, si tratta quasi sempre di un errore: non dovresti pubblicare lo stesso commento due volte. ecco perché queste pagine non vengono aggiunte ai segnalibri o memorizzate nella cache.
Dovresti usare il metodo GET quando il tuo modulo, beh, sta ottenendo qualcosa dal server e non sta effettivamente cambiando nulla. Ad esempio, il modulo per un motore di ricerca dovrebbe utilizzare GET, poiché la ricerca in un sito Web non dovrebbe modificare nulla che possa interessare al cliente e aggiungere segnalibri o memorizzare nella cache i risultati di una query del motore di ricerca è altrettanto utile quanto aggiungere segnalibri o memorizzare nella cache una pagina HTML statica.
2 anni fa
Vale la pena fare chiarezza:
POST non è più sicuro di GET.
Le ragioni per scegliere GET vs POST coinvolgono vari fattori come l'intento della richiesta (stai "inviando" informazioni?), la dimensione della richiesta (ci sono limiti alla lunghezza di un URL e i parametri GET vengono inviati in l'URL) e la facilità con cui vuoi che l'azione sia condivisibile: ad esempio, le ricerche di Google sono GET perché semplifica la copia e la condivisione della query di ricerca con qualcun altro semplicemente condividendo l'URL.
La sicurezza è solo una considerazione qui perché un GET è più facile da condividere rispetto a un POST. Esempio: non vuoi che GET invii una password, perché l'utente potrebbe condividere l'URL risultante ed esporre inavvertitamente la propria password.
Tuttavia, un GET e un POST sono ugualmente facili da intercettare da parte di un utente malintenzionato ben posizionato se non si distribuisce TLS/SSL per proteggere la connessione di rete stessa.
Tutti i moduli inviati tramite HTTP (di solito la porta 80) non sono sicuri e oggi (2017) non ci sono molte buone ragioni per cui un sito Web pubblico non utilizzi HTTPS (che è fondamentalmente HTTP + Transport Layer Security).
Come bonus, se utilizzi TLS riduci al minimo il rischio che i tuoi utenti ricevano codice (AD) inserito nel tuo traffico che non è stato inserito da te.
Questa è una vulnerabilità comune della classe che include PHP. Ma la persona per cui ho effettuato l’audit mi ha detto che questa vulnerabilità non può essere sfruttata, quindi non conta. Ho dovuto discutere con lui
Cos'è PHP-include
Conduciamo un piccolo programma educativo su questa vulnerabilità. PHP-include è una vulnerabilità che consente di “includere” un file arbitrario, ad esempio questo codice:
$modulo=$_REQUEST["modulo"]; include("moduli/".$modulo);
E poiché di solito non ci sono tag PHP nel file “/etc/passwd” (), quindi verrà visualizzato nel browser, proprio come il codice html verrebbe visualizzato dietro i tag php in un normale script php. Naturalmente, la lettura dei file è solo una delle possibili implementazioni di questo attacco. La cosa principale è includere i file necessari con il codice PHP necessario.
Torniamo all'esempio. Complichiamolo:
$modulo=$_REQUEST["modulo"]; include("moduli/".$modulo."/modulo.class.php");
$modulo = $_REQUEST ["modulo"];
include ("moduli/" . $modulo . "/module.class.php" ) ;
Come puoi vedere, ora alla fine viene aggiunta una riga alla nostra variabile, che ci impedisce di includere qualsiasi file. Pertanto, molte funzioni PHP non sono sicure a livello binario, ovvero tali funzioni considerano un byte NULL come la fine di una stringa. Accediamo allo script in questo modo:
script.php?module=../../../../../../../../../../../etc/passwd%00
E se la direttiva magic_quotes è disabilitata, vedremo di nuovo il contenuto di /etc/passwd
Esiste una vulnerabilità?
Torniamo al nostro codice:
$modulo=aggiungi barre($_REQUEST["modulo"]); include("moduli/".$modulo."/modulo.class.php");
$modulo = aggiunge barre ($_REQUEST ["modulo"]);
include ("moduli/" . $modulo . "/module.class.php" ) ;
Come puoi vedere, la nostra variabile è costretta a passare attraverso “addslashes” e se proviamo a utilizzare un byte NULL, verrà convertito in “\0” e l'inclusione non funzionerà.
Ma il progresso non si ferma! Si scopre che alcuni ragazzi dell'USH hanno trovato una caratteristica interessante in PHP: i vettori di attacco del filesystem PHP (inglese). Per riassumere brevemente il succo dell'articolo, php elabora i percorsi utilizzando diverse funzionalità:
- Troncamento del percorso- php tronca la stringa del percorso alla lunghezza specificata MAXPATHLEN (su Windows fino a 270 caratteri, su NIX - solitamente 4096, su BSD - solitamente 1024)
- Normalizzazione del percorso— php elabora il percorso in un modo speciale, rimuovendo i caratteri extra “/” e “/”. e le loro varie combinazioni
- Riduzione alla forma canonica— vengono rimosse le transizioni non necessarie, ad esempio “dir1/dir2/../dir3” viene convertito in “dir1/dir3/” mentre l'esistenza della directory “dir2” non viene verificata, e altre trasformazioni simili (ovvero continuazione della normalizzazione )
Ora, in ordine, cosa succede al percorso superato:
- Se il percorso è relativo, vengono prima sostituiti i valori della direttiva include_path
- Il percorso viene quindi tagliato ad una certa lunghezza a seconda della piattaforma
- Il percorso si sta normalizzando
- Il percorso è ridotto alla forma canonica
Ora proviamo a usarlo. Proviamo a includere un determinato file "test.php" che si trova nella directory "modules/". Per fare ciò, aggiungi il simbolo “/.” alla fine. in modo che la lunghezza totale, insieme al nome del file e al valore di include_path, sia ovviamente maggiore di 4096 caratteri.
script.php?module=test.php/././.[...]/././.
In questo caso, devi indovinare in modo che l'intera stringa del percorso (già ritagliata) termini con un punto (importante!) e non con una barra. Per fare ciò, puoi aggiungere una barra come questa:
E una di queste opzioni funzionerà sicuramente.
Analizzando
Vediamo in ordine quali trasformazioni accadranno al percorso
moduli/test.php//././.[...]/./././module.class.php
4200 caratteri
La prima cosa che accade alla riga è che vi viene aggiunto il valore di include_path:
/home/site/public_html/modules/test.php//././.[...]/./././module.class.php
4223 caratteri
La stringa viene quindi troncata in MAXPATHLEN (diciamo 4096):
/home/site/public_html/modules/test.php//././.[...]/./.
4096 caratteri
Qui puoi vedere perché è stato necessario aggiungere un'altra barra (altrimenti la riga sarebbe stata tagliata fino alla barra). Ora questa riga è normalizzata, rimuovendo prima le barre extra:
/home/site/public_html/modules/test.php/././.[...]/./.
4095 caratteri
Di conseguenza, otteniamo il percorso corretto del file di cui abbiamo bisogno e questo percorso sarà già trasferito nell'inclusione e il file di cui abbiamo bisogno verrà incluso.
Cioè, è così che includeremo con successo il nostro file "test.php".
script.php?module=test.php//././.[...]/././.
Ciò significa che la vulnerabilità non è teorica. Di conseguenza, il mio cliente ha perso la scommessa e io ho vinto la scommessa e i 10 rubli su cui abbiamo scommesso. Naturalmente, oltre a 10 rubli, ho anche conquistato la fiducia e il rispetto agli occhi del cliente, il che è anche importante.
Appunti
Qui esaminerò un paio di caratteristiche interessanti dello sfruttamento di questa vulnerabilità.
Esci dalla rubrica
Considera questo codice:
)
;
Tralasciamo il punto in cui è possibile utilizzare RFI e includere un file da un server remoto. Diciamo "allow_url_include=OFF" sul server.
Consideriamo una situazione in cui dobbiamo includere un file dalla directory seguente:
script.php?module=../test.php/././.[...]/././.
Tale richiesta genererà un errore come file non trovato. E per aggirare questo problema, dobbiamo chiamarlo così:
script.php?module=blabla/../../test.php/././.[...]/././.
Non invano ho descritto la canonizzazione dei cammini. Grazie ad esso, la directory “blabla” non deve esistere.
Aggiunta di barre semplici
Un lettore attento probabilmente ha notato che nella descrizione della normalizzazione ho scritto che le barre extra “/” e i punti con le barre “/.” vengono rimossi, quindi perché non usare semplicemente le barre per evitare inutili problemi con il punto che termina alla fine.
Riguarda gli algoritmi, ovvero una barra con un punto "/". viene completamente rimosso. Ma con le barre semplici la situazione è un po' più complicata; durante la normalizzazione, ogni due barre vengono sostituite da una finché non rimane solo una (!) barra, esempio:
/home/site/public_html/modules/test.php///////////////////
57 caratteri
↓
/home/site/public_html/modules/test.php/////////
48 caratteri
↓
/home/site/public_html/modules/test.php/////
44 caratteri
↓
/home/sito/public_html/modules/test.php///
42 caratteri
↓
/home/sito/public_html/modules/test.php//
41 caratteri
↓
/home/sito/public_html/modules/test.php/
40 caratteri
Una piccola digressione:
Inoltre, se presti attenzione a molte risorse di hacking popolari, noterai questo errore. A quanto ho capito, questo errore è iniziato con un articolo di un certo Raz0r in cui proponeva un vettore:
index.php?act=../../../../../etc/passwd/////[…]/////
E attenzione anche alla rivista ][aker ha ripetuto questo errore nel suo articolo. Inoltre, anche nell'articolo originale dell'USH era scritto chiaramente che non è consigliabile usare solo le barre, ed è necessario lasciare un punto alla fine prima della normalizzazione. Ma le barre semplici (anche senza punto alla fine) funzionano solo in PHP con Suhosin.
Cioè, usa una barra con un punto "/". - un metodo più universale, poiché, a differenza delle barre “/”, funziona per tutte le versioni di php.
Conclusione
Spero che questo articolo ti aiuti a capire che non dovresti lasciare nemmeno la minima vulnerabilità nei tuoi script, poiché prima o poi puoi sviluppare per loro il tuo vettore di attacco, il che può portare a gravi conseguenze.
L'elemento em rappresenta un passaggio di testo con enfasi. Puoi usarlo per attirare l'attenzione del lettore sul significato di una frase o di un paragrafo. Ti dirò cosa significa dopo , che descrive l'elemento em.
Tabella 8-6: elemento em
Figura 8-3: Utilizzando l'elemento em
In questo esempio, ho messo l'accento su I (I) all'inizio della frase. Se pensiamo all'elemento em, quando diciamo una frase ad alta voce, stiamo considerando il fatto che la frase è una risposta a una domanda. Ad esempio, immagina che io chieda: "A chi piacciono le mele e le arance?" La tua risposta sarà: “Mi piacciono le mele e le arance”. (Quando lo dici ad alta voce e metti l'accento su Io, chiarisci che sei una persona a cui piacciono questi frutti).
Ma se chiedessi: "Ti piacciono le mele e cos'altro?" Potresti rispondere: “Mi piacciono le mele e le arance”. In questo caso l'accento sarà posto sull'ultima parola, sottolineando che le arance sono un altro frutto che ti piace. Questa opzione in HTML sarebbe simile a questa:
Mi piacciono le mele e
arance
.
Definizione di parole straniere e termini tecnici
L'elemento i denota una parte di testo di natura diversa rispetto al contenuto circostante. Si tratta di una definizione abbastanza vaga, ma esempi comuni includono parole di altre lingue, termini tecnici o scientifici e persino pensieri umani (in contrapposizione alla parola). L'elemento i è descritto.
Tabella 8-7: Elemento i
Figura 8-5: Utilizzando l'elemento s
![](https://i2.wp.com/storage.smarly.net/html5/8.5.png)
Identificazione del testo importante
L'elemento forte denota un passaggio di testo importante. Questo elemento è descritto in.
Tabella 8-9: Elemento forte
Figura 8-7: Utilizzando l'elemento u
![](https://i1.wp.com/storage.smarly.net/html5/8.7.png)
Aggiunta di caratteri piccoli
L'elemento piccolo denota un carattere piccolo ed è spesso utilizzato per qualificazioni e chiarimenti. B rappresenta l'elemento piccolo.
Tabella 8-11: elemento piccolo
Figura 8-8: Utilizzando l'elemento piccolo
![](https://i1.wp.com/storage.smarly.net/html5/8.8.png)
Aggiunta di un apice e un pedice
È possibile utilizzare gli elementi sub e sup per denotare rispettivamente apice e pedice. Gli apici vengono utilizzati per scrivere le parole in alcune lingue e sia l'apice che il pedice vengono utilizzati in semplici espressioni matematiche. Questi elementi sono presentati in.
Tabella 8-12: Elementi sub e sup
Figura 8-9: Utilizzando gli elementi sub e sup
function modChrome_modbox($module, &$params, &$attribs) // Chiama la funzione
{
if (!empty ($module->content)) : /* Controlla se la posizione contiene un modulo abilitato */?>
showtitle != 0) : /* controlla se il titolo del modulo è incluso */ ?>
titolo; /* Stampa il titolo */ ?>
contenuto; /* Emette il contenuto del modulo */ ?>
}
?> Fatto. Ora devi solo specificarlo come stile di output.
Uno degli aspetti migliori di PHP è il modo in cui funziona con i moduli HTML. La cosa principale qui è che ogni elemento del modulo diventa automaticamente disponibile per i tuoi programmi PHP. Per informazioni dettagliate sull'utilizzo dei moduli in PHP, leggere la sezione. Ecco un esempio di modulo HTML:
Esempio n. 1 Modulo HTML più semplice
Non c'è niente di speciale in questo modulo. Questo è un normale modulo HTML senza tag speciali. Quando l'utente compila il modulo e fa clic sul pulsante di invio, verrà richiamata la pagina action.php. Questo file potrebbe avere qualcosa del tipo:
Esempio n.2 Visualizzazione dei dati del modulo
Ciao,
.
A teanni.
Esempio di output di questo programma:
Ciao, Sergey. Hai 30 anni.
Se non prendi in considerazione i pezzi di codice con htmlspecialchars() E (int), il principio di funzionamento del codice dovrebbe essere semplice e comprensibile. htmlspecialchars() Garantisce che i caratteri HTML "speciali" siano codificati correttamente in modo che nella tua pagina non vengano inseriti HTML o Javascript dannosi. Possiamo semplicemente convertire il campo dell'età, che sappiamo dovrebbe essere un numero numero intero, che eliminerà automaticamente i caratteri indesiderati. PHP può anche farlo automaticamente utilizzando l'estensione filter. Le variabili $_POST["name"] e $_POST["age"] vengono impostate automaticamente da PHP. In precedenza utilizzavamo la variabile superglobale $_SERVER, ma qui utilizziamo anche la variabile superglobale $_POST, che contiene tutti i dati POST. notare che metodo di invio(metodo) del nostro modulo è POST. Se usassimo il metodo OTTENERE, allora le informazioni sul nostro modulo sarebbero nella variabile superglobale $_GET . In alternativa, puoi utilizzare la variabile $_REQUEST se l'origine dati non è importante. Questa variabile contiene una combinazione di dati GET, POST e COOKIE.
15 anni fa
Secondo la specifica HTTP, dovresti utilizzare il metodo POST quando usi il modulo per modificare lo stato di qualcosa sul server. Ad esempio, se una pagina ha un modulo per consentire agli utenti di aggiungere i propri commenti, come questo pagina qui, il modulo dovrebbe utilizzare POST. Se fai clic su "Ricarica" o "Aggiorna" su una pagina che hai raggiunto tramite un POST, si tratta quasi sempre di un errore: non dovresti pubblicare lo stesso commento due volte. ecco perché queste pagine non vengono aggiunte ai segnalibri o memorizzate nella cache.
Dovresti usare il metodo GET quando il tuo modulo, beh, sta ottenendo qualcosa dal server e non sta effettivamente cambiando nulla. Ad esempio, il modulo per un motore di ricerca dovrebbe utilizzare GET, poiché la ricerca in un sito Web non dovrebbe modificare nulla che possa interessare al cliente e aggiungere segnalibri o memorizzare nella cache i risultati di una query del motore di ricerca è altrettanto utile quanto aggiungere segnalibri o memorizzare nella cache una pagina HTML statica.
2 anni fa
Vale la pena fare chiarezza:
POST non è più sicuro di GET.
Le ragioni per scegliere GET vs POST coinvolgono vari fattori come l'intento della richiesta (stai "inviando" informazioni?), la dimensione della richiesta (ci sono limiti alla lunghezza di un URL e i parametri GET vengono inviati in l'URL) e la facilità con cui vuoi che l'azione sia condivisibile: ad esempio, le ricerche di Google sono GET perché semplifica la copia e la condivisione della query di ricerca con qualcun altro semplicemente condividendo l'URL.
La sicurezza è solo una considerazione qui perché un GET è più facile da condividere rispetto a un POST. Esempio: non vuoi che GET invii una password, perché l'utente potrebbe condividere l'URL risultante ed esporre inavvertitamente la propria password.
Tuttavia, un GET e un POST sono ugualmente facili da intercettare da parte di un utente malintenzionato ben posizionato se non si distribuisce TLS/SSL per proteggere la connessione di rete stessa.
Tutti i moduli inviati tramite HTTP (di solito la porta 80) non sono sicuri e oggi (2017) non ci sono molte buone ragioni per cui un sito Web pubblico non utilizzi HTTPS (che è fondamentalmente HTTP + Transport Layer Security).
Come bonus, se utilizzi TLS riduci al minimo il rischio che i tuoi utenti ricevano codice (AD) inserito nel tuo traffico che non è stato inserito da te.
Questa è una vulnerabilità comune della classe che include PHP. Ma la persona per cui ho effettuato l’audit mi ha detto che questa vulnerabilità non può essere sfruttata, quindi non conta. Ho dovuto discutere con lui
Cos'è PHP-include
Conduciamo un piccolo programma educativo su questa vulnerabilità. PHP-include è una vulnerabilità che consente di “includere” un file arbitrario, ad esempio questo codice:
$modulo=$_REQUEST["modulo"]; include("moduli/".$modulo);
E poiché di solito non ci sono tag PHP nel file “/etc/passwd” (), quindi verrà visualizzato nel browser, proprio come il codice html verrebbe visualizzato dietro i tag php in un normale script php. Naturalmente, la lettura dei file è solo una delle possibili implementazioni di questo attacco. La cosa principale è includere i file necessari con il codice PHP necessario.
Torniamo all'esempio. Complichiamolo:
$modulo=$_REQUEST["modulo"]; include("moduli/".$modulo."/modulo.class.php");
$modulo = $_REQUEST ["modulo"]; include ("moduli/" . $modulo . "/module.class.php" ) ; |
Come puoi vedere, ora alla fine viene aggiunta una riga alla nostra variabile, che ci impedisce di includere qualsiasi file. Pertanto, molte funzioni PHP non sono sicure a livello binario, ovvero tali funzioni considerano un byte NULL come la fine di una stringa. Accediamo allo script in questo modo:
script.php?module=../../../../../../../../../../../etc/passwd%00
E se la direttiva magic_quotes è disabilitata, vedremo di nuovo il contenuto di /etc/passwd
Esiste una vulnerabilità?
Torniamo al nostro codice:
$modulo=aggiungi barre($_REQUEST["modulo"]); include("moduli/".$modulo."/modulo.class.php");
$modulo = aggiunge barre ($_REQUEST ["modulo"]); include ("moduli/" . $modulo . "/module.class.php" ) ; |
Come puoi vedere, la nostra variabile è costretta a passare attraverso “addslashes” e se proviamo a utilizzare un byte NULL, verrà convertito in “\0” e l'inclusione non funzionerà.
Ma il progresso non si ferma! Si scopre che alcuni ragazzi dell'USH hanno trovato una caratteristica interessante in PHP: i vettori di attacco del filesystem PHP (inglese). Per riassumere brevemente il succo dell'articolo, php elabora i percorsi utilizzando diverse funzionalità:
- Troncamento del percorso- php tronca la stringa del percorso alla lunghezza specificata MAXPATHLEN (su Windows fino a 270 caratteri, su NIX - solitamente 4096, su BSD - solitamente 1024)
- Normalizzazione del percorso— php elabora il percorso in un modo speciale, rimuovendo i caratteri extra “/” e “/”. e le loro varie combinazioni
- Riduzione alla forma canonica— vengono rimosse le transizioni non necessarie, ad esempio “dir1/dir2/../dir3” viene convertito in “dir1/dir3/” mentre l'esistenza della directory “dir2” non viene verificata, e altre trasformazioni simili (ovvero continuazione della normalizzazione )
Ora, in ordine, cosa succede al percorso superato:
- Se il percorso è relativo, vengono prima sostituiti i valori della direttiva include_path
- Il percorso viene quindi tagliato ad una certa lunghezza a seconda della piattaforma
- Il percorso si sta normalizzando
- Il percorso è ridotto alla forma canonica
Ora proviamo a usarlo. Proviamo a includere un determinato file "test.php" che si trova nella directory "modules/". Per fare ciò, aggiungi il simbolo “/.” alla fine. in modo che la lunghezza totale, insieme al nome del file e al valore di include_path, sia ovviamente maggiore di 4096 caratteri.
script.php?module=test.php/././.[...]/././.
In questo caso, devi indovinare in modo che l'intera stringa del percorso (già ritagliata) termini con un punto (importante!) e non con una barra. Per fare ciò, puoi aggiungere una barra come questa:
E una di queste opzioni funzionerà sicuramente.
Analizzando
Vediamo in ordine quali trasformazioni accadranno al percorso
moduli/test.php//././.[...]/./././module.class.php
4200 caratteri
La prima cosa che accade alla riga è che vi viene aggiunto il valore di include_path:
/home/site/public_html/modules/test.php//././.[...]/./././module.class.php
4223 caratteri
La stringa viene quindi troncata in MAXPATHLEN (diciamo 4096):
/home/site/public_html/modules/test.php//././.[...]/./.
4096 caratteri
Qui puoi vedere perché è stato necessario aggiungere un'altra barra (altrimenti la riga sarebbe stata tagliata fino alla barra). Ora questa riga è normalizzata, rimuovendo prima le barre extra:
/home/site/public_html/modules/test.php/././.[...]/./.
4095 caratteri
Di conseguenza, otteniamo il percorso corretto del file di cui abbiamo bisogno e questo percorso sarà già trasferito nell'inclusione e il file di cui abbiamo bisogno verrà incluso.
Cioè, è così che includeremo con successo il nostro file "test.php".
script.php?module=test.php//././.[...]/././.
Ciò significa che la vulnerabilità non è teorica. Di conseguenza, il mio cliente ha perso la scommessa e io ho vinto la scommessa e i 10 rubli su cui abbiamo scommesso. Naturalmente, oltre a 10 rubli, ho anche conquistato la fiducia e il rispetto agli occhi del cliente, il che è anche importante.
Appunti
Qui esaminerò un paio di caratteristiche interessanti dello sfruttamento di questa vulnerabilità.
Esci dalla rubrica
Considera questo codice:
) ;
Tralasciamo il punto in cui è possibile utilizzare RFI e includere un file da un server remoto. Diciamo "allow_url_include=OFF" sul server.
Consideriamo una situazione in cui dobbiamo includere un file dalla directory seguente:
script.php?module=../test.php/././.[...]/././.
Tale richiesta genererà un errore come file non trovato. E per aggirare questo problema, dobbiamo chiamarlo così:
script.php?module=blabla/../../test.php/././.[...]/././.
Non invano ho descritto la canonizzazione dei cammini. Grazie ad esso, la directory “blabla” non deve esistere.
Aggiunta di barre semplici
Un lettore attento probabilmente ha notato che nella descrizione della normalizzazione ho scritto che le barre extra “/” e i punti con le barre “/.” vengono rimossi, quindi perché non usare semplicemente le barre per evitare inutili problemi con il punto che termina alla fine.
Riguarda gli algoritmi, ovvero una barra con un punto "/". viene completamente rimosso. Ma con le barre semplici la situazione è un po' più complicata; durante la normalizzazione, ogni due barre vengono sostituite da una finché non rimane solo una (!) barra, esempio:
/home/site/public_html/modules/test.php///////////////////
57 caratteri
↓
/home/site/public_html/modules/test.php/////////
48 caratteri
↓
/home/site/public_html/modules/test.php/////
44 caratteri
↓
/home/sito/public_html/modules/test.php///
42 caratteri
↓
/home/sito/public_html/modules/test.php//
41 caratteri
↓
/home/sito/public_html/modules/test.php/
40 caratteri
Una piccola digressione:
Inoltre, se presti attenzione a molte risorse di hacking popolari, noterai questo errore. A quanto ho capito, questo errore è iniziato con un articolo di un certo Raz0r in cui proponeva un vettore:
index.php?act=../../../../../etc/passwd/////[…]/////
E attenzione anche alla rivista ][aker ha ripetuto questo errore nel suo articolo. Inoltre, anche nell'articolo originale dell'USH era scritto chiaramente che non è consigliabile usare solo le barre, ed è necessario lasciare un punto alla fine prima della normalizzazione. Ma le barre semplici (anche senza punto alla fine) funzionano solo in PHP con Suhosin.
Cioè, usa una barra con un punto "/". - un metodo più universale, poiché, a differenza delle barre “/”, funziona per tutte le versioni di php.
Conclusione
Spero che questo articolo ti aiuti a capire che non dovresti lasciare nemmeno la minima vulnerabilità nei tuoi script, poiché prima o poi puoi sviluppare per loro il tuo vettore di attacco, il che può portare a gravi conseguenze.
L'elemento em rappresenta un passaggio di testo con enfasi. Puoi usarlo per attirare l'attenzione del lettore sul significato di una frase o di un paragrafo. Ti dirò cosa significa dopo , che descrive l'elemento em.
Tabella 8-6: elemento em
Figura 8-3: Utilizzando l'elemento em
In questo esempio, ho messo l'accento su I (I) all'inizio della frase. Se pensiamo all'elemento em, quando diciamo una frase ad alta voce, stiamo considerando il fatto che la frase è una risposta a una domanda. Ad esempio, immagina che io chieda: "A chi piacciono le mele e le arance?" La tua risposta sarà: “Mi piacciono le mele e le arance”. (Quando lo dici ad alta voce e metti l'accento su Io, chiarisci che sei una persona a cui piacciono questi frutti).
Ma se chiedessi: "Ti piacciono le mele e cos'altro?" Potresti rispondere: “Mi piacciono le mele e le arance”. In questo caso l'accento sarà posto sull'ultima parola, sottolineando che le arance sono un altro frutto che ti piace. Questa opzione in HTML sarebbe simile a questa:
Mi piacciono le mele e arance .
Definizione di parole straniere e termini tecnici
L'elemento i denota una parte di testo di natura diversa rispetto al contenuto circostante. Si tratta di una definizione abbastanza vaga, ma esempi comuni includono parole di altre lingue, termini tecnici o scientifici e persino pensieri umani (in contrapposizione alla parola). L'elemento i è descritto.
Tabella 8-7: Elemento i
Figura 8-5: Utilizzando l'elemento s
![](https://i2.wp.com/storage.smarly.net/html5/8.5.png)
Identificazione del testo importante
L'elemento forte denota un passaggio di testo importante. Questo elemento è descritto in.
Tabella 8-9: Elemento forte
Figura 8-7: Utilizzando l'elemento u
![](https://i1.wp.com/storage.smarly.net/html5/8.7.png)
Aggiunta di caratteri piccoli
L'elemento piccolo denota un carattere piccolo ed è spesso utilizzato per qualificazioni e chiarimenti. B rappresenta l'elemento piccolo.
Tabella 8-11: elemento piccolo
Figura 8-8: Utilizzando l'elemento piccolo
![](https://i1.wp.com/storage.smarly.net/html5/8.8.png)
Aggiunta di un apice e un pedice
È possibile utilizzare gli elementi sub e sup per denotare rispettivamente apice e pedice. Gli apici vengono utilizzati per scrivere le parole in alcune lingue e sia l'apice che il pedice vengono utilizzati in semplici espressioni matematiche. Questi elementi sono presentati in.
Tabella 8-12: Elementi sub e sup
Figura 8-9: Utilizzando gli elementi sub e sup
![](https://i1.wp.com/storage.smarly.net/html5/8.9.png)