ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Песочница (https://forum.antichat.xyz/forumdisplay.php?f=189)
-   -   mysql_real_escape_string (https://forum.antichat.xyz/showthread.php?t=308180)

Pirotexnik 13.12.2011 12:31

Здравствуйте. Поставил DVWA, тренируюсь.

На 2-х уровнях безопасности провел инъекцию, на 3-м стоит сабж.

Как я понял обойти его можно, даже нужно. Только как?

PHP код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]mysql_error[/COLOR][COLOR="#007700"]() .[/COLOR][COLOR="#DD0000"]''[/COLOR][COLOR="#007700"]);

[/COLOR][COLOR="#0000BB"]$num[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]mysql_numrows[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$result[/COLOR][COLOR="#007700"]);

[/COLOR][COLOR="#0000BB"]$i[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"];

while ([/COLOR][COLOR="#0000BB"]$i[/COLOR][COLOR="#007700"]'
[/COLOR][COLOR="#007700"];

echo
[/COLOR][COLOR="#DD0000"]'ID: '[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$id[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]'
First name: '
[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$first[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]'
Surname: '
[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$last[/COLOR][COLOR="#007700"];

echo
[/COLOR][COLOR="#DD0000"]''[/COLOR][COLOR="#007700"];

[/COLOR][COLOR="#0000BB"]$i[/COLOR][COLOR="#007700"]++;

}

}

}

[/COLOR][COLOR="#0000BB"]?>[/COLOR][/COLOR] 


Чакэ 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

Цитата:

Сообщение от None
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

Цитата:

Сообщение от None
Тренировачная площадка для хакера.

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 код:

[COLOR="#000000"][COLOR="#0000BB"]$test[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]is_numeric[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'0x3a'[/COLOR][COLOR="#007700"]);

[/
COLOR][COLOR="#0000BB"]var_dump[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$test[/COLOR][COLOR="#007700"]);

[/
COLOR][/COLOR

возвращает bool(true), хз как это можно использовать тут, но может наведет кого на мысли.

Konqi 19.12.2011 00:39

Цитата:

Сообщение от trololoman96
Навряд ли конечно, но может будет полезно, is_numeric() пропускает хекс
PHP код:

[COLOR="#000000"][COLOR="#0000BB"]$test[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]is_numeric[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'0x3a'[/COLOR][COLOR="#007700"]);

[/
COLOR][COLOR="#0000BB"]var_dump[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$test[/COLOR][COLOR="#007700"]);

[/
COLOR][/COLOR

возвращает bool(true), хз как это можно использовать тут, но может наведет кого на мысли.

PHP код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"] 0x756e696f6e2b73656c656374

[/COLOR][COLOR="#0000BB"]$test[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]is_numeric[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'0x756e696f6e2073656c656374'[/COLOR][COLOR="#007700"]);

[/COLOR][COLOR="#0000BB"]var_dump[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$test[/COLOR][COLOR="#007700"]);

[/
COLOR][COLOR="#0000BB"]?>[/COLOR][/COLOR] 

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
У меня 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 код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"][/COLOR][/COLOR

Код:

Str: union select 1 from table#
Hex value:0x756e696f6e2073656c65637420312066726f6d207461626c6523
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:0x2d312f2a21556e696f4e2053454c4563742a2f312c322c33
is_numeric? - bool(true)

Если же убрать 0x в хекс значении:

PHP код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"][/COLOR][/COLOR

Код:

Str: union select 1 from table#
Hex value:756e696f6e2073656c65637420312066726f6d207461626c6523
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:2d312f2a21556e696f4e2053454c4563742a2f312c322c33
is_numeric? - bool(false)

Хотя это понятно, он воспринимает хек значение без 0x как обычную строку.

Expl0ited 19.12.2011 01:20

а вообще если разобрать код из первого поста:

PHP код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]mysql_error[/COLOR][COLOR="#007700"]() .[/COLOR][COLOR="#DD0000"]''[/COLOR][COLOR="#007700"]);

[/COLOR][COLOR="#0000BB"]$num[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]mysql_numrows[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$result[/COLOR][COLOR="#007700"]);

[/COLOR][COLOR="#0000BB"]$i[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"];

while ([/COLOR][COLOR="#0000BB"]$i[/COLOR][COLOR="#007700"]'
[/COLOR][COLOR="#007700"];

echo
[/COLOR][COLOR="#DD0000"]'ID: '[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$id[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]'
First name: '
[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$first[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]'
Surname: '
[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$last[/COLOR][COLOR="#007700"];

echo
[/COLOR][COLOR="#DD0000"]''[/COLOR][COLOR="#007700"];

[/COLOR][COLOR="#0000BB"]$i[/COLOR][COLOR="#007700"]++;

}

}

}

[/COLOR][COLOR="#0000BB"]?>[/COLOR][/COLOR] 

Я так полагаю автор привел не полный код уязвимого скрипта. В данном коде, лично я, уязвимостей не наблюдаю.

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
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
Всё это можно найти здесь: /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
Нужно грамотно работать с типами данных.
(int) intval() is_numeric() для числовых
mysql_real_escape_string() для строковых

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

Цитата:

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

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

PHP код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"][/COLOR][/COLOR

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


Время: 15:09