Просмотр полной версии : mysql_real_escape_string
Pirotexnik
13.12.2011, 12:31
Здравствуйте. Поставил DVWA, тренируюсь.
На 2-х уровнях безопасности провел инъекцию, на 3-м стоит сабж.
Как я понял обойти его можно, даже нужно. Только как?
PHP:
'.mysql_error() .'');
$num=mysql_numrows($result);
$i=0;
while ($i';
echo'ID: '.$id.'
First name: '.$first.'
Surname: '.$last;
echo'';
$i++;
}
}
}
?>
Pirotexnik
13.12.2011, 17:50
Таки нет. По твоему это не проходимый квест?)
по-моему тебя обманули.
stripslashes($id); это шикарно
phpdreamer
13.12.2011, 18:59
http://php.net/manual/en/function.mysql-real-escape-string.php
Note:
If magic_quotes_gpc is enabled, first apply stripslashes() to the data. Using this function on data which has already been escaped will escape the data twice.
Если magic_quotes_gpc ON и сначала stripslashes, то получается 2-ой эскейп
magic_quotes_gpc - это единственная проблема у mysql-real-escape-string и она уходит в прошлое, потому что никто не включает эту опцию
KolosJey
13.12.2011, 22:35
phpdreamer
Если ты считаешь что этот код уязвим, покажи реализацию плз.
Та цитата, которую ты привёл, говорит о том, что при MQ=on НАДО убирать слеши, и тут они убираются.
Но это не секурити проблема. Да, данные заэскейпяться дважды, но скуль ты не проведёшь, т.к. бекслеши тоже заэскейпятся.
Это можно было-бы проделать при mysql_escape_string которая не учитывает кодировку, но тут...
Да и это вобщем-то не всё. Даже если мы прорываем mysql_real_escape_string дальше идёт is_numeric, так что...
Вобщем у кого есть реальзация баги, было-бы интересно взглянуть, но я склоняюсь к тому, что разрабы курнули
Pirotexnik
13.12.2011, 23:08
http://www.dvwa.co.uk/
Тренировачная площадка для хакера. 3 уровня сложности. Легкий и средний прошел, но тяжелый не выходит...
Тренировачная площадка для хакера.
ohlol
alias6969
18.12.2011, 21:44
ТС, верный ответ на твой вопрос - никак.
stripslashes и mysql_real_escape_string тут вообще никакой роли не играют, проверка входных данных осуществляется функцией is_numeric, а его ты не пройдешь никак
trololoman96
19.12.2011, 00:34
Навряд ли конечно, но может будет полезно, is_numeric() пропускает хекс
PHP:
$test=is_numeric('0x3a');
var_dump($test);
возвращает bool(true), хз как это можно использовать тут, но может наведет кого на мысли.
trololoman96 said:
Навряд ли конечно, но может будет полезно, is_numeric() пропускает хекс
PHP:
$test=is_numeric('0x3a');
var_dump($test);
возвращает bool(true), хз как это можно использовать тут, но может наведет кого на мысли.
PHP:
0x756e696f6e2b73656c656374
$test=is_numeric('0x756e696f6e2073656c656374');
var_dump($test);
?>
bool(false)
откуда такая инфа ?
trololoman96
19.12.2011, 00:43
У меня 0x756e696f6e2073656c656374 возвращает true.
Тестилось на Apache/2.2.8 (Win32) PHP/5.2.6
--------
инфа взята с бложека разора, http://raz0r.name/mysli/phpids-za-i-protiv/
вычитано в коментах
M_script
19.12.2011, 00:46
Допустим, is_numeric обошли. Как из кавычек в запросе выйти?
trololoman96 said:
У меня 0x756e696f6e2073656c656374 возвращает true.
Тестилось на Apache/2.2.8 (Win32) PHP/5.2.6
--------
инфа взята с бложека разора, http://raz0r.name/mysli/phpids-za-i-protiv/
вычитано в коментах
0x3a пропускает потому что оно число в hex (13) 0011 (2^0 + 2^1) + 1010 (2^1+2^3)
а текст пропускать не может
trololoman96
19.12.2011, 00:57
Konqi, почему тогда 0x756e696f6e2073656c656374 у меня тоже возвращает true ?
---------
Протестировал еще на PHP Version 5.2.17 (linux) тоже вернуло true
Windows NT/ php 5.1.6 - false
Linux / 5.2.6 - true
Linux / 5.2.17 - true
хм =\
p.s если вернемся к теме, то ясно становится, если даже is_numeric Поможет обойти фильтр, то вес запрос все равно в hex виде не отправишь в бд, база операторы в хекс виде не поймет, так что с этим все равно облом, но тему is_numeric стоит исследовать..
Expl0ited
19.12.2011, 01:06
PHP:
Code:
Str: union select 1 from table#
Hex value:0x756e696f6e2073656c65637420312066726f6d2074 61626c6523
is_numeric? - bool(true)
--------------------
Str: $%^&*(Jkabhsdf
Hex value:0x24255e262a284a6b616268736466
is_numeric? - bool(true)
--------------------
Str: test
Hex value:0x74657374
is_numeric? - bool(true)
--------------------
Str: UniON/**/SELECT/**/1
Hex value:0x556e694f4e2f2a2a2f53454c4543542f2a2a2f31
is_numeric? - bool(true)
--------------------
Str: -1/*!UnioN SELEct*/1,2,3
Hex value:0x2d312f2a21556e696f4e2053454c4563742a2f312c 322c33
is_numeric? - bool(true)
Если же убрать 0x в хекс значении:
PHP:
Code:
Str: union select 1 from table#
Hex value:756e696f6e2073656c65637420312066726f6d207461 626c6523
is_numeric? - bool(false)
--------------------
Str: $%^&*(Jkabhsdf
Hex value:24255e262a284a6b616268736466
is_numeric? - bool(false)
--------------------
Str: test
Hex value:74657374
is_numeric? - bool(true)
--------------------
Str: UniON/**/SELECT/**/1
Hex value:556e694f4e2f2a2a2f53454c4543542f2a2a2f31
is_numeric? - bool(false)
--------------------
Str: -1/*!UnioN SELEct*/1,2,3
Hex value:2d312f2a21556e696f4e2053454c4563742a2f312c32 2c33
is_numeric? - bool(false)
Хотя это понятно, он воспринимает хек значение без 0x как обычную строку.
Expl0ited
19.12.2011, 01:20
а вообще если разобрать код из первого поста:
PHP:
'.mysql_error() .'');
$num=mysql_numrows($result);
$i=0;
while ($i';
echo'ID: '.$id.'
First name: '.$first.'
Surname: '.$last;
echo'';
$i++;
}
}
}
?>
Я так полагаю автор привел не полный код уязвимого скрипта. В данном коде, лично я, уязвимостей не наблюдаю.
KolosJey
19.12.2011, 01:52
is_numeric() разумеется пропускает 0xlalala, потому что это ЧИСЛО.
И даже если переменная в запросе не будет обрамлена кавычками (id=$id)
то всё равно инъекции не будет, база такое гавно не схавает
А если бы это было возможно, то все WAFы сосали бы сразу, т.к. по этой логике можно сразу весь запрос переводить в HEX и не парится )
PS Об этом свойстве is_numeric примерно раз в год все вспоминают\открывают заново и начинаются движения и исследования, которые ничем не кончаются, и снова забвение на год )
Pirotexnik
19.12.2011, 20:36
Expl0ited, спасибо, очень подробно и доступно описано!
Но у меня вопрос, отдельно is_numeric() как-то обойти возможно? Если использовать хекс?
Тоесть как минимум нужно написать unhex(), а это уже не число.
Expl0ited
19.12.2011, 20:44
Pirotexnik said:
Expl0ited
, спасибо, очень подробно и доступно описано!
Но у меня вопрос, отдельно is_numeric() как-то обойти возможно? Если использовать хекс?
Тоесть как минимум нужно написать
unhex()
, а это уже не число.
Больше нет, чем да.
Pirotexnik
19.12.2011, 20:51
Мм, а не подскажете, как нащет стринговых запросов?
Как защищаются от инъекций в них, и как проводят?
Expl0ited
19.12.2011, 20:53
Всё это можно найти здесь: /thread43966.html
В большинстве случаев достаточно фильтровать кавычки.
KolosJey
20.12.2011, 01:23
Expl0ited said:
Всё это можно найти здесь: /thread43966.html
В большинстве случаев достаточно фильтровать кавычки.
Ни в коем случае ненадо ничего фильтровать
Нужно грамотно работать с типами данных.
(int) intval() is_numeric() для числовых
mysql_real_escape_string() для строковых
Всё.
PS Только не нужно мне показывать intval в условиях и кривые реализации в коде. Я всё это знаю.
Если один раз прочитать мануалы к 3-м функциям и делать правильно, скулей не будет )
KolosJey
Expl0ited именно эти функции имел ввиду, так как вопрос был следующим
"а не подскажете, как нащет стринговых запросов?"
KolosJey
20.12.2011, 01:32
Konqi
"Фильтрация кавычек" подразумевает именно фильтрацию. Возможно я что то не так понял, но для меня совершенно однозначно понятие "фильтрация" не вяжется с функцией mysql_real_escape_string. Она ничего не фильтрует.
И если я так понял пост Expl0ited'а, то думаю кто то запросто мог его понять так-же.
KolosJey
в случий стринговых запросов (входящие данные типа стринг), думаю ни один разумный кодер не будет фильтрировать запрос через регулярку или вхождение в строке, понятно же что самый оптимальный и правильный вариант это экранирование ковычек
Expl0ited
20.12.2011, 02:06
KolosJey said:
Нужно грамотно работать с типами данных.
(int) intval() is_numeric() для числовых
mysql_real_escape_string() для строковых
Те же грабли только в профиль.
Фильтровать несов. перех. 1)
Пропускать через фильтр
, очищая, освобождая от примесей.
В моем посте имелось ввиду, обработать входящие данные, в соответствии их типу различными функциями. Самый надежный способ:
PHP:
И вообще, мы далеко ушли от темы, автор темы получил желаемый ответ. За сим тему закрываю.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot