欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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']);
?>

php代码审计
php代码审计
call_user_func(),array_map()传入参数可控:

<?php
$a='phpinfo()';
call_user_func($_GET['b'],$a);
?>

php代码审计
php代码审计
同类函数:
php代码审计
php代码审计
动态函数执行:php函数可由字符拼接

<?php
$_GET['a']($_GET['b']);
?>

php代码审计

防御

结合正则进行白名单

命令执行漏洞

命令执行漏洞

相关函数:
system()
exec():只返回最后一行
shell_exec()
passthru()
pcntl_exec()
proc_open()
popen():返回一个文件指针不返回执行结果。
反引号`

漏洞防御

命令防注入:
escapeshellarg():过滤参数将参数包裹在双引号里,确保参数为字符串
escapeshellcmd() 过滤整条命令
参数白名单