其他

PHP常见漏洞与代码审计

2018-01-29 合天智汇

点击上方蓝字关注

作者:hanmeimei 转载

SQL注入


  ▼ 例子


  ■  需跟踪的函数

 

  ■  resource mysql_query ( string $query [, resource $link_identifier ] )

 

  ■  mixed mysqli_query ( mysqli $link , string $query [, int $resultmode ] )


  ■  代码层防御

 

  ■  注意:未过滤的动态SQL语句是产生sql注入的主要原因

 

  ■  (1)使用参数化语句(存储过程)

 

  ■  (2)验证输入(白名单+黑名单):验证数据类型,数据大小,数据范围,数据内容

 

ctype_*, is_*,preg_match, strlen, intval


  ■  (3)转义输出


  ■   string mysql_real_escape_string ( string $unescaped_s tring [, resource $link_identifier ] )


注意:仅仅转义NULL, \x00, \n,\r, \, ', " , and \x1a


  ■  平台层防御

 

  ■  (1)隐藏错误信息

 

   display_erros = off

 

  ■  (2)最小权限

 

  ■  (3)敏感信息加密


跨站脚本

 ▼反射式


 

▼存储式



  ■  Javascript能干啥

 

  ■  盗取cookie

 

  ■  钓鱼

 

  ■   获取用户击键数据

 

  ■   xss蠕虫

 

  ■  web僵尸


  ■  需跟踪的函数

 

  ■  void echo ( string $arg1 [, string $... ] )

 

  ■   int print ( string $arg )

 

  ■   int printf ( string $format [, mixed $args [, mixed $... ]] )

 

  ■  int vprintf ( string $format , array $args )



  ■  防御

 

  ■  1.过滤输入

 

  ■   如果输入数据只包含字母和数字,那么任何特殊字符都应当阻

 

  ■  对输入的数据经行严格匹配,比如邮件格式,用户名只包含英文或者中文、下划线、连字符

 

     ctype_*, is_*,preg_match, strlen

 

  ■  注意:慎用str_replace


  ■  2.转义输出


  ■  string strip_tags ( string $str [, string $allowable_tags ] )


  ■ string htmlspecialchars ( string $string [, int $quote_style [, string $charset [, bool $double_encode ]]] ):Convert special characters to HTML entities

 

  ■  string htmlentities ( string $string [, int $quote_style [, string $ charset [, bool $double_encode ]]] ):Convert all applicable characters to HTML entities 


跨站请求伪造

  ▼ 例子


<img src="http://store.example.org/buy.php?item=pencil&quantity=50" />


  ■  防御

 

  ■  1.验证referer——辅助使用

 

  ■  2.验证中采用token

 

  ■  3.严防跨站



代码执行

  ▼ 例子

 

 ■  危险函数

 

  ■  mixed eval ( string $code_str )

 

  ■  mixed preg_replace ( mixed $pattern , mixed $replace ment , mixed $subject [, int $limit ] )

 

  ■  string create_function ( string $args , string $code )

 

  ■  mixed call_user_func ( callback $function [, mixed $par ameter [, mixed $... ]] )

 

  ■  mixed call_user_func_array ( callback $function , array $param_arr )


  ■  bool assert ( mixed $assertion )


  • array_map()

 

  • usort(), uasort(), uksort()

 

  • array_filter()

 

  • array_reduce()

 

  • array_diff_uassoc(), array_diff_ukey()

 

  • array_udiff(), array_udiff_assoc(), array_udiff_uassoc()

   

  • array_intersect_assoc(), array_intersect_uassoc()

 

  • array_uintersect(), array_uintersect_assoc(), array_uintersect_uassoc()

 

  • array_walk(), array_walk_recursive()

 

  • xml_set_character_data_handler()

 

  • xml_set_default_handler()

 

  • xml_set_element_handler()

 

  • xml_set_end_namespace_decl_handler()

 

  • xml_set_external_entity_ref_handler()

 

  • xml_set_notation_decl_handler()

 

  • xml_set_processing_instruction_handler()

 

  • xml_set_start_namespace_decl_handler()

 

  • xml_set_unparsed_entity_decl_handler()

 

  • stream_filter_register()

 

  • set_error_handler()

 

  • register_shutdown_function()

  

  • register_tick_function()


  ■  防御

 

  ■  1. 输入数据精确匹配

 

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


命令行注入


  

  ■  危险函数

 

  ■  string system ( string $command [, int &$return_var ] )

 

  ■  string exec ( string $command [, array &$output [, int &

$return_var ]] )

  ■  void passthru ( string $command [, int &$return_var ] )

  ■  string shell_exec ( string $cmd )

 

  ■  ` `(反引号)

 

  ■   resource proc_open ( string $cmd , array $descriptorsp ec , array &$pipes [, string $cwd [, array $env [, array $ other_options ]]] )

 

  ■   resource popen ( string $command , string $mode )


  ■  防御


  ■  1. 使用自定义函数或函数库来替代外部命令的功能

 

  ■  2. 使用escapeshellarg函数来处理命令参数(转义任何引起命令结束的字符,例如’ “ ;)


  ■  3. 使用safe_mode_exec_dir指定可执行文件的路径


文件包含

  ▼ 例子


  ■  危险函数

 

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

 

  ■  int readfile ( string $filename [, bool $use_include_pat h [, resource $context ]] )

 

  ■   array file ( string $filename [, int $use_include_path [, r esource $context ]] )

 

  ■   string file_get_contents ( string $filename [, bool $use _include_path [, resource $context [, int $offset [, int $ maxlen ]]]] )

 

  ■  resource fopen ( string $filename , string $mode [, bool $use_include_path [, resource $zcontext ]] )


