За последние 24 часа нас посетили 15795 программистов и 1664 робота. Сейчас ищут 887 программистов ...

ошибка

Тема в разделе "PHP для новичков", создана пользователем wolf777, 26 авг 2014.

  1. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    второй день пытаюсь исправить и ничего не получается, как исправить данную ошибку ребят?
    вот такая ошибка у меня при вводе в 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):
    1. <?
    2.  
    3. require_once('service.php');
    4.  
    5. if (isset($_GET['ref'])) {
    6.   $r=isset($_SERVER['HTTP_REFERER'])?$_SERVER['HTTP_REFERER']:'';
    7.   if ($r!='' and !strstr($r,$CFG['SITE_URL'])) {
    8.     $_SESSION['REFERAL']=$_GET['ref'];
    9.     header("Location: $CFG[PATH]/");
    10.     }
    11.   }
    12.  
    13. if (!isset($_SESSION['REFSITE'])) {
    14.   $_SESSION['REFSITE']=isset($_SERVER['HTTP_REFERER'])?$_SERVER['HTTP_REFERER']:'';
    15.   }
    16.  
    17. $_SEARCH=array('all'=>'(Везде)');
    18.  
    19. $MODULE=isset($_GET['module'])?$_GET['module']:$CFG['SITE_DEFAULT_MODULE'];
    20. $UNIT=isset($_GET['unit'])?$_GET['unit']:'index';
    21. $UNIT=str_replace('.','',$UNIT);
    22. $UNITNAME=str_replace('/','_',$UNIT);
    23.  
    24. if (!isset($MODULES[$MODULE])) die("NSM");
    25. if (!$MODULES[$MODULE]['active']) die("MiNA");
    26.  
    27. if ($USER->id>0) {
    28.   $USER->page=$_SERVER['REQUEST_URI'];
    29.   $USER->store1('page');
    30.   }
    31.  
    32. fetch_par();
    33.  
    34. $EVENTS=array(); $EI=array();
    35. $ET=get_sql_table('events.id',"(module='$MODULE' or module='*') and (unit='$UNIT' or unit='*')");
    36. foreach ($ET as $id=>$e) {
    37.   if (!isset($EI["$e[src].$e[module]"])) {
    38.     $FN="modules/$e[src]/events/".($e['module']!='*'?$e['module']:'all').'.php';
    39.     $EI["$e[src].$e[module]"]=$FN;
    40.     }
    41.   if (!isset($EVENTS[$e['code']])) $EVENTS[$e['code']]=array();
    42.   $EVENTS[$e['code']][]=$e['src'];
    43.   }
    44. foreach ($EI as $f) if (file_exists($f)) include($f);
    45.  
    46. foreach ($MODULES as $mc=>$m) if ($m['active'] and $m['php']) include("modules/$mc/include.php");
    47.  
    48. $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)");
    49. if ($r) foreach ($r as $id=>$t) {
    50.   if ($t['perm']) $t['module']='*';
    51.   if (!isset($TEMPLATE[$t['module']])) $TEMPLATE[$t['module']]=array();
    52.   $n="$t[unit].$t[code]";
    53.   if (!isset($TEMPLATE[$t['module']][$n]) or $t['lang']==$LANG)
    54.     $TEMPLATE[$t['module']][$n]=$t['val'];
    55.   }
    56.  
    57. function content() {
    58.   if (isset($_GET['UPDATE'])) {
    59.     include "modules/core/admin/update.php";
    60.     return;
    61.     }
    62.   if ($s=core_login()) return $s;
    63.   if (isset($_POST['_SEARCH_QUERY'])) return skin_search_results();
    64.   return module_content();
    65.   }
    66.  
    67. if (isset($_GET['_CHARSET'])) {
    68.   iconv_set_encoding('internal_encoding','UTF-8');
    69.   iconv_set_encoding('output_encoding',$_GET['_CHARSET']);
    70.   ob_start('ob_iconv_handler');
    71.   }
    72.  
    73. $TITLE=''; $DESCRIPTION=''; $KEYWORDS='';
    74. $LIGHT=isset($_REQUEST['_LIGHT']);
    75. $CLEAN=isset($_REQUEST['_CLEAN']);
    76. $PRINT=isset($_REQUEST['_PRINT']);
    77. $DENIED=isset($_GET['denied'])?$_GET['denied']:false;
    78. if (!$DENIED and $UID) {
    79.   if (!$USER->granted($MODULE)) $DENIED=$MODULE;
    80.   }
    81. if ($LIGHT or $CLEAN or $PRINT) $content=page_parse(content());
    82. else $content=skin();
    83. if ($DENIED) {
    84.   $CLEAN=false; $LIGHT=true;
    85.   $content=skin_denied($DENIED);
    86.   }
    87. elseif ($PRINT) {
    88.   $CLEAN=false; $LIGHT=true;
    89.   $content=skin_print($content);
    90.   }
    91. else {
    92.   $content=page_parse($content);
    93.   }
    94. if (!$CLEAN) $content=page_start($TITLE).$content.page_end();
    95. echo $content;
    96. ?>
     
  2. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Означает что данные от пользователя не фильтруются.
    В коде используется get_sql_table хз что за функция что то самописное найдите как фильтруются данные на вашем сайте.
    По коду не думаю что там используется pdo поэтому ищите функции
    http://php.net//manual/ru/function.mysql-real-escape-string.php
    http://php.ru/manual/mysqli.real-escape-string.html
     
  3. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    вот она у меня

    Код (Text):
    1. function get_sql_table($from,$clause='',$order='',$extra='') {
    2.   $t=explode('.',$from); $table=&$t[0]; $key=&$t[1];
    3.   if ($order=='') $order="order by $key"; else $order="order by $order";
    4.   if ($clause!='') $clause="where $clause";
    5.   if ($extra!='') $extra=",$extra";
    6.   $q="select * $extra from $table $clause $order";
    7.   $a=array();
    8.   if (!$r=mysql_query($q)) { die(mysql_error()); }
    9.   while ($x=mysql_fetch_assoc($r)) {
    10.     $id=$x[$key]; unset($x[$key]); $a[$id]=$x; }
    11.   return($a);
    12.   }
    Добавлено спустя 17 минут 4 секунды:
    сделал так
    Код (Text):
    1. $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=
     
  4. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Если весь сайт написан в подобном стиле то ваш сайт страшно дырявый(((

    Код (PHP):
    1. $ET=get_sql_table('events.id',"(module='".mysql_real_escape_string($MODULE)."' or module='*') and (unit='".mysql_real_escape_string($UNIT)."' or unit='*')");
    2.  
    3. $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).")");
    4.  
    Заэкранировал все параметры на всякий случай запустите впроде нигде конкатенацию не пропустил.
     
  5. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    после экранирования появилась такая ошибка

    Код (Text):
    1. 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):
    1. function module_content($code='',$unit='') {
    2.   global $MODULES,$CFG,$TITLE,$DESCRIPTION,$KEYWORDS,$PAGE,$DENIED,$USER,$LANG,$LANGDEFAULT;
    3.   if ($code=='') $code=$GLOBALS['MODULE']; else { $GLOBALS['_MODULE']=$GLOBALS['MODULE']; $GLOBALS['MODULE']=$code; }
    4.   if ($unit=='') $unit=$GLOBALS['UNIT'];
    5.   else {
    6.     $GLOBALS['_UNIT']=$GLOBALS['UNIT']; $GLOBALS['UNIT']=$unit;
    7.     $GLOBALS['UNITNAME']=str_replace('/','_',$unit);
    8.     }
    9.   $content='';
    10.   $p=get_sql_row('pages',"module='$code' and code='$unit' and lang='$LANG'");
    11.   if (!$p) $p=get_sql_row('pages',"module='$code' and code='$unit' and lang='$LANGDEFAULT'");
    12.   if (!$USER->allowed($p['access'])) {
    13.     $DENIED=$p['module']; return ''; }
    14.   if (count($p)) {
    15.     $TITLE=$p['name'];
    16.     $DESCRIPTION=$p['descr'];
    17.     $KEYWORDS=$p['kw'];
    18.     if (strlen($p['data'])>0) {
    19.       $PAGE=$p['id'];
    20.       $content.=call_user_func('skin_page',$p);
    21.       }
    22.     else {
    23.       $file=0;
    24.       if (file_exists("modules/$code/$unit.php")) $file="modules/$code/$unit.php";
    25.       elseif (file_exists("modules/$code/$unit.html")) $file="modules/$code/$unit.html";
    26.       $content.=page_parse(tplprobe('tech_start'));
    27.       if ($file) $content.=page_parse_file($file);
    28.       else $content.=page_parse(tplprobe('notfound'));
    29.       $content.=page_parse(tplprobe('tech_end'));
    30.       }
    31.     }
    32.   else $content=page_parse(tplprobe('notfound'));
    33.   if (isset($GLOBALS['_MODULE'])) { $GLOBALS['MODULE']=$GLOBALS['_MODULE']; unset($GLOBALS['_MODULE']); }
    34.   if (isset($GLOBALS['_UNIT'])) {
    35.     $GLOBALS['UNIT']=$GLOBALS['_UNIT']; unset($GLOBALS['_UNIT']);
    36.     $GLOBALS['UNITNAME']=str_replace('/','_',$GLOBALS['UNIT']);
    37.     }
    38.   return($content);
    39.   }
     
  6. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Я ж пишу у вас сайт дырявый :)
    Поле code нет в тех 2 sql следовательно делаю вывод что там все отработало без ошибок все ок а это другой sql который выдал ошибку.

    Экранируйте данные пример я вам дал или ищите специалиста который залатает дыры, но не такого который писал вам сайт :)
     
  7. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    smitt спасибо огромное я понял как делать) теперь буду экранировать весь сайт)
     
  8. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    smitt спасибо огромное я понял как делать) теперь буду экранировать весь сайт)

    Добавлено спустя 16 минут 28 секунд:
    ещё один вопросик, как тут грамотно написать?
    Код (Text):
    1. function event_supp_all_info() {
    2.   global $USER,$_MODULE,$_UNIT;
    3.   $s=supp_info_msg();
    4.   if ($s=='') return;
    5.   $popup=$USER->allowed('s')?'false':'true';
    6.   $reload=($_MODULE=='supp' and $_UNIT=='index')?'true':'false';
    7.   $feedurl=module_url('supp','feed');
    8.   return <<<CODE
    9. <hr>
    10. <h3>Поддержка</h3>
    11. <div id="supp_box">
    12. $s
    13. </div>
    14.  
    15. <script language="JavaScript" type="text/javascript">
    16. var w=document.getElementById('supp_w').innerHTML;
    17. var t0=document.getElementById('supp_t0').innerHTML;
    18. var t1=document.getElementById('supp_t1').innerHTML;
    19. var timem=15;
    20. var time=timem;
    21. var popup=$popup;
    22. var reload=$reload;
    23. function supp_feed_loop() {
    24.   var modify=false;
    25.   var ww=document.getElementById('supp_w').innerHTML; if (w!=ww) modify=true;
    26.   var tt0=document.getElementById('supp_t0').innerHTML; if (t0!=tt0) modify=true;
    27.   var tt1=document.getElementById('supp_t1').innerHTML; if (t1!=tt1) modify=true;
    28.   if (modify) {
    29.     if (reload) location.reload();
    30.     if ((popup) && (ww>w) ) alert('Появился тикет, ожидающий вашего ответа.');
    31.     w=ww; t0=tt0; t1=tt1;
    32.     }
    33.   if (time<1) {
    34.     time=timem;
    35.     ajax_feed('supp_box','','$feedurl');
    36.     }
    37.   else time--;
    38.   setTimeout('supp_feed_loop()',1000);
    39.   }
    40. supp_feed_loop();
    41. </script>
    42.  
    43. CODE;
    44.   }
    а то при вводе http://amm.su/m/hosting/6/%F6%22%20onmouseover=%3Cscript%3Ealert('XSS')%3C/script%3E//


    выходит вот такой JS скриптик

    Код (Text):
    1. /?_INFO'); } else time--; setTimeout('supp_feed_loop()',1000); } supp_feed_loop();
     
  9. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    подскажите а тут над экранировать? $module.$unit

    Код (Text):
    1.  function granted($module,$unit='*') {
    2.     if (!$this->id) return true;
    3.     if (in_array('*.*',$this->grants)) return true;
    4.     if (in_array("$module.*",$this->grants)) return true;
    5.     if (in_array("$module.$unit",$this->grants)) return true;
    6.     return false;
    7.     }
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а зачем?
     
  11. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Тут вроде не надо ничего менять. У вас здесь возникает ошибка?
    Здесь у вас тоже ошибка возникает?
     
  12. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    ошибка не возникает

    Добавлено спустя 53 секунды:
    да появляется баг
    /?_INFO'); } else time--; setTimeout('supp_feed_loop()',1000); } supp_feed_loop();
    это разве не уязвимость?
     
  13. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    а я не вижу причину, по тем кускам которые вижу, не должен выдавать ошибку(((
    У вас не пишется на какой строчке произошла ошибка?
    Кажись в другом куске кода проблема.
     
  14. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    скорее всего в этом коде ошибка идет

    Код (Text):
    1. function block_core_info() {
    2.   global $USER,$MODULE,$UNIT,$CFG;
    3.   $feedurl=module_url($MODULE,$UNIT.'?_INFO');
    4.   $s='';
    5.   if ($USER->id!=0) {
    6.   $s=core_info();
    7.   $s=<<<CODE
    8. {SKIN_BLOCK_START}
    9. {SKIN_WIN_START=Информация,width:100%}
    10. <div id="_info_box">
    11. $s
    12. </div>
    13. {SKIN_WIN_END}
    14. {SKIN_BLOCK_END}
    15. <script language="JavaScript" type="text/javascript">
    16. var timem=15;
    17. var time=timem;
    18. function supp_feed_loop() {
    19.   if (time<1) {
    20.     time=timem;
    21.     ajax_feed('_info_box','','$feedurl');
    22.     }
    23.   else time--;
    24.   setTimeout('supp_feed_loop()',1000);
    25.   }
    26. supp_feed_loop();
    27. </script>
    28. CODE;
    29.     }
    30.   else {
    31.     if ($CFG['SITE_AUTH'] or isset($_REQUEST['auth'])) $s=core_auth();
    32.     $s=<<<CODE
    33. {SKIN_BLOCK_START}
    34. $s
    35. {SKIN_BLOCK_END}
    36. CODE;
    37.     }
    38.   return $s;
    39.   }
    Добавлено спустя 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):
    1.   $feedurl=module_url($MODULE,$UNIT.'?_INFO');
    2. function supp_feed_loop() {
    3.   if (time<1) {
    4.     time=timem;
    5.     ajax_feed('_info_box','','$feedurl');
    6.     }
    7.   else time--;
    8.   setTimeout('supp_feed_loop()',1000);
    9.   }
     
  15. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    ребят как избавиться от ошибки?