Я занимаюсь серфингом в эти дни и узнал о SQL INJECTION ATTACK. Я попытался реализовать на своей локальной машине, чтобы узнать, как это можно сделать, чтобы я мог предотвратить ее в моей системе …
я написал такой код
Код PHP:
if(count($_POST) > 0){ $con = mysql_connect("localhost","root","") or die(mysql_error()); mysql_select_db('acelera',$con) or die(mysql_error()); // echo $sql = 'SELECT * FROM acl_user WHERE user_email = "'.$_POST['email'].'" AND user_password = "'.$_POST['pass'].'"'; $res_src = mysql_query($sql); while($row = mysql_fetch_array($res_src)){ echo "<pre>";print_r($row);echo "</pre>"; } }
HTML-код:
<html> <head></head> <body> EMAIL : <input type="text" name="email" id="email" /><br /> PASWD : <input type="text" name="pass" id="pass" /><br /> <input type="submit" name="btn_submit" value="submit email pass" /> </body> </html>
по этому коду, если я даю ввод как " OR ""="
тогда SQL-инъекция должна быть выполнена. но он работает неправильно. в почтовых данных у меня есть добавочные слэши, если я даю выше ввода в поле пароля.
может ли кто-нибудь показать мне, как на самом деле SQL INJECTION ATTACK можно сделать? (код будет более заметным)
Возможно, у вас есть магические кавычки. Проверьте возвращаемое значение get_magic_quotes_gpc
.
«Волшебные кавычки» – это античная попытка PHP, чтобы автоматически активировать SQL-инъекцию, но в текущих версиях она устарела, и вам рекомендуется использовать подготовленные инструкции, чтобы избежать инъекции SQL.
См. Здесь, как отключить их, чтобы вы могли экспериментировать с SQL-инъекцией.
Как все уже сказали – у вас, вероятно, есть волшебные цитаты . Хотя вот трюк: эта функция делает SQL Injection труднее выполнять, но не совсем невозможно.
Более того, даже addslashes()
не может вам помочь. Возможный атакующий может попробовать многобайтовые кодировки и некоторые другие трюки.
Вот хорошая статья об этом: http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string
Короче говоря: если вы используете многобайтовые символы в однобайтовой среде, некоторые из них станут двумя однобайтовыми символами – косой чертой, котировками и т. Д.
Я думаю, что в твоих волшебных кодах php.ini или что-то вроде этого. это означает, что специальные символы автоматически экранируются.
На этой странице в руководстве php объясняется, как отключить его:
http://www.php.net/manual/en/security.magicquotes.disabling.php
Я думаю, что вы получаете дополнительную косую черту из-за магических цитат http://ch2.php.net/magic_quotes
Большинство современных установок PHP отключили его, поэтому вы не хотите полагаться на это. Просто используйте mysql_real_escape_string () или, лучше, используйте PDO http://ch2.php.net/pdo
Я предлагаю посмотреть Acunetix, или что-то подобное и бесплатное, как это дополнение для firefox:
https://addons.mozilla.org/en-US/firefox/addon/sql-injection/
Это быстрее для тестирования против SQL Injections, а также сканирует все формы / методы SQLi, о которых вы не знали. Acunetix расширяет это и тестирует RFI, XSS и т. Д.
Использование кода неэффективно.
SQL, который вы пытаетесь сформировать, должен выглядеть так:
SELECT * FROM acl_user WHERE user_email = "a@a.com" Or 1=1; --" AND user_password = ""
Попробуйте ввести:
a@a.com" Or 1=1; --
Как адрес электронной почты и игнорировать пароль.
The – делает остальную часть утверждения игнорируемой.
Вот некоторая хорошая информация по этому вопросу: http://php.net/manual/en/security.database.sql-injection.php
измените его на: noe, если вы вводите пароль как что-то ИЛИ 1 = 1, тогда это вызовет инъекцию
<?PHP if(count($_POST) > 0){ $con = mysql_connect("localhost","root","") or die(mysql_error()); mysql_select_db('acelera',$con) or die(mysql_error()); // echo $sql = "SELECT * FROM acl_user WHERE user_email = ".$_POST['email']." AND user_password = ".$_POST['pass']; $res_src = mysql_query($sql); while($row = mysql_fetch_array($res_src)){ echo "<pre>";print_r($row);echo "</pre>"; } } ?> <html> <head></head> <body> <form action="" method="post"> EMAIL : <input type="text" name="email" id="email" /><br /> PASWD : <input type="text" name="pass" id="pass" /><br /> <input type="submit" name="btn_submit" value="submit email pass" /> </form> </body> </html>
Как предотвратить инъекцию SQl
1) Filter Input – перестать верить вашим пользователям: наибольшая угроза для приложения принадлежит его пользователям. Пользователи не должны быть хорошо воспитаны и послушны, как вы ожидаете. У некоторых пользователей есть плохие намерения, а некоторые просто пытаются проверить свои навыки взлома. Независимо от того, какой код вы собираетесь писать, напишите его с использованием лучших практик и рассмотрите аспекты безопасности. Подтвердить каждое поле в форме
2) Использовать классы оболочки базы данных или PDO. Оболочки базы данных или PDO (в PHP) могут снизить риск прямого доступа входных значений к базе данных. Подготовленные утверждения могут использоваться вместе с PDO, как показано ниже.
http://www.itechnicalblog.com/what-is-a-sql-injection-and-how-to-fix-it/
использовать:
mysql_real_escape_string($_POST['thing'])
Я также предлагаю использовать PDO или MySQLI для подключения / запроса вашей базы данных. старые команды mysql_ являются второстепенными для PHP3, а также улучшением производительности.
Вот хорошее (но упрощенное) введение в то, как SQL Injection работает через PHP / MySQL: http://www.tizag.com/mysqlTutorial/mysql-php-sql-injection.php