второй день пытаюсь исправить и ничего не получается, как исправить данную ошибку ребят? вот такая ошибка у меня при вводе в index строку такого скриптика /m/hosting/6/%F6%22%20onmouseover=%3Cscript%3Ealert('XSS')%3C/script%3E// возникает ошибка You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'XSS')/' or unit='*') order by id' at line 1 я так понимаю через эту дыру ко мне могут залезть на сервер, как исправить данный баг? вот сам код Код (Text): <? require_once('service.php'); if (isset($_GET['ref'])) { $r=isset($_SERVER['HTTP_REFERER'])?$_SERVER['HTTP_REFERER']:''; if ($r!='' and !strstr($r,$CFG['SITE_URL'])) { $_SESSION['REFERAL']=$_GET['ref']; header("Location: $CFG[PATH]/"); } } if (!isset($_SESSION['REFSITE'])) { $_SESSION['REFSITE']=isset($_SERVER['HTTP_REFERER'])?$_SERVER['HTTP_REFERER']:''; } $_SEARCH=array('all'=>'(Везде)'); $MODULE=isset($_GET['module'])?$_GET['module']:$CFG['SITE_DEFAULT_MODULE']; $UNIT=isset($_GET['unit'])?$_GET['unit']:'index'; $UNIT=str_replace('.','',$UNIT); $UNITNAME=str_replace('/','_',$UNIT); if (!isset($MODULES[$MODULE])) die("NSM"); if (!$MODULES[$MODULE]['active']) die("MiNA"); if ($USER->id>0) { $USER->page=$_SERVER['REQUEST_URI']; $USER->store1('page'); } fetch_par(); $EVENTS=array(); $EI=array(); $ET=get_sql_table('events.id',"(module='$MODULE' or module='*') and (unit='$UNIT' or unit='*')"); foreach ($ET as $id=>$e) { if (!isset($EI["$e[src].$e[module]"])) { $FN="modules/$e[src]/events/".($e['module']!='*'?$e['module']:'all').'.php'; $EI["$e[src].$e[module]"]=$FN; } if (!isset($EVENTS[$e['code']])) $EVENTS[$e['code']]=array(); $EVENTS[$e['code']][]=$e['src']; } foreach ($EI as $f) if (file_exists($f)) include($f); foreach ($MODULES as $mc=>$m) if ($m['active'] and $m['php']) include("modules/$mc/include.php"); $r=get_sql_table('tpl.id',"skin='$SKIN[id]' and (perm='1' or (module='$MODULE' and (unit='*' or unit='$UNIT'))) and (lang=$LANGDEFAULT or lang=$LANG)"); if ($r) foreach ($r as $id=>$t) { if ($t['perm']) $t['module']='*'; if (!isset($TEMPLATE[$t['module']])) $TEMPLATE[$t['module']]=array(); $n="$t[unit].$t[code]"; if (!isset($TEMPLATE[$t['module']][$n]) or $t['lang']==$LANG) $TEMPLATE[$t['module']][$n]=$t['val']; } function content() { if (isset($_GET['UPDATE'])) { include "modules/core/admin/update.php"; return; } if ($s=core_login()) return $s; if (isset($_POST['_SEARCH_QUERY'])) return skin_search_results(); return module_content(); } if (isset($_GET['_CHARSET'])) { iconv_set_encoding('internal_encoding','UTF-8'); iconv_set_encoding('output_encoding',$_GET['_CHARSET']); ob_start('ob_iconv_handler'); } $TITLE=''; $DESCRIPTION=''; $KEYWORDS=''; $LIGHT=isset($_REQUEST['_LIGHT']); $CLEAN=isset($_REQUEST['_CLEAN']); $PRINT=isset($_REQUEST['_PRINT']); $DENIED=isset($_GET['denied'])?$_GET['denied']:false; if (!$DENIED and $UID) { if (!$USER->granted($MODULE)) $DENIED=$MODULE; } if ($LIGHT or $CLEAN or $PRINT) $content=page_parse(content()); else $content=skin(); if ($DENIED) { $CLEAN=false; $LIGHT=true; $content=skin_denied($DENIED); } elseif ($PRINT) { $CLEAN=false; $LIGHT=true; $content=skin_print($content); } else { $content=page_parse($content); } if (!$CLEAN) $content=page_start($TITLE).$content.page_end(); echo $content; ?>
Означает что данные от пользователя не фильтруются. В коде используется get_sql_table хз что за функция что то самописное найдите как фильтруются данные на вашем сайте. По коду не думаю что там используется pdo поэтому ищите функции http://php.net//manual/ru/function.mysql-real-escape-string.php http://php.ru/manual/mysqli.real-escape-string.html
вот она у меня Код (Text): function get_sql_table($from,$clause='',$order='',$extra='') { $t=explode('.',$from); $table=&$t[0]; $key=&$t[1]; if ($order=='') $order="order by $key"; else $order="order by $order"; if ($clause!='') $clause="where $clause"; if ($extra!='') $extra=",$extra"; $q="select * $extra from $table $clause $order"; $a=array(); if (!$r=mysql_query($q)) { die(mysql_error()); } while ($x=mysql_fetch_assoc($r)) { $id=$x[$key]; unset($x[$key]); $a[$id]=$x; } return($a); } Добавлено спустя 17 минут 4 секунды: сделал так Код (Text): $q=mysql_real_escape_string("select * $extra from $table $clause $order"); получилась такая ошибка You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'hosting\' or module=\'*\') and (unit=\'6/?\" onmouseover=
Если весь сайт написан в подобном стиле то ваш сайт страшно дырявый((( Код (PHP): $ET=get_sql_table('events.id',"(module='".mysql_real_escape_string($MODULE)."' or module='*') and (unit='".mysql_real_escape_string($UNIT)."' or unit='*')"); $r=get_sql_table('tpl.id',"skin='".mysql_real_escape_string($SKIN['id'])."' and (perm='1' or (module='".mysql_real_escape_string($MODULE)."' and (unit='*' or unit='".mysql_real_escape_string($UNIT)."'))) and (lang=".mysql_real_escape_string($LANGDEFAULT)." or lang=".mysql_real_escape_string($LANG).")"); Заэкранировал все параметры на всякий случай запустите впроде нигде конкатенацию не пропустил.
после экранирования появилась такая ошибка Код (Text): GET_SQL_ROW pages: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'XSS')/' and lang='0' limit 1' at line 1 Q=select * from pages where module='hosting' and code='6/�" onmouseover=/' and lang='0' limit 1 что это значит? Добавлено спустя 6 минут 49 секунд: это наверное ошибка в этом коде идет Код (Text): function module_content($code='',$unit='') { global $MODULES,$CFG,$TITLE,$DESCRIPTION,$KEYWORDS,$PAGE,$DENIED,$USER,$LANG,$LANGDEFAULT; if ($code=='') $code=$GLOBALS['MODULE']; else { $GLOBALS['_MODULE']=$GLOBALS['MODULE']; $GLOBALS['MODULE']=$code; } if ($unit=='') $unit=$GLOBALS['UNIT']; else { $GLOBALS['_UNIT']=$GLOBALS['UNIT']; $GLOBALS['UNIT']=$unit; $GLOBALS['UNITNAME']=str_replace('/','_',$unit); } $content=''; $p=get_sql_row('pages',"module='$code' and code='$unit' and lang='$LANG'"); if (!$p) $p=get_sql_row('pages',"module='$code' and code='$unit' and lang='$LANGDEFAULT'"); if (!$USER->allowed($p['access'])) { $DENIED=$p['module']; return ''; } if (count($p)) { $TITLE=$p['name']; $DESCRIPTION=$p['descr']; $KEYWORDS=$p['kw']; if (strlen($p['data'])>0) { $PAGE=$p['id']; $content.=call_user_func('skin_page',$p); } else { $file=0; if (file_exists("modules/$code/$unit.php")) $file="modules/$code/$unit.php"; elseif (file_exists("modules/$code/$unit.html")) $file="modules/$code/$unit.html"; $content.=page_parse(tplprobe('tech_start')); if ($file) $content.=page_parse_file($file); else $content.=page_parse(tplprobe('notfound')); $content.=page_parse(tplprobe('tech_end')); } } else $content=page_parse(tplprobe('notfound')); if (isset($GLOBALS['_MODULE'])) { $GLOBALS['MODULE']=$GLOBALS['_MODULE']; unset($GLOBALS['_MODULE']); } if (isset($GLOBALS['_UNIT'])) { $GLOBALS['UNIT']=$GLOBALS['_UNIT']; unset($GLOBALS['_UNIT']); $GLOBALS['UNITNAME']=str_replace('/','_',$GLOBALS['UNIT']); } return($content); }
Я ж пишу у вас сайт дырявый Поле code нет в тех 2 sql следовательно делаю вывод что там все отработало без ошибок все ок а это другой sql который выдал ошибку. Экранируйте данные пример я вам дал или ищите специалиста который залатает дыры, но не такого который писал вам сайт
smitt спасибо огромное я понял как делать) теперь буду экранировать весь сайт) Добавлено спустя 16 минут 28 секунд: ещё один вопросик, как тут грамотно написать? Код (Text): function event_supp_all_info() { global $USER,$_MODULE,$_UNIT; $s=supp_info_msg(); if ($s=='') return; $popup=$USER->allowed('s')?'false':'true'; $reload=($_MODULE=='supp' and $_UNIT=='index')?'true':'false'; $feedurl=module_url('supp','feed'); return <<<CODE <hr> <h3>Поддержка</h3> <div id="supp_box"> $s </div> <script language="JavaScript" type="text/javascript"> var w=document.getElementById('supp_w').innerHTML; var t0=document.getElementById('supp_t0').innerHTML; var t1=document.getElementById('supp_t1').innerHTML; var timem=15; var time=timem; var popup=$popup; var reload=$reload; function supp_feed_loop() { var modify=false; var ww=document.getElementById('supp_w').innerHTML; if (w!=ww) modify=true; var tt0=document.getElementById('supp_t0').innerHTML; if (t0!=tt0) modify=true; var tt1=document.getElementById('supp_t1').innerHTML; if (t1!=tt1) modify=true; if (modify) { if (reload) location.reload(); if ((popup) && (ww>w) ) alert('Появился тикет, ожидающий вашего ответа.'); w=ww; t0=tt0; t1=tt1; } if (time<1) { time=timem; ajax_feed('supp_box','','$feedurl'); } else time--; setTimeout('supp_feed_loop()',1000); } supp_feed_loop(); </script> CODE; } а то при вводе http://amm.su/m/hosting/6/%F6%22%20onmouseover=%3Cscript%3Ealert('XSS')%3C/script%3E// выходит вот такой JS скриптик Код (Text): /?_INFO'); } else time--; setTimeout('supp_feed_loop()',1000); } supp_feed_loop();
подскажите а тут над экранировать? $module.$unit Код (Text): function granted($module,$unit='*') { if (!$this->id) return true; if (in_array('*.*',$this->grants)) return true; if (in_array("$module.*",$this->grants)) return true; if (in_array("$module.$unit",$this->grants)) return true; return false; }
ошибка не возникает Добавлено спустя 53 секунды: да появляется баг /?_INFO'); } else time--; setTimeout('supp_feed_loop()',1000); } supp_feed_loop(); это разве не уязвимость?
а я не вижу причину, по тем кускам которые вижу, не должен выдавать ошибку((( У вас не пишется на какой строчке произошла ошибка? Кажись в другом куске кода проблема.
скорее всего в этом коде ошибка идет Код (Text): function block_core_info() { global $USER,$MODULE,$UNIT,$CFG; $feedurl=module_url($MODULE,$UNIT.'?_INFO'); $s=''; if ($USER->id!=0) { $s=core_info(); $s=<<<CODE {SKIN_BLOCK_START} {SKIN_WIN_START=Информация,width:100%} <div id="_info_box"> $s </div> {SKIN_WIN_END} {SKIN_BLOCK_END} <script language="JavaScript" type="text/javascript"> var timem=15; var time=timem; function supp_feed_loop() { if (time<1) { time=timem; ajax_feed('_info_box','','$feedurl'); } else time--; setTimeout('supp_feed_loop()',1000); } supp_feed_loop(); </script> CODE; } else { if ($CFG['SITE_AUTH'] or isset($_REQUEST['auth'])) $s=core_auth(); $s=<<<CODE {SKIN_BLOCK_START} $s {SKIN_BLOCK_END} CODE; } return $s; } Добавлено спустя 1 минуту 34 секунды: почему то этот скрипт при вводе в index http://amm.su/m/hosting/6/%F6%22%20onmouseover=%3Cscript%3Ealert('XSS')%3C/script%3E// выводит вот это /?_INFO'); } else time--; setTimeout('supp_feed_loop()',1000); } supp_feed_loop(); значит получается вот это показывает любому желающему Код (Text): $feedurl=module_url($MODULE,$UNIT.'?_INFO'); function supp_feed_loop() { if (time<1) { time=timem; ajax_feed('_info_box','','$feedurl'); } else time--; setTimeout('supp_feed_loop()',1000); }