DAY31:代码审计基础( PHP 篇)

DAY31:代码审计基础( PHP 篇)

1、PHP 代码审计基础

1.1、代码审计概述

​ 代码审计(Code audit)是一种以发现程序错误,安全漏洞和违反程序规范为目标的源代码分析。软件代码审计是对编程项目中源代码的全面分析,旨在发现错误,安全漏洞或违反编程约定。 它是防御性编程范例的一个组成部分,它试图在软件发布之前减少错误

1.2、基本的 PHP 语法

PHP 脚本可以放在文档中的任何位置。

PHP 脚本以 结束:


 // PHP 代码
 ?>

PHP 文件的默认文件扩展名是 “.php”。

PHP 文件通常包含 HTML 标签和一些 PHP 脚本代码。

实例演示:





My first PHP page

数学函数&时间日期函数:

abs
max
min
floor
ceil
rand(5,15)
sqrt
time
date
mktime
microtime (微秒, 秒)
localtime(time(), assoc?)

关联数组遍历


$age=array(“xiaohong"=>“12",“xiaoming"=>“13",“xiaobai"=>“14");
foreach($age as $x=>$x_value) {
echo "Key=" . $x . ", Value=" . $x_value;
echo "
"
; } ?>

调试输出

var_dump
print_r

空函数

"", NULL, array(), false, 0, "0"

is_null

NULL, 未赋值, 未定义

三目运算符

(expr1)?(expr2):(expr3)

1.3、显示作用函数

1.echo
输出一个或者多个字符串。

2.print
和 echo 最主要的区别: print 仅支持一个参数,并总是返回 1。

3.print_r
打印关于变量的易于理解的信息,如果给出的是 string、integer 或 float,将打印变量值本身。如果给出的是 array,将会按照一定格式显示键和元素

4.var_dump
此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。

5.var_dump 和 print_r 的区别
var_dump 返回表达式的类型与值而 print_r 仅返回结果,相比调试代码使用 var_dump 更便于阅读。

6.sprintf			

7.scandir			
扫描目录 返回指定目录中的文件和目录的数组

1.4、PHP 中的注释


 
 



 
 

1.5、PHP 变量

变量是用于存储信息的"容器"


$x=29;
$y=40;
$z=$x+$y;
echo $z;
?>
//输出结果为 69

PHP 变量规则:

变量以 $ 符号开始,后面跟着变量的名称
变量名必须以字母或者下划线字符开始
变量名只能包含字母、数字以及下划线(A-z、0-9 和 _ )$_GET $_POST $_REQUEST
变量名不能包含空格
变量名是区分大小写的($y 和 $Y 是两个不同的变量)

1.6、创建(声明)PHP 变量

PHP 没有声明变量的命令。

变量在您第一次赋值给它的时候被创建

注意:当给一个文本值给变量时,记得在文本值两侧加上"引号"

1.7、PHP 变量作用域

local			#本地
global			#全局
static			#静态的
parameter		#参数

1.8、局部和全局作用域

全局变量可以被脚本中的任何部分访问而在 PHP 函数内部声明的变量是局部变量,仅能在函数内部访问


$x=5; // 全局变量

function myTest()
{
    $y=10; // 局部变量
    echo "

测试函数内变量:

"; echo "变量 x 为: $x"; echo "
"
; echo "变量 y 为: $y"; } myTest(); echo "

测试函数外变量:

"; echo "变量 x 为: $x"; echo "
"
; echo "变量 y 为: $y"; ?>

DAY31:代码审计基础( PHP 篇)_第1张图片

1.9、魔术常量

__LINE__ 

__FILE__ 

__FUNCTION__ 

__CLASS__ 

__METHOD__ 

1.10、变量类型

Boolean 布尔型: true / false
Integer 整形: 1234 / -1234 / 0123 / 0x1A
Float/double 浮点型: 1.234 / 1.2e3 / 7E-10
String 字符串: "aaaaaaa" / 'bbbbbbbbbbbb' / <<<标签 内容 标签;
Array 数组: array(1,2,3,4,5) / array("name"=>"gainover", "age"=>14)
NULL 无类型: NULL (被赋值为NULL,未被赋值,被unset() )
Object:对象
函数与类

function test($param1, $param2){
……
return 返回值;
}

