PHP代码审计总结

开发安全应用的原则

1.深度防范(冗余,谨慎过头了)
2.最小权限(分配尽量少的权限)
3.简单就是美(复杂容易出错,出错导致漏洞)
4.暴露最小化(隐藏关键数据)
等等等等

方法

1.平衡风险与可用性
用户操作的友好性与安全措施比较矛盾,在提高安全性的同时,通常会降低可用性(操作麻烦,步骤繁琐)。
尽量使安全措施对用户透明,或采用用户熟悉的方式。比如在用户访问受控信息前需要输入用户名和密码来确认身份。
2.跟踪数据
(数据从哪来,要到哪去)在代码审计中,主要检查代码中与外部交互的部分。
3.过滤输入

4.转义输出

代码审计

漏洞形成的条件:
1.可控变量(一切输入都是有害的)
2.对变量进行操作的函数(一切进入函数的变量都是有害的)
漏洞的利用效果取决于最终函数的功能,变量进入什么样的函数就导致什么漏洞
文件包含---->包含漏洞
代码执行---->执行任意代码漏洞
命令执行---->执行任意命令漏洞
文件系统操作---->文件(目录)读写等漏洞
数据库操作---->SQL注射漏洞
数据显示 ---->XSS等客服端漏洞

代码审计本质

找漏洞==找对应变量与函数
变量跟踪的过程
通过变量找函数[正向跟踪变量]
通过函数找变量[逆向跟踪变量]

变量的传递与二次漏洞
变量存储、提取、传递是一个复杂的立体的过程,过程中经过多个不一样的函数的处理后继续传递,最终达到漏洞函数,传递的过程中任意环节可控就可能导致漏洞,中间函数处理的过程诞生新的变量,新的变量达到新的漏洞函数诞生新的漏洞[二次漏洞]

变量

$_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
*

在PHP中这些变量可由用户输入,应对这些变量进行检查,各个变量(函数)的含义用法可在手册中查看
手册地址:
https://www.php.net/manual/zh/reserved.variables.server.php

函数

我们通过在全部程序文件中搜索这些函数,确定函数的参数是否会因为外部提交而改变
检查这些参数是否有经过安全处理
命令注入

system、exec、passthru、``、shell_exec、popen、proc_open、pcntl_exec

防范方法:

1.使用自定义函数或函数库来替代外部命令的功能
2.使用 escapeshellarg 函数来处理命令参数
3.使用 safe_mode_exec_dir 指定可执行文件的路径
XSS

反射型跨站,因为是立即输出显示给客户端,所以应该在当前的 php 页面检查变量被
客户提交之后有无立即显示,在这个过程中变量是否有经过安全检查。
存储型跨站,检查变量在输入后入库,又输出显示的这个过程中,变量是否有经过安
全检查。

echo、print、printf、vprintf、<%=$test%>

防范方法:

1.如果输入数据只包含字母和数字,那么任何特殊字符都应当阻止
2.对输入的数据经行严格匹配,比如邮件格式,用户名只包含英文或者中文、下划线、连字符,对输出进行 HTML 编码

文件包含

include、include_once、require、require_once、show_source、highlight_file、readfile、file_get_contents、fopen、file

防范方法:

1.对输入数据进行精确匹配,比如根据变量的值确定语言 en.php、cn.php,那么这两个文件放在同一个目录下’language/’.$_POST[‘lang’].’.php’,那么检查提交的数据是否是 en 或者 cn 是最
严格的,检查是否只包含字母也不错
2.通过过滤参数中的/、…等字符

代码注入

eval、preg_replace+/e、assert、call_user_func、
call_user_func_array、create_function

防范方法:
1.输入数据精确匹配
2.白名单方式过滤可执行的函数

SQL注入

SQL 注入因为要操作数据库,所以一般会查找SQL 语句关键字:

insert、delete、update、select,

查看传递的变量参数是否用户可控制,有无做过安全处理

防范方法:
参数化查询,预编译

XXE

Xpath

HTTP响应拆分

使用 header 函数和使用**$_SERVER变量**。注意:PHP 的高版本会禁止 HTTP 表头中出现换行字符,这类可以直接跳过本测试。

文件上传

PHP 文件上传通常会使用 move_uploaded_file,也可以找到文件上传的程序进行具体分析

防范方法:
1.使用白名单方式检测文件后缀
2.上传之后按时间能算法生成文件名称
3.上传目录脚本文件不可执行
4.注意%00截断

文件类函数

copy、rmdir、unlink、delete、fwrite、chmod、
fgetc、fgetcsv、fgets、fgetss、file、file_get_contents、fread、readfile、ftruncate、file_put_contents、
fputcsv、fputs,

通常 PHP 中每一个文件操作函数都可能是危险的。

反序列化

__wakeup() //使用 unserialize 时触发
__sleep() //使用 serialize 时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用 isset()或 empty()触发
__unset() //在不可访问的属性上使用 unset()时触发
__toString() //把类当作字符串使用时触发
__invoke() //当脚本尝试将对象调用为函数时触发

注意

真实环境中可能会有用户自定义的函数,根据实际情况进行判断

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值