PHP常见漏洞与代码审计
点击上方蓝字关注
作者: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
别忘了投稿哟!!!
合天公众号开启原创投稿啦!!!
大家有好的技术原创文章。
欢迎投稿至邮箱:edu@heetian.com;
合天会根据文章的时效、新颖、文笔、实用等多方面评判给予100元-500元不等的稿费哟。
有才能的你快来投稿吧!
合天智汇
网址 : www.heetian.com
电话:4006-123-731
长按图片,据说只有颜值高的人才能识别哦→