移动安全 安全管理 应用案例 网络威胁系统安全 应用安全 数据安全 云安全
当前位置: 主页 > 信息安全 > 系统安全 >

系统安然:php安然代码审计小结

时间:2013-06-06 09:59来源:TuZhiJiaMi企业信息安全专家 点击:
文章仅为一段时候清算的php安然代码审计笔记总结,一个阐发框架,没有实例化阐发。 1、东西篇 编纂器(notepad++,editplus,UE等等,看小我习惯) TommSearch(字符串检索) || grep HttpProtocolDebugger(http和谈调
Tags系统安全(735)php安全(1)代码审计(1)  

  文章仅为一段时候清算的php安然代码审计笔记总结,一个阐发框架,没有实例化阐发。

  1、东西篇

  编纂器(notepad++,editplus,UE等等,看小我习惯)

  TommSearch(字符串检索) || grep

  HttpProtocolDebugger(http和谈调试器)

  Fiddler(阐发包,改包)

  Seay PHP代码审计东西(php-code-audit阐发辅助)

  几个有趣的项目

  dvwa(代码审计测试平台)

  phpmvs

  php security audit check

  PHP Vulnerability Hunter

  2、函数篇

  addslashed()添加反斜杠

  stripslashed()往掉落反斜杠

  get_magic_quotes_gpc() 鉴定是不是开启gpc

  expode(".",$array)豆割成数组

  is_numeric()鉴定是不是为数字

  sizeof()鉴定长度

  trim() 往除字符串开首和末尾的空格或其他字符

  system() 输出并返回最后一行shell成果。

  exec() 不输出成果,返回最后一行shell成果,所有成果可以保留到一个返回的数组里面。

  passthru() 只调用号令,把号令的运行成果原样地直接输出到尺度输出设备上。

  EscapeShellCmd(),把一个字符串中所有可能瞒过Shell而往履行别的一个号令的字符转义。这些字符在Shell中是有特别含义的,象分号(;),重定向(>)和从文件读进 (<)等。

  EscapeShellArg() 。在给定的字符串两边加上单引号,并把字符串中的单引号转义,如许这个字符串便可以安然地作为号令的参数。

  用popen()函数打开过程

  上面的编制只能简单地履行号令,却不克不及与号令交互。但有些时辰必需向号令输进一些东西,如在增加Linux的系统用户时,要调用su来把当前用户换到root才行,而su号令必需要在号令行上输进root的暗码。这类环境下,用上面提到的编制明显是不可的。

  popen ()函数打开一个过程管道来履行给定的号令,返回一个文件句柄。既然返回的是一个文件句柄,那么便可以对它读和写了。在PHP3中,对这类句柄只能做单一 的把持模式,要么写,要么读;从PHP4开端,可以同时读和写了。除非这个句柄是以一种模式(读或写)打开的,不然必需调用pclose()函数来封锁 它。

  例子1:

  /* PHP中若何增加一个系统用户

  下面是一段例程,增加一个名字为james的用户,

  root暗码是 verygood。仅供参考

  */

  $sucommand = "su --login root --command";

  $useradd = "useradd ";

  $rootpasswd = "verygood";

  $user = "james";

  $user_add = sprintf("%s "%s %s"",$sucommand,$useradd,$user);

  $fp = @popen($user_add,"w");

  @fputs($fp,$rootpasswd);

  @pclose($fp);

  require在被包含文件有弊端代码时将不再往下履行

  include在被包含文件有弊端代码时仍然往下履行

  htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。

  预定义的字符是:

  &(和号) 成为 &

  "(双引号) 成为 "

  ' (单引号) 成为 '

  <(小于) 成为 <

  >(大年夜于) 成为 >

  move_uploaded_file() 函数将上传的文件移动到新位置。

  extract() 函数从数组中把变量导进到当前的符号表中。

  对数组中的每个元素,键名用于变量名,键值用于变量值。

  第二个参数 type 用于指定当某个变量已存在,而数组中又有同名元素时,extract() 函数若何对待如许的冲突。

  本函数返回成功设置的变量数量。

  语法

  extract(array,extract_rules,prefix)

  parse_str() 函数把查询字符串解析到变量中. (常见于变量笼盖缝隙)

  语法

  parse_str(string,array)

  参数 描述

  string 必需。划定要解析的字符串。

  array 可选。划定存储变量的数组名称。该参数唆使变量存储到数组中。

  针对变量指定报复打击

  不利用foreach遍历$_GET变量,改用$_GET[(index)]

  eval() 函数把字符串遵循 PHP 代码来计较。该字符串必需是合法的 PHP 代码,且必需以分号结尾。

  假定没有在代码字符串中调用 return 语句,则返回 NULL。假定代码中存在解析弊端,则 eval() 函数返回 false。

  preg_replace 履行一个正则表达式的搜刮和替代

  /e参数履行代码

  3、缝隙篇

  -----------------------------------------------

  [1].Sql-Injection

  寄望:cookie及x-forward-for,宽字节,报错打针等

  发掘缝隙参考

  变量

  $_GET[""],$_POST[""],$_COOKIE[""], $SERVER[""]

  数据库把持函数

  mysql_query()

  数字型注进防备:

  1.is_numeric() ctype_digit() intval()

  2.str_length()肯定长度

  字符型注进防备:

  1.mysql_real_escape_string()

  2.数据库查询语句前加@防爆错

  3.str_length()肯定长度

  -----------------------------------------------

  [2].Command-Execution

  函数:

  system(),passthru(),popen(),exec()

  数据库把持函数:

  exec,system,popen,passthru,proc_open,shell_exec

  履行号令管道符 % | >

  测试如0 | dir c:

  || 双竖线的感化,前面语句履行弊端则履行后面语句

  如xx"+||+whoami+||+echo

  -----------------------------------------------

  [3].File-Inclusion

  函数:

  include(),require(),include_once(),require_once()

  长途文件包含缝隙要求

  allow_url_fopen() allow_url_include() file_get_contents()

  绕过:zlib://和ogg://

  5.2.0以后版本

  data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+ //

  @eval(file_get_contents('php://input')); //POST phpinfo();

  共同%00截断,新版本主动转义\0

  -----------------------------------------------

  [4].CSRF

  CSRF防备策略

  1>验证http-referer字段

  安然性低,易被捏造

  2>在要求地址中添加token并验证

  token可在用户登录后存放在session中,每次要求时将token从session中掏出,往要求的token对比以防备CSRF

  GET编制:http://url/?=token

  假定一个网站接管要求处所比较多,则在每次页面加载时遍历全部dom树,在dom中每个a和form标签后加进token

  但在动态页面加载后产生的html代码,则需要以硬编码的情势手工添加

  这类编制安然性弱点在于,如在论坛等交互比较频繁的处所hacker可机关环境盗取token并进而机关csrf报复打击

  故手工封锁referer

  3>在HTTP头中自定义属性并进行验证。经由过程XMLHttpRequest类。

  凡是常利用于Ajax编制对页面局部的异步刷新

  但适应性一般,对已有的网站架构局限性较大年夜

  -----------------------------------------------

  [5].XSS(Cross Site Script)

  反射型与存储型

  节制$_GET,$_POST,$_COOKIE 各类传进的变量

  利用htmlspecialchars()函数进行根本过滤

  连络CSRF实现主动化操纵

  -----------------------------------------------

  [6].File_Upload

  函数:move_uploaded_file()

  变量:$_FILES

  php文件上传操纵form表单进行文件上传时必需为post利用multipart/form-data才能完全的传递文件数据

  php操纵$_FILES系统函数的相干参数与函数move_upload_file函数来实例把由$_FILES全局变量生成的姑且文件移动到指定目次完成文件的上传

  $_FILES['files']['name']客户端文件的原名称

  $_FILES['files']['type']文件的MIME类型

  $_FILES['files']['size']已上传文件的大年夜小

  $_FILES['files']['tmp_name']储存的姑且文件名,通常是系统默许

  $_FILES['files']['error']该文件上传到相干的弊端代码

  防备编制:

  1>鉴定MIME TYPE文件类型如$_FILES['files']['type']=="image/jpeg",鉴定文件大年夜小,如$_FILES['files']['size']<10000 &&$_FILES['files']['size']>100

  2>指定上传文件名,如依托时候生成hash(time).jpg等编制

  3>按照文件后缀名鉴定文件

  如file_ext=substr($filename,$strrpos($filename,'.')+1);

  寄望是不是可能有双扩大名,二次上传冲破等逻辑标题问题

  4>办事器测验测验衬着文件等编制鉴定是不是为图片

  5>不依托于客户端js脚本限制上传文件类型

  6>白名单法则

  apache办事器常见上传安然标题问题

  1>共同.htaccess操纵上传

  AllOverride ALL 承诺子法则笼盖父法则

  .htaccess添加AddType Application/x-httpd-php .jpg

  2>文件名解析缝隙

  *.php.123

  在.htaccess添加AddHandler php5-script .php,文件名中包含php扩大名可以php脚本履行,如x.php.jpg

  .php3 .php4扩大名

  4、建设篇

  1>存眷缝隙信息,及时更新版本

  2>php.ini httpd.conf .htaccess文件建设

  1)safe_mode相干建设

  2)register_globals封锁

  3)open_basedir建设,防备目次遍历

  4)allow_url_fopen封锁

  5)disable_functions建设

  6)magic_quotes_gpc打开

  7)error_reporting=E_ALL &~E_NOTICE

  8)display_errors=Off避免报复打击者获得更多信息

  9)expose_php=Off隐躲版本信息

  3>最小化办事器其他账户权限

  4>第三方安然加固软件安装

  5>调用第三方安然防护文件,建设php.ini

  include_path=".:/php/includes"

  auto_pretend_file="anti-inj.php"

  auto_appent_file=

  5、思路篇

  刚开端操练审计时,拿到一套源码,顿时做的工作就是,丢到东西里,往扫敏感的函数,然后往一个一个的回溯它,找到进口点。可是,如许审计很华侈时候,每次都要在回溯过程中,不竭的往寻觅源码中定义的一些通用函数。因为不体味全部源码的流程,导致在找这些通用函数的过 程中华侈了良多的时候与精力。

  所以,我从头调剂了我的审计流程。在拿到源码以后,先从它开端的处所(通常为根目次下的index文件)遵循履行的挨次往读代码,一向到它的初始化内容, 和根基功能实现终了为止。如许,可以明白的体味整套源码的布局,哪一种函数文件放在哪个文件夹下;知道通用函数放在哪个文件中。这对我们在以后浏览“疑似”有标题问题标代码时,有很好的帮忙,例如,在看到一个通用函数时,我们可以快速的切换到通用函数文件,查找这个函数的实现代码。

  注:此处援引点窜唐门三少文章《PHP代码审计进修总结》

  6、小结

  代码审计一如逆向工程,均需要耐烦与细心。

  别的,存眷缝隙发布平台上最新缝隙并跟踪加以阐发也是一个很快晋升本身能力的编制。

------分隔线----------------------------

推荐内容