代码审计(Code audit)是一种以发现程序错误,安全漏洞和违反程序规范为目标的源代码分析。软件代码审计是对编程项目中源代码的全面分析,旨在发现错误,安全漏洞或违反编程约定。 它是防御性编程范例的一个组成部分,它试图在软件发布之前减少错误
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.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
扫描目录 返回指定目录中的文件和目录的数组
变量是用于存储信息的"容器"
$x=29;
$y=40;
$z=$x+$y;
echo $z;
?>
//输出结果为 69
PHP 变量规则:
变量以 $ 符号开始,后面跟着变量的名称
变量名必须以字母或者下划线字符开始
变量名只能包含字母、数字以及下划线(A-z、0-9 和 _ )$_GET $_POST $_REQUEST
变量名不能包含空格
变量名是区分大小写的($y 和 $Y 是两个不同的变量)
PHP 没有声明变量的命令。
变量在您第一次赋值给它的时候被创建
注意:当给一个文本值给变量时,记得在文本值两侧加上"引号"
local #本地
global #全局
static #静态的
parameter #参数
全局变量可以被脚本中的任何部分访问而在 PHP 函数内部声明的变量是局部变量,仅能在函数内部访问
$x=5; // 全局变量
function myTest()
{
$y=10; // 局部变量
echo "测试函数内变量:
"
;
echo "变量 x 为: $x";
echo "
";
echo "变量 y 为: $y";
}
myTest();
echo "测试函数外变量:
"
;
echo "变量 x 为: $x";
echo "
";
echo "变量 y 为: $y";
?>
__LINE__
__FILE__
__FUNCTION__
__CLASS__
__METHOD__
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';
}
}
第一步:连接数据库服务器
$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);
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 删除字符串中的空白符
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);
header()
setcookie()
urlencode()
urldecode()
serialize
unserialize
file_get_contents()
file_put_contents()
fopen()
fgets()
unlink()
file_exists()
is_dir()
scandir()
is_uploaded_file()
isset ----> is_null
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是被调用的回调函数,其余参数是回调函数的参数
require
include
require_once
include_once
readfile
exec() 执行一个外部程序
passthru() 执行外部程序并且显示原始输出
shell_exec() 反引号 ``
system() 执行外部程序,并且显示输出
ob_start () 打开输出控制缓冲
pro_open() 执行一个命令,并且打开用来输入/输出的文件指针
unlink/delete/rmdir:文件操作函数
parse_str/mb_parse_str:解析为变量
extract:用来将变量从数组中导入到当前的符号表中
move_uploaded_file:将上传的文件移动到新位置
fsockopen:打开一个网络连接或者一个Unix套接字连接
WAMP 是指在 Windows 服务器上使用 Apache 、MySQL 和 PHP 的集成安装环境,可以快速安装配置 Web服务器,一般说来,大家都习惯于将 Apache、MySQL、PHP 架设在 Linux 系统下,但是 ,不可否认的是Windows 也有其优点,就是易用,界面友好,软件丰富,操作起来非常方便,因此对新手来说在 Windows 平台下使用 Apache、MySQL、PHP 也确实是一个不错的选择。下面我将介绍在 Windows 下可以使用的 WAMP 集成环境
特点:
支持Windows和linux。
集成Apache、IIS、Nginx。
支持切换PHP多种版本。
默认安装mysql数据库。
Notepad++
Sublime Text
PhpStorm
阿里巴巴尹毅使用 C# 开发的一款针对PHP代码安全性审计的 系统,主要运行于 Windows 系统上。这款软件能够发现SQL注入、代码执行、命令执行、文件包含、文件上传、绕过转义防护、拒绝服务、XSS跨站、信息泄露、任意URL跳转等漏洞
跨站脚本漏洞
CSRF漏洞
上传漏洞
逻辑漏洞
远程代码执行漏洞
变量覆盖漏洞
XPATH注入漏洞
目录遍历漏洞
SQL注入漏洞
文件包含漏洞
关注点:
WEB 应用程序敏感函数点,如 SQL 注入拼接处,命令执行函数、 代码执行函数、反序列化函数。 然后回溯参数调用的过程,查看是否全部过滤或者过滤不全
如:
程序可能开启 magic_quotes_gpc
,但是程序部分数据流经过 $_SERVER
变量,而$_SERVER
变量并不受 gpc 影响,可能会导致注入。
目前大多数漏洞都是由于函数的使用不当造成的。
(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.常见的功能点漏洞
文件上传功能
文件管理功能
登录认证功能
密码找回功能
网站重装功能
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网站应用,引入框架类开发源码,相关审计工具及插件使用。