инъекция php sql


В эти дни я занимался серфингом и узнал об АТАКЕ с использованием SQL-ИНЪЕКЦИЙ. я попытался реализовать на своей локальной машине, чтобы узнать, как это можно сделать, чтобы я мог предотвратить это в своей системе...

Я написал такой код

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-ИНЪЕКЦИИ?(код будет более заметным)

 9
Author: stealthyninja, 2011-07-13

9 answers

Вероятно, у вас включены магические кавычки. Проверьте возвращаемое значение get_magic_quotes_gpc.

"Волшебные кавычки" - это старинная попытка PHP автоматически волшебным образом предотвратить внедрение SQL, но в текущих версиях она устарела, и вам рекомендуется использовать подготовленные операторы, чтобы избежать внедрения SQL.

Смотрите здесь как отключить их, чтобы вы могли экспериментировать с внедрением SQL.

 9
Author: Alin Purcaru, 2011-07-13 11:45:58

Как все уже говорили - у вас, вероятно, есть волшебные кавычки на . Хотя вот в чем хитрость: эта функция усложняет выполнение SQL-инъекции, но не делает ее полностью невозможной.

Более того, даже addslashes() не может вам в этом помочь. Возможный злоумышленник может попробовать многобайтовые кодировки и некоторые другие трюки.

Вот хорошая статья об этом: http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string

Короче говоря: если вы используете многобайтовый символы в однобайтовой среде некоторые из них станут двумя однобайтовыми символами - косыми чертами, кавычками и т.д.

 2
Author: WASD42, 2011-07-13 11:53:59

Я думаю, что в вашем php.ini есть магические цитаты или что-то в этом роде. это означает, что специальные символы автоматически экранируются.

На этой странице в руководстве по php объясняется, как его отключить:

Http://www.php.net/manual/en/security.magicquotes.disabling.php

 1
Author: SynerCoder, 2011-07-13 11:42:15

Я думаю, что вы получаете дополнительную косую черту из-за волшебных кавычек http://ch2.php.net/magic_quotes

Большинство современных установок PHP отключили его, так что вы не хотите полагаться на это. Просто используйте mysql_real_escape_string() или, лучше, используйте PDOhttp://ch2.php.net/pdo

 1
Author: ckruse, 2011-07-13 11:42:31

Я предлагаю посмотреть Acunetix или что-то подобное и бесплатное, как это дополнение для firefox:

Https://addons.mozilla.org/en-US/firefox/addon/sql-injection/

Это быстрее для тестирования на SQL-инъекции, а также сканирует все формы/, возможно, методы SQLi, о которых вы не знали. Acunetix расширяет это и тестирует RFI, XSS и т.д.

Использование кода неэффективно.

 1
Author: rickyduck, 2011-07-13 11:42:40

SQL, который вы пытаетесь сформировать, должен выглядеть следующим образом:

SELECT * FROM acl_user WHERE user_email = "[email protected]" Or 1=1; --" AND user_password = ""

Попробуйте ввести:

[email protected]" Or 1=1; --

В качестве адреса электронной почты и игнорируйте пароль.

-- делает остальную часть утверждения игнорируемой.

Вот хорошая информация по этому вопросу: http://php.net/manual/en/security.database.sql-injection.php

 1
Author: DaveShaw, 2011-07-13 11:46:54

Измените его на: 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>
 1
Author: mithunsatheesh, 2011-07-13 11:57:44

Как предотвратить внедрение SQl

1) Фильтр ввода - Перестаньте верить своим пользователям: Самая большая угроза для приложения исходит от его пользователей. Пользователи не должны быть хорошо воспитанными и послушными, как вы ожидаете. У некоторых пользователей действительно плохие намерения, а некоторые просто пытаются проверить свои навыки взлома. Какой бы код вы ни собирались написать, пишите его с использованием лучших практик и учитывайте его аспекты безопасности. Проверьте каждое поле в форме

2) Использовать классы-оболочки базы данных или PDO – Оболочки базы данных или PDO (в PHP) могут снизить риск прямого доступа входных значений к базе данных. Подготовленные заявления можно использовать вместе с PDO, как показано ниже.

Http://www.itechnicalblog.com/what-is-a-sql-injection-and-how-to-fix-it/

 0
Author: Sandeep Shirsat, 2015-05-12 12:15:20

Использование:

mysql_real_escape_string($_POST['thing'])

Я бы также предложил использовать PDO или MySQLI для подключения/запроса вашей базы данных. старые команды mysql_ - это обратная связь с PHP3, которая также улучшает производительность ovver.

Вот хорошее (но упрощенное) введение в то, как SQL-инъекция работает с помощью PHP/MySQL: http://www.tizag.com/mysqlTutorial/mysql-php-sql-injection.php

 -1
Author: Brian, 2011-07-13 11:41:37