文件管理


  ■  所有的文件操作函数都很危险

 

  ■  copy,rmdir,unlink,delete,fwrite,chmod,fgetc,fg etcsv,fgets,fgetss,file,file_get_contents,fread,r eadfile,ftruncate,file_put_contents,fputcsv,fpu ts


文件包含


  ■  如果php.ini的allow_url_fopen = On,容易引发远程文件包含漏洞

 

  ■  如果php.ini的allow_url_include = On,容易引发远程文件包含漏洞

 

  ■  文件包含常伴随着文件遍历


  ■  1.使用白名单

 

  ■  2. string realpath ( string $path )



需配合服务器解析漏洞,将xx.php.xx解析成php执行


文件上传


  ■  需跟踪的函数

 

  ■   bool move_uploaded_file ( string $filename , string $destination )

 

  ■  $_FILES['uploaded']['name']


  ■  防御

 

  ■  1. 文件路径名+文件名写死(最有用)

 

  ■   2.判断文件类型

 

  ■  $uploaded_type = $_FILES['uploaded']['type'];

 

  ■  3.判断文件大小

 

  ■   $uploaded_size = $_FILES['uploaded']['size'];

 

  ■  4.判断文件后缀

 

  ■  $uploaded_name =$_FILES['uploaded']['name'];


  ■   $uploaded_ext = substr($uploaded_name, strrpos($uploaded_name, '.') + 1);


重定向


  ■  常与钓鱼配合



重定向漏洞


  ■  需跟踪的函数

 

void header ( string $string [, bool $replace [, int $http_response_code ]] )


  ■  防御

 

  ■  URL白名单


变量覆盖漏洞



会话漏洞


  ■  1.会话劫持

 

  ■   session id 可通过网络嗅探,跨站等方式截

 

  ■  session id可预测

 

  ■  2.会话固定


  ■   防御

 

  ■  1.合理设置 session的生命期

 

  ■   ini_set('session.cookie_lifetime','0')

 

  ■  ini_set('session.gc_maxlifetime',1000);

 

  ■   2.Httponly


  ■   session_set_cookie_params(null,null,null,null,TRUE);(注意:要在session_start()之前运行)

 

  ■  setcookie(session_name(),session_id(),null,null,null,TRUE);


  ■   3. session.use_only_cookies =1只从cookie检查session_id

 

  ■   int_set("session.use_only_cookies", 1);

 

  ■   4. session.use_trans_sid =0 关闭透明化session id功能(透明化是指当浏览器的http请求并没有使用cookie来指定sessionid时,就在所有的相对链接中放入session_id

 

  ■  int_set("session.use_trans_sid", 0);

 

  ■   5.定期更改session_id

 

  ■   bool session_regenerate_id ([ bool $delete_old_session ] )

 

  ■  6. 定期更改session名字,默认是PHPSESSID


  ■  string session_name ([ string $name ] )


身份验证


  ■  1. 弱口令

 

  ■   2.暴力破解

 

  ■  3.明文传输

 

  ■   4.明文存储:MD5 != security


权限控制漏洞


  ■  1.一些管理页面是禁止普通用户访问的,但忘记对这些文件进行权限验证

 

  ■  某些页面使用参数调用功能,没有经过权限验证,比如index.php?action=upload


敏感信息泄露


  ■  1. 暴路径

 

  ■   默认安装路径,robots.txt,注释语句,系统错误,测试文件,旧文件,备份文件

 

  ■  2.列目录

 

  ■  3.后台暴露(相当有用)


资源竞争


  ■  1. 并发处理

 

  ■  2. 拒绝服务


漏洞根源


  ■  不可信变量+危险函数

 

  ■   变量传递过程

 

  ■  函数处理过程

 

e.g.

 

上传——上传漏洞数据存储与查询—SQL注入

 

后台或者api接口——安全认证绕过


其他因素:操作系统,web服务器,PHP版本


用户输入的变量列表


  ■  $_SERVER

  ■  $_GET

  ■  $_POST

  ■  $_COOKIE

  ■  $_REQUEST

  ■  $_FILES

  ■  $_ENV

  ■   $_HTTP_COOKIE_VARS

  ■  $_HTTP_ENV_VARS

  ■   $_HTTP_GET_VARS

  ■  $_HTTP_POST_FILES

  ■   $_HTTP_POST_VARS

  ■  $_HTTP_SERVER_VARS


数据验证


数据验证:输入验证与输出转义


  ■ 1. 对数据进行精确匹配 :类型,长度,格式,范围

 

  ■  2. 接受白名单的数据

 

  ■ 3. 拒绝黑名单的数据

 

  ■ 4. 对匹配黑名单的数据进行编码


源码检查工具推荐


  ■  PHPTaint

 

  ■  检测xss/sqli/shell注入的php扩展模块

 

  ■  原理,检查某些关键函数(是否直接使用没有经过过滤或转义处理)了来自$_GET,$_POST,$_COOKIE的数据,如使用则给出提示

  ■  可用于php源码审计,对快速定位漏洞有帮



示例代码下载地址https://pan.baidu.com/s/1htysaUg


看不过瘾?合天2017年度干货精华请点击【精华】2017年度合天网安干货集锦

别忘了投稿哟!!!

合天公众号开启原创投稿啦!!!

大家有好的技术原创文章。

欢迎投稿至邮箱:edu@heetian.com

合天会根据文章的时效、新颖、文笔、实用等多方面评判给予100元-500元不等的稿费哟。

有才能的你快来投稿吧!

重金悬赏 | 合天原创投稿等你来!

    合天智汇

网址 : www.heetian.com

电话:4006-123-731

长按图片,据说只有颜值高的人才能识别哦→

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存