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


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

    1、PHP 代码审计基础

    1.1、代码审计概述

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

    1.2、基本的 PHP 语法

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

    PHP 脚本以 结束:

    
     // PHP 代码
     ?>
    
    • 1
    • 2
    • 3

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

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

    实例演示:

    
    
    
    
    

    My first PHP page

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

    abs
    max
    min
    floor
    ceil
    rand(5,15)
    sqrt
    time
    date
    mktime
    microtime (微秒, 秒)
    localtime(time(), assoc?)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    关联数组遍历

    
    $age=array(“xiaohong"=>“12",“xiaoming"=>“13",“xiaobai"=>“14");
    foreach($age as $x=>$x_value) {
    echo "Key=" . $x . ", Value=" . $x_value;
    echo "
    "
    ; } ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    调试输出

    var_dump
    print_r
    
    • 1
    • 2

    空函数

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

    is_null

    NULL, 未赋值, 未定义
    
    • 1

    三目运算符

    (expr1)?(expr2):(expr3)
    
    • 1

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    1.4、PHP 中的注释

    
     
     
    
    
    
     
     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    1.5、PHP 变量

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

    
    $x=29;
    $y=40;
    $z=$x+$y;
    echo $z;
    ?>
    //输出结果为 69
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    PHP 变量规则:

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

    1.6、创建(声明)PHP 变量

    PHP 没有声明变量的命令。

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

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

    1.7、PHP 变量作用域

    local			#本地
    global			#全局
    static			#静态的
    parameter		#参数
    
    • 1
    • 2
    • 3
    • 4

    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"; ?>

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    请添加图片描述

    1.9、魔术常量

    __LINE__ 
    
    __FILE__ 
    
    __FUNCTION__ 
    
    __CLASS__ 
    
    __METHOD__ 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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:对象
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    函数与类
    
    function test($param1, $param2){
    ……
    return 返回值;
    }
    
    调用:
    $xiaoming = new Person();
    $xiaoming->drink();
    
    class Person{
    	$name='gn';
    	function Person(){
    	}
    	function eat(){
    		…
    	}
    	function drink(){
    		$this->name='x';
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    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);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    请添加图片描述

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

    header()
    setcookie()
    urlencode()
    urldecode()
    
    • 1
    • 2
    • 3
    • 4

    1.15、序列化与反序列化

    serialize
    unserialize
    
    • 1
    • 2

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

    file_get_contents()
    file_put_contents()
    fopen()
    fgets()
    unlink()
    file_exists()
    is_dir()
    scandir()
    is_uploaded_file()
    isset ----> is_null
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    1.17、文件处理

    请添加图片描述

    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是被调用的回调函数,其余参数是回调函数的参数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2.2、文件包含函数

    require
    include
    require_once
    include_once
    readfile
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.3、命令执行函数

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

    2.4、其他危险函数

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

    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数据库。
    
    • 1
    • 2
    • 3
    • 4

    请添加图片描述

    3.3、代码编辑工具

    Notepad++
    Sublime Text
    PhpStorm
    
    • 1
    • 2
    • 3

    3.4、Seay 代码审计系统

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

    4、代码审计思路

    4.1、常见漏洞

    跨站脚本漏洞
    CSRF漏洞
    上传漏洞
    逻辑漏洞
    远程代码执行漏洞
    变量覆盖漏洞
    XPATH注入漏洞
    目录遍历漏洞
    SQL注入漏洞
    文件包含漏洞
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

    关注点:

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

    如:

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

    4.3、审计相关危险函数

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

    请添加图片描述

    4.4、思路

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

    优点:
    能够快速挖掘想要挖掘的漏洞,具有定向挖掘和高效、高质量的优点。
    
    缺点:
    由于没有通读全文,对程序的整体框架了解不够深入。
    很难挖掘到逻辑漏洞,例如越权
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (2)通读全文

    1.根据文件创建的时间、目录大小、目录类型、核心目录以及程序安装或功能说明的文档进行阅读,了解程序的大体框架和结构。
    
    2.查看公共函数文件:common、function、include文件夹,一般包括程序文件公共调用的函数库
    寻找方法:打开index.php,找到头部包含的文件
    
    3.查看配置文件:例如包括config关键字的文件夹,一般包含程序的数据库,功能性配置选项等重要信息。
    
    4.程序入口文件:index文件,了解程序功能架构、运行流程、核心文件,建议将几个核心目录的index文件都简单读一遍。
    
    5.安全过滤文件或代码:
    通常为filter、safe、check等关键字
    主要针对SQL注入、XSS、文件路径等进行过滤
    常用函数,如addslashes()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    优点:
    能够对程序框架有整体的认识
    深入了解程序的运行流程
    挖掘高质量的逻辑漏洞
    
    缺点:
    耗费时间
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    1.寻找敏感功能点,通读功能点代码
    
    2.安装运行好应用程序,四处点点,浏览一下,寻找经常会出现漏洞的功能点,通过黑盒测试和白盒测试的方式,发现漏洞。
    
    3.常见的功能点漏洞
    	文件上传功能
    	文件管理功能
    	登录认证功能
    	密码找回功能
    	网站重装功能
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    请添加图片描述
    请添加图片描述

    1、审计漏洞 - SQL数据库注入挖掘
    2、审计思路 - 正则搜索 & 功能追踪 & 辅助工具
    3、审计类型 - 常规架构 & MVC架构 & 三方框架
    
    • 1
    • 2
    • 3
    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
    1、代码审计必备知识点:
    环境搭建使用,工具插件安装使用,掌握各种漏洞原理及利用,代码开发类知识点。
    
    2、代码审计开始前准备:
    审计目标的程序名,版本,当前环境(系统,中间件,脚本语言等信息),各种插件等。
    
    3、代码审计挖掘漏洞根本:
    可控变量及特定函数,不存在过滤或过滤不严谨存在绕过导致的安全漏洞。
    
    4、代码审计教学计划:
    审计项目漏洞原理->审计思路->完整源码->应用框架->验证并利用漏洞。
    
    5、代码审计教学内容:
    PHP,Java,.NET,Python网站应用,引入框架类开发源码,相关审计工具及插件使用。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    请添加图片描述请添加图片描述

    请添加图片描述

  • 相关阅读:
    新手如何备考学习PMP?
    交叉编译 openssl
    王道数据结构(串4.1)
    【嵌入式开发学习】__单片机中容易造成内存泄露的几个痛点
    数组(C语言)(详细过程!!!)
    异硫氰酸荧光素FITC标记二氧化钛纳米粒纳米颗粒CY7-Se-PEG-TiO2(定制服务)
    Java 基于 SpringBoot 的简历招聘系统
    WHAT - reflect-metadata
    Playwright 入门介绍和使用指南
    Mongodb索引类型简介
  • 原文地址:https://blog.csdn.net/qq_49433473/article/details/126355181