调用:
$xiaoming = new Person();
$xiaoming->drink();

class Person{
	$name='gn';
	function Person(){
	}
	function eat(){
		…
	}
	function drink(){
		$this->name='x';
	}
}

1.11、数据库操作

第一步:连接数据库服务器
$link = mysql_connect('IP:端口', '用户名', '用户密码');

第二步:选择需要操作的数据库
mysql_select_db('foo', $link)

第三步:对数据库中的表进行查询、添加或删除操作!
$result = mysql_query("SELECT * from mysql.user", $link)
$num_rows = mysql_num_rows($result); 
mysql_close($link);

DAY31:代码审计基础( PHP 篇)_第2张图片

1.12、字符串操作函数

addslashes (', " , \ , NULL) ß à stripslashes
htmlentities/ htmlspecialchars
(字符串, ENT_COMPAT|ENT_QUOTES|ENT_NOQUOTES, 字符集)

$str = "first=value&arr[]=foo+bar&arr[]=baz"; 
parse_str($str); 
echo $first; // value 
echo $arr[0]; // foo bar 

substr(字符串, 起点, 长度)
trim, ltrim, rtrim 删除字符串中的空白符

1.13、正则表达式操作函数

preg_match(正则, 字符串, 匹配结果)
preg_match_all
preg_replace(正则, 替换后的内容, 被替换的字符串)
preg_split

$m=preg_replace("/\d+/","qq",$data);
$m=preg_replace("/\d+/e","phpinfo()",$data);
$m=preg_replace("/\[(.+)\]/e",'$a="$1"',$data);

1.14、HTTP操作函数 \ URL操作函数

header()
setcookie()
urlencode()
urldecode()

1.15、序列化与反序列化

serialize
unserialize

1.16、文件系统/目录操作函数

file_get_contents()
file_put_contents()
fopen()
fgets()
unlink()
file_exists()
is_dir()
scandir()
is_uploaded_file()
isset ----> is_null

1.17、文件处理

DAY31:代码审计基础( PHP 篇)_第3张图片

2、PHP 常见危险函数

2.1、代码执行函数

eval(string $code)
把字符串当作代码执行

assert(mixed $assertion)
断言,调试函数,把字符串当作代码执行

preg_replace( mixed$ pattern, 
mixed $ replacement, mixed $ subject)
/e修正符使preg_replace()
将replacement参数当作PHP代码执行

call_user_func(callable $ callback)
第一个参数callback是被调用的回调函数,其余参数是回调函数的参数

2.2、文件包含函数

require
include
require_once
include_once
readfile

2.3、命令执行函数

exec()			执行一个外部程序
passthru()		执行外部程序并且显示原始输出
shell_exec()	反引号 ``
system()		执行外部程序,并且显示输出
ob_start ()		打开输出控制缓冲	
pro_open()		执行一个命令,并且打开用来输入/输出的文件指针

2.4、其他危险函数

unlink/delete/rmdir:文件操作函数
parse_str/mb_parse_str:解析为变量
extract:用来将变量从数组中导入到当前的符号表中
move_uploaded_file:将上传的文件移动到新位置
fsockopen:打开一个网络连接或者一个Unix套接字连接

3、代码审计工具

3.1、代码审计环境搭建

​ WAMP 是指在 Windows 服务器上使用 Apache 、MySQL 和 PHP 的集成安装环境,可以快速安装配置 Web服务器,一般说来,大家都习惯于将 Apache、MySQL、PHP 架设在 Linux 系统下,但是 ,不可否认的是Windows 也有其优点,就是易用,界面友好,软件丰富,操作起来非常方便,因此对新手来说在 Windows 平台下使用 Apache、MySQL、PHP 也确实是一个不错的选择。下面我将介绍在 Windows 下可以使用的 WAMP 集成环境

3.2、环境搭建工具:phpstudy

特点:

支持Windows和linux。
集成Apache、IIS、Nginx。
支持切换PHP多种版本。
默认安装mysql数据库。

DAY31:代码审计基础( PHP 篇)_第4张图片

3.3、代码编辑工具

Notepad++
Sublime Text
PhpStorm

3.4、Seay 代码审计系统

​ 阿里巴巴尹毅使用 C# 开发的一款针对PHP代码安全性审计的 系统,主要运行于 Windows 系统上。这款软件能够发现SQL注入、代码执行、命令执行、文件包含、文件上传、绕过转义防护、拒绝服务、XSS跨站、信息泄露、任意URL跳转等漏洞
DAY31:代码审计基础( PHP 篇)_第5张图片

4、代码审计思路

4.1、常见漏洞

跨站脚本漏洞
CSRF漏洞
上传漏洞
逻辑漏洞
远程代码执行漏洞
变量覆盖漏洞
XPATH注入漏洞
目录遍历漏洞
SQL注入漏洞
文件包含漏洞

4.2、敏感函数回溯参数调用过程

关注点:

​ WEB 应用程序敏感函数点,如 SQL 注入拼接处,命令执行函数、 代码执行函数、反序列化函数。 然后回溯参数调用的过程,查看是否全部过滤或者过滤不全

如:

​ 程序可能开启 magic_quotes_gpc ,但是程序部分数据流经过 $_SERVER变量,而$_SERVER变量并不受 gpc 影响,可能会导致注入。

4.3、审计相关危险函数

目前大多数漏洞都是由于函数的使用不当造成的。

DAY31:代码审计基础( PHP 篇)_第6张图片

4.4、思路

(1)敏感函数回溯参数调用过程

优点:
能够快速挖掘想要挖掘的漏洞,具有定向挖掘和高效、高质量的优点。

缺点:
由于没有通读全文,对程序的整体框架了解不够深入。
很难挖掘到逻辑漏洞,例如越权

(2)通读全文

1.根据文件创建的时间、目录大小、目录类型、核心目录以及程序安装或功能说明的文档进行阅读,了解程序的大体框架和结构。

2.查看公共函数文件:common、function、include文件夹,一般包括程序文件公共调用的函数库
寻找方法:打开index.php,找到头部包含的文件

3.查看配置文件:例如包括config关键字的文件夹,一般包含程序的数据库,功能性配置选项等重要信息。

4.程序入口文件:index文件,了解程序功能架构、运行流程、核心文件,建议将几个核心目录的index文件都简单读一遍。

5.安全过滤文件或代码:
通常为filter、safe、check等关键字
主要针对SQL注入、XSS、文件路径等进行过滤
常用函数,如addslashes()
优点:
能够对程序框架有整体的认识
深入了解程序的运行流程
挖掘高质量的逻辑漏洞

缺点:
耗费时间

(3)根据功能点定向审计

1.寻找敏感功能点,通读功能点代码

2.安装运行好应用程序,四处点点,浏览一下,寻找经常会出现漏洞的功能点,通过黑盒测试和白盒测试的方式,发现漏洞。

3.常见的功能点漏洞
	文件上传功能
	文件管理功能
	登录认证功能
	密码找回功能
	网站重装功能

DAY31:代码审计基础( PHP 篇)_第7张图片
DAY31:代码审计基础( PHP 篇)_第8张图片

1、审计漏洞 - SQL数据库注入挖掘
2、审计思路 - 正则搜索 & 功能追踪 & 辅助工具
3、审计类型 - 常规架构 & MVC架构 & 三方框架
1、语言审计-PHP&.Net&Java&Python
2、漏洞审计-注入&上传&RCE&未授权等
3、框架审计-ThinkPHP&Spring&Flask等
4、工具审计-RIPS&VCG&Fortify&Bandit等
5、技术审计-动静态调试&DAST&SAST&IAST等
1、代码审计必备知识点:
环境搭建使用,工具插件安装使用,掌握各种漏洞原理及利用,代码开发类知识点。

2、代码审计开始前准备:
审计目标的程序名,版本,当前环境(系统,中间件,脚本语言等信息),各种插件等。

3、代码审计挖掘漏洞根本:
可控变量及特定函数,不存在过滤或过滤不严谨存在绕过导致的安全漏洞。

4、代码审计教学计划:
审计项目漏洞原理->审计思路->完整源码->应用框架->验证并利用漏洞。

5、代码审计教学内容:
PHP,Java,.NET,Python网站应用,引入框架类开发源码,相关审计工具及插件使用。

DAY31:代码审计基础( PHP 篇)_第9张图片DAY31:代码审计基础( PHP 篇)_第10张图片

DAY31:代码审计基础( PHP 篇)_第11张图片

你可能感兴趣的:(php,apache,开发语言)