инъекция 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 answers
Вероятно, у вас включены магические кавычки. Проверьте возвращаемое значение get_magic_quotes_gpc
.
"Волшебные кавычки" - это старинная попытка PHP автоматически волшебным образом предотвратить внедрение SQL, но в текущих версиях она устарела, и вам рекомендуется использовать подготовленные операторы, чтобы избежать внедрения SQL.
Смотрите здесь как отключить их, чтобы вы могли экспериментировать с внедрением SQL.
Как все уже говорили - у вас, вероятно, есть волшебные кавычки на . Хотя вот в чем хитрость: эта функция усложняет выполнение SQL-инъекции, но не делает ее полностью невозможной.
Более того, даже 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() или, лучше, используйте PDOhttp://ch2.php.net/pdo
Я предлагаю посмотреть Acunetix или что-то подобное и бесплатное, как это дополнение для firefox:
Https://addons.mozilla.org/en-US/firefox/addon/sql-injection/
Это быстрее для тестирования на SQL-инъекции, а также сканирует все формы/, возможно, методы SQLi, о которых вы не знали. Acunetix расширяет это и тестирует RFI, XSS и т.д.
Использование кода неэффективно.
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
Измените его на: 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) Фильтр ввода - Перестаньте верить своим пользователям: Самая большая угроза для приложения исходит от его пользователей. Пользователи не должны быть хорошо воспитанными и послушными, как вы ожидаете. У некоторых пользователей действительно плохие намерения, а некоторые просто пытаются проверить свои навыки взлома. Какой бы код вы ни собирались написать, пишите его с использованием лучших практик и учитывайте его аспекты безопасности. Проверьте каждое поле в форме
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, которая также улучшает производительность ovver.
Вот хорошее (но упрощенное) введение в то, как SQL-инъекция работает с помощью PHP/MySQL: http://www.tizag.com/mysqlTutorial/mysql-php-sql-injection.php