[WikiDyd] [TitleIndex] [WordIndex

Cel zajęć

Celem zajęć jest zapoznanie z problemami bezpieczeństwa aplikacji internetowych, takimi jak ataki typu Injection i XSS, oraz metody obrony przed nimi.

Wprowadzenie

Uruchomienie mod_python
Jedną z metod pozwalających na korzystanie z języka Python do tworzenia aplikacji internetowych jest wykorzystanie modułu Apache mod_python. Do realizacji zadań na zajęciach wystarczy najprostsze uruchomienie, które wymaga dodania tylko kilku linii w konfiguracji serwera Apache dotyczącej określonego katalogu.

AddHandler mod_python .py
PythonHandler mod_python.publisher
PythonDebug On

Ataki Injection i XSS
Do celu demonstracji ataków posłużymy się bardzo prostą aplikacją Kalkulatora. Składa się ona z formularza w języku HTML,

<html>
<h3>Kalkulator</h3>
<form action="calc.py" method=GET>
<input type="text" name="expr">
<input type="submit" value="Oblicz">
</form>
</html>

oraz skryptu calc.py, który obsługuje obliczanie wyrażeń.

def index(req, expr='0'):
        html = '<html>'
        html += 'Wynik: '
        exec "result=%s" % expr
        html += str(result)
        html += '</html>'
        return html

Powyższy skrypt zawiera poważny błąd polegający braku sprawdzenia poprawności zmiennej expr, którą użytkownik wprowadził w formularzu. Wykorzystując ten błąd można wstrzyknąć (ang. Injection) dowolny kod napisany w języku Python, który zostanie wykonany na serwerze.
Podpowiedź 1: Wiele poleceń można rozdzielać średnikami.
Podpowiedź 2: Manipulacja zmienną html pozwoli na wyświetlenie wyników.
Podpowiedź 3: Wykorzystaj pełne możliwości Pythona. Możesz używać polecenia import.

Ataki XSS polegają na wstrzyknięciu kodu Javascript do kodu HTML strony. Nasz skrypt calc.py jest podatny także na ten błąd. Prostym testem podatności jest wyświetlenia okienka informacyjnego przy pomocy:

<script> alert('XSS'); </script>

Ataki na uwierzytelnianie
Drugą podstawę do ćwiczeń stanowić będzie stanowić aplikacja realizująca uwierzytelnianie przy pomocy tajnego hasła. Podobnie jak Kalkulator składa się ona z dwóch części: formularza HTML,

<html>
<h3>Uwierzytelnianie</h3>
<form action="auth.py" method=GET>
Login: <input type="text" name="login"><br>
Haslo: <input type="password" name="passwd"><br>
<input type="submit" value="Click">
</form>
</html>

oraz skryptu auth.py, który przeprowadza właściwe uwierzytelnianie.

user = { 'admin':'123', 'user':'999' }

def index(req, login='', passwd=''):
  if user[login] == passwd :
    info = "Witamy uzytkownika %s" % login
  else :
    info = "Blad uwierzytelniania" 
  html = '<html>'+info+'</html>'
  return html

Program ten zawiera także błędy związane z brakiem kontroli danych, ale tym razem skupmy się na atakach na hasło. Pierwsza słabość dotyczy tego, że hasło jest przechowywane w formie jawnej (należy wykorzystać funkcję jednokierunkową hash). Drugi problem to podatność na ataki słownikowe (brak losowej soli). Trzeci problem dotyczy ataków typu brute-force (obrona przy pomocy zwłoki czasowej, limit nieudanych prób, rozciąganie klucza).

Potrzebna wiedza

Dodatkowe informacje

Hasła dla Google: XSS, Injection

Przykładowe zadania

  1. Przeprowadź atak (Injection) na przykładową aplikację kalkulatora, którego celem jest:
    • wyświetlenie zawartości katalogu /etc/ na serwerze,
    • rozpoznanie nazwy i wersji systemu operacyjnego serwera,
    • ściągnięcie z sieci dowolnego pliku i uruchomienie go.
  2. Przeprowadź atak na przeglądarkę użytkownika (XSS), którego celem jest:
    • wyświetlenie okienka z napisem "Poważny błąd serwera",
    • zamknięcie okna przeglądarki,
    • wyświetlenie ciasteczek "cookies".
  3. Zaprezentuj metody obrony przed przeprowadzonymi atakami Injection i XSS.
  4. Napisz skrypt przeprowadzający atak typu brute-force na aplikację Uwierzytelniania. Wykorzystaj urllib2.urlopen() do prostej komunikacji z serwerem).

  5. Popraw auth.py tak aby nie była podatna na ataki brute-force.

  6. Popraw auth.py tak aby hasło było przechowywane w bezpieczny sposób.


2015-09-23 06:44