php代码审计
程序员文章站
2022-05-19 18:17:28
...
代码审计
基础配置
常量定义
1.PHP_INI_USER PHP脚本,windows注册表中设置
2.PHP_INI_PERDIR php.ini htaccess,httpd.conf中设置
3.PHP_INI_SYSTEMphp.ini httpd.conf中设置
4.PHP_INI_ALL 任何地方中设置
5.php.ini only php.ini中设置
配置选项
1.allow_url_include(是否允许包含远程文件)
allow_url_fopen(是否打开远程文件)
配置范围:PHP_INI_ALL
2. magic_quotes_gpc(魔术引号自动过滤)
会在 ‘,“,\,NULL前加 \
配置范围:PHP_INI_ALL
magic_quotes_runtime(魔术引号自动过滤)
只对数据库或文件中获取的数据过滤
php版本<5.4
配置范围:PHP_INI_ALL
3.safe_mode(安全模式)
文件操作函数受到限制
poen(),system,exec()执行命令会提示错误
4.open_basedir(PHP 可访问目录)
限制php只能访问那些目录
配置范围:php版本>5.2.3 PHP_INI_ALL , php版本<5.2.3 PHP_INI_SYSTEM
5.disable_functions(禁用函数)
禁用敏感函数
配置范围:php.ini only
6.display_errors,error_reporting(错误显示)
display_errors开启关闭错误回显,error_reporting回显错误等级
配置范围:PHP_INI_ALL
7.expose_php(隐藏版本信息)
8.file_uploads(任意文件上传)
sql注入
宽字节
php连接mysql 设置 setcharacter_set_clinet=gbkcharacter_set_clinet=gbk
SET NAME ‘gbk’
由于gbk编码,输入%81–%ff(除%7f)和\组成一个gbk字符以达到绕过目的
挖掘关键字:
SET NAEMS
character_set_client=gbk
mysql_set_charset('gbk')
二次urldecode注入
当过滤了单引号但使用
urldecode(),rawurldecode()函数
提交?id=1%2527时,第一次解码为?id=1%27无单引号,第二次函数解码为?id=1'
搜索相关函数
漏洞防御
1.魔术引号:magic_quotes_gpc(get,post,cookie)/runtime(数据库,文件数据) php<5.4
对 ‘'," ,\ ,null 字符前加\
2.过滤函数和类(union,select等)
3.addslashes()与gpc一致(参数必须为string)
4.mysql_[real_]escape_string() 过滤 \x00,\n,\r,\,',",\xla等
php版本>4.0..3
5. intval等字符转换:将变量转换成int类型 主要防御数字型注入
6. PDO prepare 预编译
xss
寻找带有变量的函数
print,print_r,echo,printf,sprintf,die,var_dump,var_export
防御
1.在输出和二次调用时过滤特殊字符 ',",<,>,\,;,&,#
2.标签事件黑白名单
3.htmlentites()和htmlspecialcahrs()函数将输入转换为HTML实体
csrf
用于越权操作,管理员后台,会员中心,论坛帖子,
交易管理等地方 ,在核心文件中找有无验证token和referer相关代码
防御
1.token
2.referer,自定义HTTP头
3.验证码 ,二次验证等
文件操作漏洞
文件包含漏洞
本地文件包含:远程包含文件漏洞(allow_url_include=on)
远程文件包:只能包含本机文件(输出参数进行路径拼接)
查找相关函数:
include() , include_once()报错程序继续执行
require(),require_once()报错推出程序
文件包含截断
程序代码include($mode.'php')
1.%00截断(受限与gpc,addslashes)
2.利用多个点(.),反斜杠(\)截断 php <5.3
3.远程文件包含时用?截断,问号后当请求参数
防御
1.严格限制包含中的参数,取消那些不可控的参数。
2.开启open_basedir()函数,将其设置为指定目录,则只有该目录的文件允许被访问。
3.关闭allow_url_include。
4.白名单,对包含文件进行限制
文件上传漏洞
上传函数:move_uploaded_file()
过滤机制:
1.未过滤直接cpoy到新文件
2.黑名单
3.文件头,content-type验证 getimagesszie()函数,文件头加GIF89a
文件操作漏洞防范
1.对权限管理合理
2.隐藏文件名,利用更安全的方法代替以文件名为参数下的操作,把文件名,文件路径,文件id,文件上传人,上传至数据库,对比文件id和当前用户判断。
3.避免目录跳转问题(禁止 .,/ 字符传参等)open_basedir
代码执行漏洞
相关函数 :
eval(),assert(),preg_replace(),call_user_func(),call_user_func_array(),array_map()
call_user_func(),call_user_func_array()函数功能:调用函数多用在框架动态调用函数
array_map():调用函数并且除第一个参数以外其他参数为数组
preg_replace():对字符进行正则处理
preg_replace():
<?php
preg_replace("/\[(.*)\]/e",'\\1', $_GET['cmd']);
?>
call_user_func(),array_map()传入参数可控:
<?php
$a='phpinfo()';
call_user_func($_GET['b'],$a);
?>
同类函数:
动态函数执行:php函数可由字符拼接
<?php
$_GET['a']($_GET['b']);
?>
防御
结合正则进行白名单
命令执行漏洞
相关函数:
system()
exec():只返回最后一行
shell_exec()
passthru()
pcntl_exec()
proc_open()
popen():返回一个文件指针不返回执行结果。
反引号`
漏洞防御
命令防注入:
escapeshellarg():过滤参数将参数包裹在双引号里,确保参数为字符串
escapeshellcmd() 过滤整条命令
参数白名单