PHP代码审计(2)

发表于:2013-10-23来源:DoDo作者:DoDo点击数: 标签:php
apos; ` %60 文件包含 PHP可能出现文件包含的函数:include、include_once、require、require_once、show_source、highlight_file、readfile、file_get_contents、fopen、 ntfile 防范方法

  " "

  ‘ '

  ` %60

  文件包含

  PHP可能出现文件包含的函数:include、include_once、require、require_once、show_source、highlight_file、readfile、file_get_contents、fopen、 nt>file

  防范方法:

  对输入数据进行精确匹配,比如根据变量的值确定语言en.php、cn.php,那么这两个文件放在同一个目录下’language/’.$_POST[‘lang’].’.php’,那么检查提交的数据是否是en或者cn是最严格的,检查是否只包含字母也不错

  通过过滤参数中的/、..等字符

  代码注入

  PHP可能出现代码注入的函数:eval、preg_replace+/e、assert、call_user_func、call_user_func_array、create_function

  查找程序中程序中使用这些函数的地方,检查提交变量是否用户可控,有无做输入验证

  防范方法:

  输入数据精确匹配

  白名单方式过滤可执行的函数

  SQL注入

  SQL注入因为要操作数据库,所以一般会查找SQL语句关键字:insert、delete、update、select,查看传递的变量参数是否用户可控制,有无做过安全处理

  防范方法:

  使用参数化查询

  XPath注入

  Xpath用于操作xml,我们通过搜索xpath来分析,提交给 nt face="Arial, sans-serif">xpath函数的参数是否有经过安全处理

  防范方法:

  对于数据进行精确匹配

  HTTP响应拆分

  PHP中可导致HTTP响应拆分的情况为:使用header函数和使用$_SERVER变量。注意PHP的高版本会禁止HTTP表头中出现换行字符,这类可以直接跳过本测试

  防范方法:

  精确匹配输入数据

  检测输入输入中如果有\r或\n,直接拒绝

  文件管理

  PHP的用于文件管理的函数,如果输入变量可由用户提交,程序中也没有做数据验证,可能成为高危漏洞。我们应该在程序中搜索如下函数:copy、rmdir、unlink、delete、fwrite、chmod、fgetc、fgetcsv、fgets、fgetss、file、file_get_contents、fread、readfile、ftruncate、file_put_contents、fputcsv、fputs,但通常PHP中每一个文件操作函数都可能是危险的。

  http://ir.php.net/manual/en/re

  f.filesystem.php

  防范方法:

  对提交数据进行严格匹配

  限定文件可操作的目录

  文件上传

  PHP文件上传通常会使用move_uploaded_file,也可以找到文件上传的程序进行具体分析

  防范方式:

  使用白名单方式检测文件后缀

  上传之后按时间能算法生成文件名称

  上传目录脚本文件不可执行

  注意%00截断

  变量覆盖

  PHP变量覆盖会出现在下面几种情况:

  遍历初始化变量

  例:

  foreach($_GET as $key => $value)

  $$key = $value;

  函数覆盖变量:parse_str、mb_parse_str、import_request_variables

  Register_globals=ON时,GET方式提交变量会直接覆盖

  防范方法:

  设置Register_globals=OFF

  不要使用这些函数来获取变量

  动态函数

  当使用动态函数时,如果用户对变量可控,则可导致攻击者执行任意函数。

  例:

  

  $myfunc = $_GET['myfunc' font>];

  $myfunc();

  ?>

  防御方法:

  不要这样使用函数

  会话安全

  HTTPOnly设置

  session.cookie_httponly = ON时,客户端脚本(JavaScript等)无法访问该cookie,打开该指令可以有效预防通过XSS攻击劫持会话ID

  domain设置

  检查session.cookie_domain是否只包含本域,如果是父域,则其他子域能够获取本域的cookies

  path设置

  检查session.cookie_path,如果网站本身应用在/app,则path必须设置为/app/,才能保证安全

  cookies持续时间

  检查session.cookie_lifetime,如果时间设置过程过长,即使用户关闭浏览器,攻击者也会危害到帐户安全

  secure设置

  如果使用HTTPS,那么应该设置session.cookie_secure=ON,确保使用HTTPS来传输cookies

  session固定

  如果当权限级别改变时(例如核实用户名和密码后,普通用户提升到管理员),我们就应该修改即将重新生成的会话ID,否则程序会面临会话固定攻击的风险。

  CSRF

  跨站请求伪造攻击,是攻击者伪造一个恶意请求链接,通过各种方式让正常用户访问后,会以用户的身份执行这些恶意的请求。我们应该对比较重要的程序模块,比如修改用户密码,添加用户的功能进行审查,检查有无使用一次性令牌防御csrf攻击。

  加密

  明文存储密码

  采用明文的形式存储密码会严重威胁到用户、应用程序、系统安全。

  密码弱加密

  使用容易破解的加密算法,MD5加密已经部分可以利用md5破解网站来破解

  密码存储在攻击者能访问到的文件

  例如:保存密码在txt、ini、conf、inc、xml等文件中,或者直接写在HTML注释中

  认证和授权

  用户认证

  检查代码进行用户认证的位置,是否能够绕过认证,例如:登录代码可能存在表单注入。

  检查登录代码有无使用验证码等,防止暴力破解的手段

  函数或文件的未认证调用

  一些管理页面是禁止普通用户访问的,有时开发者会忘记对这些文件进行权限验证,导致漏洞发生

原文转自:http://www.sectop.com/?p=111