Zhakuj swojego Wordpressa, WordUP Trojmiasto

Embed Size (px)

Citation preview

Zhakuj swojego Wordpress'a

Na podstawie studium przypadkw bdw z 2015 roku

WordUP Trjmiasto #4

Plan gry

Troch o testach bezpieczestwa

Troch o podatnociach aplikacji webowych:SQL injection - Wstrzyknicie zapytania do bazy danych - OWASP Top 1

XSS wykonanie zoliwego kodu w kontekcie przegldarki klienta OWASP Top 3

Upload PHP Shell wykonanie kodu na serwerze przez bd w wysyaniu plikw

Podsumowanie - troch o dobrych praktykach

O testach bezpieczestwa webaplikacji

HTTP Proxy modyfikowanie zapyta

1

2

3

4

SQL injection brutalny klasyk

Konsekwencje: odczyt/zapis danych z bazy, utworzenie plikw, odczyt danych z pliku np. z wp-config.php, wykonanie polecenia OS

Jak sprawdzi: Modyfikacja zapytania SQL do bazy danych i sprawdzenie, czy mamy kontrol nad zapytaniemhttp://127.0.0.1/wordpress/?p=2-1

http://127.0.0.1/wordpress/?p=1 order by 100--

http://127.0.0.1/wordpress/?p=1 or 1=1

http://127.0.0.1/wordpress/?p=1' or '1'='1

Rodzaje: Klasyczny

Blind (time based) - najczstszy w pluginach do Wordpress'a

Error

Second order

Blind SQLi w SEO by Yoast

Podatna wersja 1.7.3.3, zaatana 11.03.2015

Payload

Proof of Concept serwer wysa odpowied po 10s, czyli atakujcy ma kontrol nad zapytaniami do serwera baz danych

%2c(select%20*%20from%20(select(sleep(10)))a)

http://127.0.0.1/wordpress/wp-admin/admin.php?page=wpseo_bulk-editor&type=title&orderby=post_date%2c(select%20*%20from%20(select(sleep(10)))a)&order=asc

Blind SQLi w SEO by Yoast

Warunki: atakujcy musi by uwierzytelniony, czyli wczeniej uzyska dostp do konta administratora, edytora, menadera SEO lub insider attackAtak #1: zmodyfikowany payload, ktry sprawdza kolejne znaki hasha hasa administratora Wordpress'a

Tu sprawdzilimy czy pierwszy znak hasha odpowiada 36 znakowi z tabeli ASCII czyli $. Jeli warunek jest prawdziwy to serwer odpowie z opnieniem 5 sekund.

Atak #2: payload, ktry sprawdza kolejne znaki hasa uytkownika bazodanowego dla Wordpress'a wpisanego otwartym tekstem do
wp-config.php

Blind SQLi w SEO by Yoast

Podatna funkcja: parse_item_query mimo zastosowania esc_sql()Podatna wersja: 1.7.3.3

protected function parse_item_query( $subquery, $all_states, $post_type_clause ) {

$orderby = WPSEO_Utils::filter_input( INPUT_GET, 'orderby' );

$orderby = ! empty( $_GET['orderby'] ) ? esc_sql( sanitize_text_field( $_GET['orderby'] ) ) : 'post_title';

$orderby = $this->sanitize_orderby( $orderby );

(...)

$query = "SELECT ID, post_title, post_type, post_status, post_modified, post_dateFROM {$subquery}WHERE post_status IN ({$all_states}) $post_type_clauseORDER BY {$orderby} {$order}LIMIT %d,%d

Blind SQLi WooCommerce 2.3.5

Podatna wersja: 2.3.5 (odkryty przez Matt Berry)Podatny parametr: tax_rate_country w zapytaniu POSTPrzyczyna: refaktoring klasy i brak rzutowaniaProof of Concept:

Patch:

tax_rate_country[(SELECT SLEEP(5))]

SQLi - zabezpieczenia

Prepared statements: biblioteka PDO, Wordpress wpdb->prepare

$wpdb->query( $wpdb->prepare( " INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) VALUES (%d,%s,%s ) ", 1, META_KLUCZ, META_WARTO ) );

Stored procedure:

$result = $wpdb->query("CALL posts_count(@total_posts)");

Eskejpujemy wprowadzane dane przez uytkownika:

esc_sql()*, add_slashes(), mysql_real_escape_string()*patrz. Dokumentacja zamienna przekazywana do zapytania musi by otoczona znakami cudzysowu "

Biae/czarne listy, WAF

Ograniczanie uprawnie

ModSecurity

Kada strona WP to osobny uytkownik DB z ograniczonymi uprawnieniami np. bez uprawnie FILES

XSS - niedoceniany a grony

Mozliwoci ataku: Przejcie zalogowanej sesji (ccokies)

Modyfikacja drzewa DOM strony

Wyciek danych w tle np.keylogger (XmlHttpRequest)

Dostp do danych geolokalizacyjnych, mikrofonu, kamery (HTML5 API)

rdo http://excess-xss.com/

XSS istota podatnoci

Podatno: brak filtracji danych od uytkownika przed ich wywietleniem w aplikacji. Ochrona: zamiana istotnych znakw HTML na encje HTML:

& - &< - ->" -"' -' / -/

Przykad: evilCode()

Wazny jest kontekstContextExample codeHTML element contentuserInputHTML attribute valueURL query valuehttp://example.com/?parameter=userInputCSS valuecolor: userInputJavaScript valuevar name = "userInput";

...

XSS wykry podatno

Szybki test: '';!--"=&{()}

bez '';

podwjny escape\";alert('XSS');//

brak znakw alfanumerycznychhieroglyphy.com ,jsfuck.com

Uwaga: istniej sposoby omijania filtrw OWASP XSS Filter Evasion Cheat Sheet

Stored XSS w Shareaholic 7.6.0.3

Odkryty przez: @kacperszurek , http://security.szurek.pl/shareaholic-7603-xss.htmlPodatna funkcja:

Zapis: do shareholic_settingsWywietlenie: location_id

NA ADNYM ETAPIE NIE MA FILTRACJI W KODZIE

Stored XSS w Shareaholic 7.6.0.3

Proof of Concept: @kacperszurek

Zalogowany uzytkownik moe wykona atak przeciwko gwnemu administratorowi WP

XSS - zabezpieczanie

Na podstawie OWASP XSS Prevention Cheat SheetEskejpuj niezaufane dane w elementach HTML np. pomidzy

w dynamicznie generowanym JS, handlerach zdarze np. onmouseover,

stylach CSS

odpowiednie biblioteki typu HTML sanitizer

funkcje Wordpress'a np.

inne: ciasteczka z flag HttpOnly, nagwek odpowiedzi X-XSS-Protection, wdroenie polityk Content Security Policy

...DANE...

selector { property : ...DANE...; } property value