Funkcjonalność wysyłania plików to miejsce kluczowe na które warto zwrócić szczególną uwagę.
Jeżeli bowiem atakującemu uda się wysłać i uruchomić złośliwy plik może dojść do przejęcia całego serwera.
Dzisiaj w od 0 do pentestera pokażę jakie typy plików powinniśmy otoczyć szczególną uwagą.
Formularz wysyłki pliku można zaimplementować w każdym języku programowania.
Ja posłużę się tutaj kodem pochodzącym z oficjalnej dokumentacji frameworka Flask1.
from flask import Flask,request, redirect, url_for, send_from_directory
from werkzeug.utils import secure_filename
import os
UPLOAD_FOLDER = './files'
ALLOWED_EXTENSIONS = set(['pdf', 'png', 'jpg', 'svg', 'swf', 'jpeg', 'gif'])
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
file = request.files['file']
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return redirect(url_for('uploaded_file', filename=filename))
return '''
<form method=post enctype=multipart/form-data>
<input type=file name=file>
<input type=submit value=Upload>
</form>
'''
@app.route('/uploads/<filename>')
def uploaded_file(filename):
return send_from_directory(app.config['UPLOAD_FOLDER'], filename)
Pokrótce opiszmy co robią dane linijki.
Na początku definiujemy folder do którego kopiowane mają być przesłane pliki a także listę rozszerzeń na jakie pozwalamy.
Funkcja allowed_file
odpowiedzialna jest za sprawdzenie, czy wysłany plik znajduje się na liście dozwolonych rozszerzeń.
Następnie mamy funkcję upload_file
, odpowiedzialną za zapisanie prawidłowego pliku w odpowiednim katalogu.
Na samym końcu funkcja uploaded_file
, wyświetlająca podany w parametrze plik.
Jak możemy wyczytać w dokumentacji aby ochronić się przed atakami XSS czyli wykonaniem kodu JavaScript na naszej stronie nie powinnyśmy pozwalać na pliki html
oraz php
.

Jakie jednak inne rozszerzenia mogą sprawić nam kłopot?
Flash lata swojej świetności ma dawno za sobą. Jednak dalej na rynku obecne są przeglądarki, które pozwalają na wyświetlanie treści plików swf
.
Większość użytkowników kojarzy zapewne flasha z prostych minigier dostępnych parę lat temu2.

Posiada on jednak dostęp do sporej części funkcjonalności przeglądarki - w tym do wykonywania kodu JavaScript.
Jeżeli więc pozwalamy na wysyłkę i wyświetlanie plików swf
w przeglądarce musimy liczyć się z konsekwencjami.
Popatrzmy na przykład. Ja użyje pliku xss.swf
3 który został przygotowany właśnie do przeprowadzania takich ataków.
Wyślę więc ten plik przy pomocy Internet Explorera.

Jak widać po wysłaniu pliku - wyświetliło się okienko.

Modyfikując teraz parametrem w linku - możemy wyświetlić swój własny kod, na przykład używając parametru eval
:
xss.swf?a=eval&c=alert(document.domain)
Możesz sobie zadać teraz pytanie: jak popularny jest to błąd?
Jakiś czas temu w standardowej konfiguracji na wysyłanie plików swf
pozwalało DokuWiki4 czyli prosta alternatywa dla Wikipedii.
Podobna sytuacja z WordPressem5 - czyli jednym z największych systemów blogowych na świecie.

W przeszłości pliki swf używane były również do uzyskania funkcjonalności kopiowania tekstu ze strony6.
Dawniej bowiem, przeglądarki nie posiadały tej funkcji wbudowanej natywnie.

Dalej więc na wielu stronach w głębinach zapominanych plików znajdujących się na serwerze można odnaleźć parę plików swf
.
Tutaj dla przykładu lista komponentów, które były w przeszłości lub nadal są podatne na tego typu atak7.

Drugim rzadziej spotykanym rozszerzeniem jest svg
- czyli format grafiki wektorowej nieobwarowany licencjami i patentami, który powstał z myślą o zastosowaniu na stronach www.
Oprócz tworzenia grafiki, format ten może zawierać również kod JavaScript.
Artykuł na ten temat opublikował swego czasu między innymi Sekurak8. Na stronie znajdziemy gotowy plik, który można wykorzystać.
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
<polygon id="triangle" points="0,0 0,50 50,0" fill="#009900" stroke="#004400"/>
<script type="text/javascript">
alert('This app is probably vulnerable to XSS attacks!');
</script>
</svg>
Tym razem, wiadomość zostanie wyświetlona w najnowszej wersji Google Chrome.
Icon made by Freepik, Smashicons from www.flaticon.com