PDA

Просмотр полной версии : 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++;

}

}

}

?>

Чакэ
13.12.2011, 16:17
тебя обманули.

Pirotexnik
13.12.2011, 17:50
Таки нет. По твоему это не проходимый квест?)

Чакэ
13.12.2011, 18:49
по-моему тебя обманули.

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 уровня сложности. Легкий и средний прошел, но тяжелый не выходит...

Чакэ
13.12.2011, 23:33
Тренировачная площадка для хакера.


ohlol

alias6969
18.12.2011, 21:44
ТС, верный ответ на твой вопрос - никак.

Konqi
18.12.2011, 21:57
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), хз как это можно использовать тут, но может наведет кого на мысли.

Konqi
19.12.2011, 00:39
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 обошли. Как из кавычек в запросе выйти?

Konqi
19.12.2011, 00:50
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

Konqi
19.12.2011, 01:04
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-м функциям и делать правильно, скулей не будет )

Konqi
20.12.2011, 01:26
KolosJey

Expl0ited именно эти функции имел ввиду, так как вопрос был следующим

"а не подскажете, как нащет стринговых запросов?"

KolosJey
20.12.2011, 01:32
Konqi

"Фильтрация кавычек" подразумевает именно фильтрацию. Возможно я что то не так понял, но для меня совершенно однозначно понятие "фильтрация" не вяжется с функцией mysql_real_escape_string. Она ничего не фильтрует.

И если я так понял пост Expl0ited'а, то думаю кто то запросто мог его понять так-же.

Konqi
20.12.2011, 01:37
KolosJey

в случий стринговых запросов (входящие данные типа стринг), думаю ни один разумный кодер не будет фильтрировать запрос через регулярку или вхождение в строке, понятно же что самый оптимальный и правильный вариант это экранирование ковычек

Expl0ited
20.12.2011, 02:06
KolosJey said:
Нужно грамотно работать с типами данных.
(int) intval() is_numeric() для числовых
mysql_real_escape_string() для строковых


Те же грабли только в профиль.


Фильтровать несов. перех. 1)
Пропускать через фильтр
, очищая, освобождая от примесей.


В моем посте имелось ввиду, обработать входящие данные, в соответствии их типу различными функциями. Самый надежный способ:


PHP:


И вообще, мы далеко ушли от темы, автор темы получил желаемый ответ. За сим тему закрываю.