天蘅 發表於 2011-3-11 11:59:03

PHP漏洞全解

<p>  PHP网页的安全性问题 <br />  针对PHP的网站主要存在下面几种攻击方式: <br />  1.命令注入(Command Injection) <br />  2.eval注入(Eval Injection) <br />  3.客户端脚本攻击(script Insertion) <br />  4.跨网站脚本攻击(Cross Site scripting, XSS) <br />  5.SQL注入攻击(SQL injection) <br />  6.跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF) <br />  7.Session 会话劫持(Session Hijacking) <br />  8.Session 固定攻击(Session Fixation) <br />  9.HTTP响应拆分攻击(HTTP Response Splitting) <br />  10.文件上传漏洞(File Upload Attack) <br />  11.目录穿越漏洞(Directory Traversal) <br />  12.远程文件包含攻击(Remote Inclusion) <br />  13.动态函数注入攻击(Dynamic Variable Evaluation) <br />  14.URL攻击(URL attack) <br />  15.表单提交欺骗攻击(Spoofed Form Submissions) <br />  16.HTTP请求欺骗攻击(Spoofed HTTP Requests) <br />  几个重要的php.ini选项 <br />  Register Globals <br />  php&gt;=4.2.0,php.ini的register_globals选项的默认值预设为Off,当register_globals的设定为On时,程序可以接收来自服务器的各种环境变量,包括表单提交的变量,而且由于PHP不必事先初始化变量的值,从而导致很大的安全隐患. <br />  例1: <br />  //check_admin()用于检查当前用户权限,如果是admin设置$is_admin变量为true,然后下面判断此变量是否为true,然后执行管理的一些操作 <br />  //ex1.php <br />   <br />  if (check_admin()) <br />  { <br />  $is_admin = true; <br />  } <br />  if ($is_admin) <br />  { <br />  do_something(); <br />  } <br />  ?&gt; <br />  这一段代码没有将$is_admin事先初始化为Flase,如果register_globals为On,那么我们直接提交 http://www.sectop.com/ex1.php?is_admin=true,就可以绕过check_admin()的验证 <br />  例2: <br />  //ex2.php <br />   <br />  if (isset($_SESSION[&quot;username&quot;])) <br />  { <br />  do_something(); <br />  } <br />  else <br />  { <br />  echo &quot;您尚未登录!&quot;; <br />  } <br />  ?&gt; <br />  当register_globals=On时,我们提交http://www.sectop.com/ex2.php?_SESSION=dodo,就具有了此用户的权限 <br />  所以不管register_globals为什么,我们都要记住,对于任何传输的数据要经过仔细验证,变量要初始化 <br />  safe_mode <br />  安全模式,PHP用来限制文档的存取.限制环境变量的存取,控制外部程序的执行.启用安全模式必须设置php.ini中的safe_mode = On <br />  1.限制文件存取 <br />  safe_mode_include_dir = &quot;/path1:/path2:/path3&quot; <br />  不同的文件夹用冒号隔开 <br />  2.限制环境变量的存取 <br />  safe_mode_allowed_env_vars = string <br />  指定PHP程序可以改变的环境变量的前缀,如:safe_mode_allowed_env_vars = PHP_ ,当这个选项的值为空时,那么php可以改变任何环境变量 <br />  safe_mode_protected_env_vars = string <br />  用来指定php程序不可改变的环境变量的前缀 <br />  3.限制外部程序的执行 <br />  safe_mode_exec_dir = string <br />  此选项指定的文件夹路径影响system.exec.popen.passthru,不影响shell_exec和&quot;` `&quot;. <br />  disable_functions = string <br />  不同的函数名称用逗号隔开,此选项不受安全模式影响 <br />  magic quotes <br />  用来让php程序的输入信息自动转义,所有的单引号(&quot;'&quot;),双引号(&quot;&quot;&quot;),反斜杠(&quot;&quot;)和空字符(NULL),都自动被加上反斜杠进行转义 <br />  magic_quotes_gpc = On 用来设置magic quotes 为On,它会影响HTTP请求的数据(GET.POST.Cookies) <br />  程序员也可以使用addslashes来转义提交的HTTP请求数据,或者用stripslashes来删除转义 <br />  命令注入攻击 <br />  PHP中可以使用下列5个函数来执行外部的应用程序或函数 <br />  system.exec.passthru.shell_exec.``(与shell_exec功能相同) <br />  函数原型 <br />  string system(string command, int &amp;return_var) <br />  command 要执行的命令 <br />  return_var 存放执行命令的执行后的状态值 <br />  string exec (string command, array &amp;output, int &amp;return_var) <br />  command 要执行的命令 <br />  output 获得执行命令输出的每一行字符串 <br />  return_var 存放执行命令后的状态值 <br />  void passthru (string command, int &amp;return_var) <br />  command 要执行的命令 <br />  return_var 存放执行命令后的状态值 <br />  string shell_exec (string command) <br />  command 要执行的命令 <br />  漏洞实例 <br />  例1: <br />  //ex1.php <br />   <br />  $dir = $_GET[&quot;dir&quot;]; <br />  if (isset($dir)) <br />  { <br />  echo &quot; <br />&quot;; <br />  system(&quot;ls -al &quot;.$dir); <br />  echo &quot; <br />&quot;; <br />  } <br />  ?&gt; <br />  我们提交http://www.sectop.com/ex1.php?dir=| cat /etc/passwd <br />  提交以后,命令变成了 system(&quot;ls -al | cat /etc/passwd&quot;); <br />  eval注入攻击 <br />  eval函数将输入的字符串参数当作PHP程序代码来执行 <br />  函数原型: <br />  mixed eval(string code_str) //eval注入一般发生在攻击者能控制输入的字符串的时候 <br />  //ex2.php <br />   <br />  $var = &quot;var&quot;; <br />  if (isset($_GET[&quot;arg&quot;])) <br />  { <br />  $arg = $_GET[&quot;arg&quot;]; <br />  eval(&quot;$var = $arg;&quot;); <br />  echo &quot;$var =&quot;.$var; <br />  } <br />  ?&gt; <br />  当我们提交 http://www.sectop.com/ex2.php?arg=phpinfo();漏洞就产生了 <br />  动态函数 <br />   <br />  func A() <br />  { <br />  dosomething(); <br />  } <br />  func B() <br />  { <br />  dosomething(); <br />  } <br />  if (isset($_GET[&quot;func&quot;])) <br />  { <br />  $myfunc = $_GET[&quot;func&quot;]; <br />  echo $myfunc(); <br />  } <br />  ?&gt; <br />  程序员原意是想动态调用A和B函数,那我们提交http://www.sectop.com/ex.php?func=phpinfo 漏洞产生 <br />  防范方法 <br />  1.尽量不要执行外部命令 <br />  2.使用自定义函数或函数库来替代外部命令的功能 <br />  3.使用escapeshellarg函数来处理命令参数 <br />  4.使用safe_mode_exec_dir指定可执行文件的路径 <br />  esacpeshellarg函数会将任何引起参数或命令结束的字符转义,单引号&quot;'&quot;,替换成&quot;'&quot;,双引号&quot;&quot;&quot;,替换成&quot;&quot;&quot;,分号&quot;;&quot;替换成&quot;;&quot; <br />  用safe_mode_exec_dir指定可执行文件的路径,可以把会使用的命令提前放入此路径内 <br />  safe_mode = On <br />  safe_mode_exec_di r= /usr/local/php/bin/ <br />  客户端脚本植入 <br />  客户端脚本植入(script Insertion),是指将可以执行的脚本插入到表单.图片.动画或超链接文字等对象内.当用户打开这些对象后,攻击者所植入的脚本就会被执行,进而开始攻击. <br />  可以被用作脚本植入的HTML标签一般包括以下几种: <br />  1. 无限弹框 <br />  插入 跳转钓鱼页面 <br />  或者使用其他自行构造的js代码进行攻击 <br />  防范的方法 <br />  一般使用htmlspecialchars函数来将特殊字符转换成HTML编码 <br />  函数原型 <br />  string htmlspecialchars (string string, int quote_style, string charset) <br />  string 是要编码的字符串 <br />  quote_style 可选,值可为ENT_COMPAT ENT_QUOTES ENT_NOQUOTES,默认值ENT_COMPAT,表示只转换双引号不转换单引号.ENT_QUOTES,表示双引号和单引号都要转换.ENT_NOQUOTES,表示双引号和单引号都不转换 <br />  charset 可选,表示使用的字符集 <br />  函数会将下列特殊字符转换成html编码: <br />  &amp; ----&gt; &amp; <br />  &quot; ----&gt; &quot; <br />  ' ----&gt; ' <br />  &lt; ----&gt; &lt; <br />  &gt; ----&gt; &gt; <br />  把show.php的第98行改成 <br />   <br />  然后再查看插入js的漏洞页面 <br />  xss跨站脚本攻击 <br />  XSS(Cross Site scripting),意为跨网站脚本攻击,为了和样式表css(Cascading Style Sheet)区别,缩写为XSS <br />  跨站脚本主要被攻击者利用来读取网站用户的cookies或者其他个人数据,一旦攻击者得到这些数据,那么他就可以伪装成此用户来登录网站,获得此用户的权限. <br />  跨站脚本攻击的一般步骤: <br />  1.攻击者以某种方式发送xss的http链接给目标用户 <br />  2.目标用户登录此网站,在登陆期间打开了攻击者发送的xss链接 <br />  3.网站执行了此xss攻击脚本 <br />  4.目标用户页面跳转到攻击者的网站,攻击者取得了目标用户的信息 <br />  5.攻击者使用目标用户的信息登录网站,完成攻击 <br />  当有存在跨站漏洞的程序出现的时候,攻击者可以构造类似 http://www.sectop.com/search.php? <br />  key= ,诱骗用户点击后,可以获取用户cookies值 <br />  防范方法: <br />  利用htmlspecialchars函数将特殊字符转换成HTML编码 <br />  函数原型 <br />  string htmlspecialchars (string string, int quote_style, string charset) <br />  string 是要编码的字符串 <br />  quote_style 可选,值可为ENT_COMPAT、ENT_QUOTES、ENT_NOQUOTES,默认值ENT_COMPAT,表示只转换双引号不 <br />  转换单引号。ENT_QUOTES,表示双引号和单引号都要转换。ENT_NOQUOTES,表示双引号和单引号都不转换 <br />  charset 可选,表示使用的字符集 <br />  函数会将下列特殊字符转换成html编码: <br />  &amp; ----&gt; &amp; <br />  &quot; ----&gt; &quot; <br />  ' ----&gt; ' <br />  &lt; ----&gt; &lt; <br />  &gt; ----&gt; &gt; <br />  $_SERVER[&quot;PHP_SELF&quot;]变量的跨站 <br />  在某个表单中,如果提交参数给自己,会用这样的语句 <br />   <br />&quot; method=&quot;POST&quot;&gt; <br />  ...... <br />   <br />  $_SERVER[&quot;PHP_SELF&quot;]变量的值为当前页面名称 <br />  例: <br />  http://www.sectop.com/get.php <br />  get.php中上述的表单 <br />  那么我们提交 <br />  http://www.sectop.com/get.php/&quot;&gt; <br />  那么表单变成 <br />   <br />&quot; method=&quot;POST&quot;&gt; <br />  跨站脚本被插进去了 <br />  防御方法还是使用htmlspecialchars过滤输出的变量,或者提交给自身文件的表单使用 <br />   <br />  这样直接避免了$_SERVER[&quot;PHP_SELF&quot;]变量被跨站 <br />  SQL注入攻击 <br />  SQL注入攻击(SQL Injection),是攻击者在表单中提交精心构造的sql语句,改变原来的sql语句,如果web程序没有对提交的数据经过检查,那么就会造成sql注入攻击. <br />  SQL注入攻击的一般步骤: <br />  1.攻击者访问有SQL注入漏洞的网站,寻找注入点 <br />  2.攻击者构造注入语句,注入语句和程序中的SQL语句结合生成新的sql语句 <br />  3.新的sql语句被提交到数据库中进行处理 <br />  4.数据库执行了新的SQL语句,引发SQL注入攻击 <br />  跨网站请求伪造 <br />  CSRF(Cross Site Request Forgeries),意为跨网站请求伪造,也有写为XSRF.攻击者伪造目标用户的HTTP请求,然后此请求发送到有CSRF漏洞的网站,网站执行此请求后,引发跨站请求伪造攻击.攻击者利用隐蔽的HTTP连接,让目标用户在不注意的情况下单击这个链接,由于是用户自己点击的,而他又是合法用户拥有合法权限,所以目标用户能够在网站内执行特定的HTTP链接,从而达到攻击者的目的. <br />  例如:某个购物网站购买商品时,采用http://www.shop.com/buy.php?item=watch&amp;num=1,item参数确定要购买什么物品,num参数确定要购买数量,如果攻击者以隐藏的方式发送给目标用户链接 <br />  那么如果目标用户不小心点击以后,购买的数量就成了1000个 </p>
頁: [1]
查看完整版本: PHP漏洞全解