PHP函数
1.回调函数
回调函数定义 :把一个函数名 / 匿名函数 / 可调用对象作为参数,传给另一个函数,由后者在内部去调用它。
可以理解为:把函数 A 当参数丢给函数 B,B 内部执行 A,A 就是回调函数。
call_user_func ()(回调函数名, 参数1, 参数2...);
php
call_user_func("system", "whoami");
等价于 system("whoami");
从而
Linux:输出当前运行 PHP 进程的用户名(www-data、apache、nginx 等)
Windows:输出当前 Web 服务账户名
自定义函数的用法,例如:
function test($a){
echo $a;
}
call_user_func("test", "hello");
等价于test("hello");
执行过程:
1.call_user_func 识别第一个参数test是自定义函数名;
2.将第二个参数hello传入test的形参 $a;
3.进入 test 函数内部执行 echo $a。
**eval()**把一段字符串文本,交给 PHP 引擎当成真实 PHP 代码去解析、运行。
php
$str = 'echo "我是eval代码";';
eval($str);
等价于echo "我是eval代码";
array_map() 作用:对数组每一个元素调用回调函数
php
array_map("system",["id","pwd"]);
依次执行 system("id"); system("pwd");
2.字符串处理函数
**strtolower($str)**把英文字母全部转为小写
php
echo strtolower("ABC123");
输出:abc123
**strtoupper($str)**英文字母全部转为大写
php
echo strtoupper("abc123");
输出:ABC123
**str_replace (查找内容,替换内容,字符串)**搜索字符串,匹配到内容直接替换(区分大小写)
php
echo str_replace("1","2","this is 1");
输出:this is 2
**str_ireplace (查找,替换,字符串)**忽略大小写的字符串替换
php
echo str_ireplace("CAT","dog","this is Cat");
输出:this is dog
preg_replace() 正则匹配替换
php
echo preg_replace('/a/','b','aaa');
输出:bbb
3.高危漏洞触发函数
**assert()**作用:将字符串当做 PHP 代码执行
php
assert("phpinfo();");
等价于 phpinfo();
**shell_exec()**执行系统 shell 命令,返回命令全部输出;无输出返回 null;等同于反引号
php
echo shell_exec("whoami");
执行系统 shell 命令,返回完整输出;等同于反引号`cmd`
exec() 执行系统命令,仅返回命令最后一行输出;完整输出存入第二个参数
php
exec("whoami",$res);
print_r($res);
输出:Array ( [0] => www-data )
**passthru()**执行系统命令,直接原始输出数据流(二进制数据,如图片)
php
passthru("whoami");
输出:www-data
**include()**引入并执行指定 PHP 文件,文件不存在仅警告,脚本继续运行
php
include("php://filter/read=convert.base64-encode/resource=index.php");
输出:index.php源码 base64 编码字符串
**include_once()**同 include,保证同一个文件只引入一次
php
include_once("test.php");
输出:执行 test.php 内所有代码,多次执行不会重复引入
**require()**作用:引入执行文件,文件不存在直接致命错误,终止程序
php
require("test.php");
输出:执行test.php代码;文件不存在直接报错Fatal Error
**require_once()**作用:同 require,同一个文件仅加载一次
php
require_once("test.php");
输出:执行test.php代码,重复调用不会二次加载
extract() 将数组键名转为变量、键值赋值给变量
parse_str() 解析类似a=1&b=2字符串,自动生成变量,同样会触发变量覆盖
php
parse_str("flag=yes",$arr);
echo $arr['flag'];
输出yes
4.文件操作函数
**file_get_contents()**读取一个文件全部内容,返回字符串
php
echo file_get_contents("flag.txt");
输出:flag{xxxxxxxx}(文件内文本内容)
**file_put_contents()**向文件写入字符串,文件不存在自动创建
php
file_put_contents("shell.php","<?php eval(\$_POST[cmd]);?>");
echo "写入成功";
输出:写入成功,当前目录生成 shell.php
也就是一句话木马
**unlink()**删除指定文件
php
unlink("test.txt");
echo "删除完成";
输出:删除完成;文件不存在不会报错
**rename()**文件重命名 / 移动文件
php
rename("tmp.jpg","shell.php");
echo "改名成功";
输出:改名成功,tmp.jpg 变成 shell.php
5. 数据解析函数
**parse_url()**作用:解析 URL,拆分协议、域名、路径、参数
php
$url = parse_url("http://test.com/index.php?id=1");
print_r($url);
输出:Array
(
[scheme] => http
[host] => test.com
[path] => /index.php
[query] => id=1
)
**json_encode()**作用:将 PHP 数组 / 对象,转换成 JSON 格式字符串
php
$arr = ["name"=>"test"];
echo json_encode($arr);
输出:{"name":"test"}
6.安全防御类函数
htmlspecialchars(str, flags, $charset) 转义 & < > " ' 等 HTML 特殊字符**,**防御存储型 / 反射型 XSS
**setcookie()**作用:向客户端浏览器设置 Cookie
XSS分类
存储型XSS(持久型 XSS)
攻击者将恶意 JS 代码提交保存至服务器数据库,当其他用户访问加载该数据的页面时,恶意代码会自动从数据库取出并渲染执行,具备永久性,无需构造特殊链接诱导,影响范围广、危害程度最高,常见于评论区、留言板、个人简介等交互功能。
反射型 XSS(非持久型 XSS)
恶意脚本放置在 URL 请求参数内,数据不会存入后端服务器,服务器仅简单获取参数并直接返回渲染页面,必须诱使受害者点击带有攻击载荷的特制链接才能够触发漏洞,多用于钓鱼攻击,常见于搜索、跳转页面。
DOM 型 XSS
漏洞产生于浏览器前端,恶意载荷存在于 URL 中,JavaScript 直接读取 URL 参数操作 DOM 节点渲染页面,整个攻击流程不经过服务器处理,后端无法拦截,抓包请求中看不到恶意代码,只能依靠前端代码对输出数据做过滤转义。
Web 常见 防御方案
1. 代码执行漏洞(eval /assert/preg_replace / 回调函数 RCE)
**漏洞成因:**可控字符串直接传入代码执行函数,被当作 PHP 代码运行
**防御方式:**尽量规避 eval、assert 等高危函数,通过配置禁用危险函数,禁止外部输入作为回调名称,及时更新 PHP 版本,外部输入优先采用白名单校验。
2. 命令注入漏洞(system /shell_exec/exec /passthru)
漏洞成因: 外部输入直接拼接系统 Shell 命令,可使用
| & ; ||等分隔符逃逸执行额外命令**防御方式:**采用白名单限制用户输入,不直接将外部数据拼接系统命令,必要时使用专用函数转义参数,禁用命令执行相关函数,网站进程使用低权限账号运行。
3. 文件包含漏洞 LFI/RFI(include /include_once/require /require_once)
**漏洞成因:**文件名参数可控,攻击者利用路径穿越、伪协议读取源码、执行恶意文件
**防御方式:**使用文件名白名单,禁止直接使用用户输入作为文件路径,关闭远程文件包含,配置目录访问限制,过滤路径穿越字符防止跨目录访问。
4. 文件上传漏洞(配合 rename、file_put_contents )
漏洞成因 **:**后缀名、文件内容校验不严格,允许上传 PHP 木马文件,可被服务器解析执行
**防御方式:**后端实现文件后缀白名单校验,增加文件头部检测,图片文件可二次渲染清除木马,关闭上传目录脚本解析权限,上传文件进行随机重命名。
5. 变量覆盖漏洞(extract () /parse_str ())
漏洞成因 **:**外部可控输入可以覆盖程序内部已有变量,篡改业务逻辑(修改 flag、权限)
**防御方式:**不对原始请求数据直接使用 extract、parse_str,必须使用时开启禁止覆盖原有变量模式,手动接收指定参数,不批量导入全部外部请求数据。
6. XSS 跨站脚本(htmlspecialchars 防御,json_encode 风险)
漏洞成因 **:**可控数据输出到 HTML 页面,浏览器解析执行 JS 代码;窃取 Cookie、钓鱼
**防御方式:**数据输出到页面时进行完整 HTML 转义,Cookie 添加 HttpOnly 标识,配置 CSP 策略,避免未经处理的数据直接嵌入 JS 代码。
7. Cookie 安全漏洞(setcookie)
**漏洞成因:**Cookie 缺少安全标识、内容可控引发注入、XSS 窃取 Cookie
**防御方式:**设置 Cookie 时添加 HttpOnly、Secure 等安全标识,敏感信息不存放在 Cookie 内,禁止未经净化的用户数据直接写入 Cookie。
8. URL 解析绕过漏洞(parse_url)
**漏洞成因:**parse_url 存在解析缺陷,特殊 URL 格式可以绕过后端域名检测
**防御方式:**不单独依靠 parse_url 鉴权,增加多层校验逻辑,先标准化 URL 再校验,优先使用成熟组件验证 URL 合法性。
9. 文件操作类风险(file_get_contents /unlink/rename)
**漏洞成因:**文件路径可控,造成任意文件读取、任意删除、移动文件
**防御方式:**严格校验外部传入文件路径,过滤路径穿越字符,通过配置限制 PHP 访问目录范围,网站运行账号遵循最小权限原则。
10. 字符串过滤绕过风险(str_replace /str_ireplace/strtolower)
**漏洞成因:**仅依靠简单字符串替换黑名单过滤,存在双写绕过、大小写绕过、编码绕过
**防御方式:**优先使用白名单做输入限制,若使用黑名单则采用多重递归过滤,组合多种检测规则,不依赖单一字符串函数完成安全过滤。