首页 > web开发 > 其他综合 > 正文
3.2.1.2 查看关键文件代码
2015-11-27 16:10:14     我来说两句      
收藏    我要投稿

在这个文件夹里面我们看到了多个数十K的PHP文件,比如common.fun.php就是本程序的核心文件,基础函数基本在这个文件中实现,我们来看看这个文件里有哪些关键函数,一打开这个文件,立马就看到一大堆过滤函数,这是我们最应该关心的地方,首先是一个SQL注入过滤函数:

function addslashes_deep($value)
{
    if (empty($value))
    {
        return $value;
    }
    else
    {
      if (!get_magic_quotes_gpc())
      {
      $value=is_array($value)?array_map('addslashes_deep', $value): mystrip_ tags(addslashes($value));
      }
      else
      {
      $value=is_array($value)?array_map('addslashes_deep', $value): mystrip_tags($value);
      }
      return $value;
    }
}

该函数将传入的变量使用addslashes()函数进行过滤,也就过滤掉了单引号、双引号、NULL字符以及斜杠,现在我们要记住,在挖掘SQL注入等漏洞时,只要参数在拼接到SQL语句前,除非有宽字节注入或者其他特殊情况,否则使用了这个函数就不能注入了。

再往下走是一个XSS过滤的函数mystrip_tags(),代码如下:

function mystrip_tags($string)
{
 $string = new_html_special_chars($string);
 $string = remove_xss($string);
 return $string;
}

这个函数调用了new_html_special_chars()和remove_xss()函数来过滤XSS,就在该函数下方,代码如下:

function new_html_special_chars($string) {
 $string = str_replace(array('&amp;', '&quot;', '&lt;', '&gt;'), array('&', '"', '<', '>'), $string);
 $string = strip_tags($string);
 return $string;
}
function remove_xss($string) {
    $string = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S', '', $string);

    $parm1 = Array('javascript', 'union','vbscript', 'expression', 'applet', 'xml', 'blink', 'link', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base');

    $parm2 = Array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload', 'style','href','action','location','background','src','poster');
 
    $parm3= Array('alert','sleep','load_file','confirm','prompt','bench-mark', 'select','update','insert','delete','alter','drop','truncate','script','eval');

    $parm = array_merge($parm1, $parm2, $parm3);

 for ($i = 0; $i < sizeof($parm); $i++) {
     $pattern = '/';
     for ($j = 0; $j < strlen($parm[$i]); $j++) {
         if ($j > 0) {
          $pattern .= '(';
          $pattern .= '(&#[x|X]0([9][a][b]);?)?';
          $pattern .= '|(&#0([9][10][13]);?)?';
          $pattern .= ')?';
         }
        $pattern .= $parm[$i][$j];
     }
     $pattern .= '/i';
     $string = preg_replace($pattern, '****', $string);
 }
 return $string;
}

在new_html_special_chars()函数中可以看到,这个函数对&符号、双引号以及尖括号进行了html实体编码,并且使用strip_tags()函数进行了二次过滤。而remove_xss()函数则是对一些标签关键字、事件关键字以及敏感函数关键字进行了替换。

再往下走有一个获取IP地址的函数getip(),是可以伪造IP地址的:

function getip()
{
 if (getenv('HTTP_CLIENT_IP') and strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
     $onlineip=getenv('HTTP_CLIENT_IP');
 }elseif (getenv('HTTP_X_FORWARDED_FOR') and strcasecmp(getenv('HTTP_X_FORWARDED_FOR'),'unknown')) {
     $onlineip=getenv('HTTP_X_FORWARDED_FOR');
 }elseif (getenv('REMOTE_ADDR') and strcasecmp(getenv('REMOTE_ADDR'),'unknown')) {
     $onlineip=getenv('REMOTE_ADDR');
 }elseif (isset($_SERVER['REMOTE_ADDR']) and $_SERVER['REMOTE_ADDR'] and strcasecmp($_SERVER['REMOTE_ADDR'],'unknown')) {
     $onlineip=$_SERVER['REMOTE_ADDR'];
 }
 preg_match("/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/",$onlineip,$match);
 return $onlineip = $match[0] ? $match[0] : 'unknown';
}

很多应用都会由于在获取IP时没有验证IP格式,而存在注入漏洞,不过这里还只是可以伪造IP。

再往下看可以看到一个值得关注的地方,SQL查询统一操作函数inserttable()以及updatetable()函数,大多数SQL语句执行都会经过这里,所以我们要关注这个地方是否还有过滤等问题。

function inserttable($tablename, $insertsqlarr, $returnid=0, $replace = false, $silent=0)
{
  global $db;
  $insertkeysql = $insertvaluesql = $comma = '';
  foreach ($insertsqlarr as $insert_key => $insert_value) {
    $insertkeysql .= $comma.'`'.$insert_key.'`';
    $insertvaluesql .= $comma.'\''.$insert_value.'\'';
    $comma = ', ';
  }
  $method = $replace?'REPLACE':'INSERT';
  // echo $method." INTO $tablename ($insertkeysql) VALUES ($insertvaluesql)", $silent?'SILENT':'';die;
  $state = $db->query($method." INTO $tablename ($insertkeysql) VALUES ($insertvaluesql)", $silent?'SILENT':'');
  if($returnid && !$replace) {
    return $db->insert_id();
  }else {
    return $state;
  }
}

再往下走则是wheresql()函数,是SQL语句查询的Where条件拼接的地方,我们可以看到参数都使用了单引号进行包裹,代码如下:

function wheresql($wherearr='')
{
 $wheresql="";
 if (is_array($wherearr))
   {
   $where_set=' WHERE ';
  foreach ($wherearr as $key => $value)
  {
  $wheresql .=$where_set. $comma.$key.'="'.$value.'"';
  $comma = ' AND ';
  $where_set=' ';
  }
   }
 return $wheresql;
}

还有一个访问令牌生成的函数asyn_userkey(),拼接用户名、密码salt以及密码进行一次md5,访问的时候只要在GET参数key的值里面加上生成的这个key即可验证是否有权限,被用在注册、找回密码等验证过程中,也就是我们能看到的找回密码链接里面的key,代码如下:

function asyn_userkey($uid)
{
 global $db;
 $sql = "select * from ".table('members')." where uid = '".intval($uid)."' LIMIT 1";
 $user=$db->getone($sql);
 return md5($user['username'].$user['pwd_hash'].$user['password']);
}

同目录下的文件如图3-10所示。


 

图中是具体功能的实现代码,我们这时候还不需要看,先了解下程序的其他结构。

点击复制链接 与好友分享!回本站首页
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:3.2.1.1 查看应用文件结构
下一篇:3.2.1.3 查看配置文件
相关文章
图文推荐
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站