从零学网络安全 - Web 技术核心与安全风险(三)后端 PHP

一、PHP 基本语法

1. PHP 介绍

PHP(Hypertext Preprocessor,超⽂本预处理器)是⼀⻔开源的服务器端脚本编程语⾔,专⻔⽤于开发Web⽹站的后端逻辑。

PHP 特点

  • PHP 可在不同的平台上运⾏(Windows、Linux、Mac OS X 等)。
  • PHP 与⽬前⼏乎所有的正在被使⽤的服务器相兼容(Apache、IIS 等)。
  • PHP 提供了⼴泛的数据库⽀持。
  • PHP 易于学习,并可⾼效地运⾏在服务器端。

2. 学网安为什么必须学 PHP

  • PHP 的市场占比极⾼,是漏洞重灾区。
  • 不懂 PHP,就看不懂漏洞的底层原理。
  • 不懂 PHP,就看不懂漏洞的利用方式。
  • PHP 是网安入门最友好的后端语⾔。

3. PHP 基础语法

PHP 文件默认扩展名为 .php,通常包含 HTML 标签和⼀些 PHP 脚本代码。PHP 代码必须包含在 <?php ... ?>标签中。PHP 中的每⾏代码都必须以分号结束。

注释规则:

  • //单行注释
  • /*多行注释*/

变量规则:所有变量都必须以 $ 符号开头。

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

示例1:输出 "hello world"

示例2:定义变量

" . $message . ""; // HTML 和 PHP 混合输出 ?>

示例3:数组

数组元素的第一个下标为0.

"; echo $student[1]; ?>

示例4:条件语句

1. if 语句

语法:

if (条件){
条件成立时要执行的代码;
}

示例:

= 60) { echo "成绩及格"; } ?>

2. if...else 语句

语法:

if (条件){
条件成⽴时执⾏的代码;
}else{
条件不成⽴时执⾏的代码;
}

示例:

= 60) { echo "成绩及格"; } else { echo "成绩不及格"; } ?>

3. if...elseif...else 语句

语法:

if(条件1){
条件1成⽴时执⾏的代码;
}else if(条件2){
条件2成⽴时执⾏的代码;
}else{
以上条件不成⽴时执⾏的代码;
}

示例:

= 90) { echo "成绩优秀"; } elseif ($score >= 60) { echo "成绩及格"; // 75 >= 60 成立 } else { echo "成绩不及格"; } ?>

示例5:循环语句

知道循环次数通常用 for,不知道次数通常用 while

1. for 循环

语法:

for (初始值; 条件; 增量){
要执⾏的代码;
}

示例:

2. while 循环

语法:

while (条件){
要执⾏的代码;
}

示例:

= 0) { echo $student[$count].' ' ; $count=$count-1; } ?>

示例6:PHP函数

PHP 函数准则:

  • 函数的名称应该提示出它的功能
  • 函数名称以字⺟或下划线开头(不能以数字开头)

语法:

PHP⾃定义函数

示例:

示例7:类

类是抽象的概念,类似一个模板,⽤来描述具有相同属性和⽅法的对象的集合,⽐如:“人”是⼀个类。对象是类的实例,是某⼀个具体的事物,比如 “张三”则是“人”类的⼀个对象。

name. " 你好!"; } } $stu1 = new student(); $stu1 -> name = "xiaoming"; echo $stu1->name; $stu1 -> say(); ?>

示例8:类的构造方法

PHP魔术方法(Magic Methods)在 PHP 中具有特定的命名和功能。

- 魔术方法不需要显式调用,而是由PHP解释器在特定时机自动触发。
- 通常用两个下划线(__)开头,后跟方法名称如构造方法__construct()。

示例9:超全局变量

  1. $_GET:收集通过 URL GET 方法提交的表单数据
  2. $_POST:收集通过 HTTP POST ⽅法提交的表单数据
  3. $_FILES:处理通过 HTTP POST 上传的⽂件

准备一个登录的页面






Document



姓名:

年龄:




准备另一个获取数据的php页面

接收到的参数:"; echo "姓名:{$name}
"; echo "年龄:{$age}
"; echo "返回填写表单"; ?>

在 a.php 中输入数据后提交

image

可以在 b.php 中显示结果

image

示例10:序列化 serialize() 和反序列化 unserialize()

序列化是将⼀个 PHP 对象(包括它的类名、所有属性和属性值)转换为⼀个可存储、可传输的字符串的过程。

反序列化是将这个字符串还原回原来的 PHP 对象的过程。

准备一个登录的页面






Document



姓名:

年龄:

密码:




准备另一个获取数据的php页面

在 a.php 中输入数据后提交

image

可以在 b.php 中显示结果

image

二、WEB 交互实战

有一个php文件,index.php

"; } show_source(__FILE__); ?>

image

有一个flag文件,flag.php

目的:得到 if 语句中的 flag

思路:

在 PHP 中,=== 被称为全等运算符,两个变量的值、类型、长度必须完全相同才能成为全等。既然要求反序列化后的 $str 全等于 $KEY,而 $KEY 又被赋值为 "ZS",所以我们可以序列化 $KEY (即“ZS”)来得到 flag。

执行这段测试代码来得到“ZS”序列化后的结果:

我们得到:

s:2:"ZS";

所以我们可以在游览器中修改 url:http://127.0.0.1/fan/index.php?str=s:2:"ZS"

目标达成:

image

posted @ 2026-02-04 00:03  CloverChu  阅读(13)  评论(0)    收藏  举报