Как стать автором
Обновить

Комментарии 16

У вас в компании есть отдельная директива, называть XXE OOB вектор «японским»? Мне так, чисто из любопытства.
Мне кажется, на японских форумах он упоминался (публично) раньше (2009 год), чем XXE OOB (2013)?
P.S. Знаю, что была какая-то дискуссия на эту тему, но не в курсе её результатов.
Вопрос: этот японский вектор кто-нибудь знал кроме самих японцев до того, как появился XXE OOB?
Если говорить про меня лично — то я узнал о них одновременно, когда эксплуатировал впервые подобную XXE, поэтому указал тот, на который отсылка есть раньше.
И если отвечать на вопрос Тимура, ответ нет. Можно открыть журнал «Хакер» и посмотреть, что в т.ч. в печатных изданиях и до написания этой статьи указываем оба названия (здесь апдейтнул).
Хорошо бы теперь статью, как закрыть все эти 7 трюков.
  1. Использовать X-Frame-Options (с корректными правилами);
  2. Не выдавать право Create текущему пользователю. Чаще всего это не требуется. Если требуется (например, для обновления / установки CMS) — добавлять/удалять только на это время;
  3. Echo сервисы — странная штука :) Обычно сетевой сервис не должен вести себя в подобном режиме на продакшине
  4. Отключение парсинга сущностей, практически все стандартные парсеры это позволяют;
  5. Загружать юзер контент на отдельный домен, не в whitelist CSP. Если требуется отобразить preview — то делать preview из белого листа. При конвертации гифки код потеряется;
  6. Хранить весь юзер контент на отдельном, изолированном домене (не поддомене, а на именно отдельном домене);
  7. Преобразовывать спец. символы в т.ч. в имени загружаемого файла, так как эта такая же информация от пользователя, как и вся другая.
Хорошая статья получилась. Всем бы так!
6. Прощай полноценный HTTPS.
Не уверен, как это расценит браузер. Он не любит на HTTPS страницах данные (статику), загруженную по HTTP (даже с того же домена). Что он будет думать на тему левого домена, хоть и по HTTPS — я не знаю.
Будет загружать без возражений.

Так сделано у vk.com, mega.co.nz. На статику обычно меньший ключ ставят.
Трюк #2 попробовал на MySQL 5.5. Получил такую ошибку:
mysql> LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE test FIELDS TERMINATED BY ' ';
ERROR 1148 (42000): The used command is not allowed with this MySQL version

Видимо, на каких версиях это изменилось. На указанном линке народ говорит про 5.0 и 5.1.
Видимо ваш мускул собран без --enable-local-infile.
Он был собран с параметрами по-умолчанию в этом плане. Если добавить --local-infile как предложили ниже, то работает. Но так работает только в mysql клиенте из командной строки, а через web я получаю ту же ошибку "(1148, 'The used command is not allowed with this MySQL version')".
Похоже, что в моём модуле, который я использую, это отключено. У меня обычный MySQLdb для Python.
Попробуйте подключиться к серверу с опцией --local-infile. Например так:
mysql -h 192.168.100.205 -P 3306 --local-infile -u user1 -p

После этого все отлично работает :) ну и проверить show variables like '%infile%'; на всякий случай.
Да, с --local-infile сработало из командной строки. На доступ через web это не распространяется, так как там это не включено по-умолчанию.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий