XSS-Labs
| 函数 | 含义 | 关卡作用 |
|---|---|---|
echo |
输出到页面 | 所有的输出点,未经 htmlspecialchars 即产生 XSS |
htmlspecialchars() |
转义 HTML 特殊字符 | 应用则安全,未应用则存在 XSS(L1 无此函数) |
str_replace() |
字符串替换(黑名单过滤) | L5-L7 用其过滤 <script>,可双写/大小写绕过 |
str_ireplace() |
大小写不敏感的替换 | 同上,替换后仍可双写绕过 |
strtolower() |
转小写后过滤 | L6 配合过滤,需大小写混合绕过或换标签 |
preg_match() |
正则匹配检测 | 用于检测协议(javascript:)、http 字符串 |
preg_replace() |
正则替换 | 比 str_replace 更强,需注意模式绕过 |
strpos() / stripos() |
查找字符串位置 | L9 用 strpos 检测是否包含 http:// |
substr() |
截取字符串 | 用于截取部分输入做比较 |
isset() / empty() |
检测变量是否存在/为空 | 判断参数是否提交,大部分关卡入口 |
Upload-Labs
| 函数 | 含义 | 关卡作用 |
|---|---|---|
uniqid() / md5() / time() |
生成随机/哈希文件名 | 使文件名不可预测,需结合解析漏洞 |
move_uploaded_file() |
移动临时文件到目标路径 | 文件最终落地的关键函数 |
pathinfo() |
取文件扩展名 | 黑白名单判断扩展名的核心函数 |
explode() + end() |
分割字符串取最后一个元素 | 取扩展名的替代方案 |
strrchr() |
从最后一个 . 开始截取 |
取扩展名的另一种方式 |
strtolower() |
转小写后比对 | 配合扩展名黑/白名单,防止大小写绕过 |
in_array() |
数组中是否存在 | 白名单/黑名单判定的核心函数 |
str_replace() |
字符串替换过滤 | 过滤危险后缀如 php,可双写绕过 |
substr() |
截取字符串 | 截取文件名或扩展名做检查 |
strrpos() |
找最后一次出现位置 | 定位 . 位置取扩展名 |
getimagesize() |
取图片尺寸信息 | 检测文件是否为真实图片(内容检查) |
exif_imagetype() |
取图像类型常量 | 同 getimagesize,更轻量 |
finfo_file() |
检测文件真实 MIME 类型 | 根据文件字节判断类型,难以伪造 |
rename() |
重命名文件 | 1.php 变为 1.php.jpg 时需重新命名 |
file_exists() |
检查文件是否存在 | 判断文件是否已存在或上传成功 |
str_contains() / stristr() |
检查字符串包含关系 | 检测文件名中是否含 php 等关键词 |
File Inclusion
| 函数 | 含义 | 靶场作用 |
|---|---|---|
include() / include_once() |
包含并执行文件(失败警告,继续执行) | DVWA fi 核心,直接包含用户控制的 page 参数 |
require() / require_once() |
包含并执行文件(失败致命错误) | 同 include,但失败时程序终止 |
file_get_contents() |
读取文件内容到字符串 | LFI 读取本地敏感文件 / RFI 获取远程内容 |
fopen() + fread() + fclose() |
打开/读取/关闭文件 | 配合 LFI 读取任意文件 |
readfile() |
读取并直接输出文件内容 | 无中间变量的文件读取输出 |
file() |
读取文件到数组(每行一个元素) | 文件内容逐行处理 |
basename() |
返回路径中的文件名部分 | DVWA impossible 级取纯文件名,防路径穿越 |
realpath() |
返回规范化的绝对路径 | 防御 ../ 路径遍历攻击 |
dirname() |
返回目录名 | 路径拼接操作 |
fnmatch() |
通配符模式匹配文件名 | DVWA high 级用 fnmatch("file*", $file) 做白名单 |
preg_match() |
正则匹配 | 检测参数是否包含 ../、http:// 等危险字符 |
str_replace() |
替换字符串 | DVWA medium 级清除 ../、..\\、http://、https:// |
allow_url_include |
php.ini 配置项(非函数) | 决定是否允许远程文件包含(RFI 开关) |
命令执行
| 函数 | 含义 | 靶场作用 |
|---|---|---|
system() |
执行外部命令并输出结果 | DVWA exec 模块核心函数 |
exec() |
执行外部命令,返回最后一行 | 命令执行核心函数,不直接输出 |
shell_exec() |
通过 shell 执行命令,返回完整输出 | 反引号 ````` 的等价写法 |
passthru() |
执行外部命令,直接输出原始结果 | 输出二进制数据(如图片流) |
popen() |
打开进程文件指针(单向管道) | 通过文件句柄方式执行命令 |
proc_open() |
更精细的进程控制 | 高级命令执行,可控制 stdin/stdout/stderr |
escapeshellcmd() |
转义 shell 元字符 #&; `等 |
防御:阻止特殊字符,但不阻止多参数注入 |
escapeshellarg() |
转义参数并用单引号包裹 | 防御:更安全的参数转义,整个参数视为一个单词 |
eval() |
将字符串作为 PHP 代码执行 | 代码执行核心函数,可直接执行任意 PHP |
assert() |
断言(PHP < 7.3 可执行代码) | 旧版 PHP 中 assert('phpinfo()') 可执行 |
call_user_func() |
调用第一个参数指定的回调函数 | 动态函数调用,可调用 system、assert 等 |
call_user_func_array() |
带参数数组的回调函数调用 | 同 call_user_func,参数以数组形式传入 |
create_function() |
创建匿名函数(PHP < 8.0) | 字符串拼接构造函数体,存在代码注入 |
preg_replace() + /e 修饰符 |
正则替换时执行代码(PHP < 7.0) | /e 修饰符将替换内容作为代码执行 |
array_map() / array_filter() |
回调函数遍历数组 | 配合 call_user_func 风格动态调用 |
str_replace() / str_ireplace() |
字符串替换过滤 | 命令注入黑名单过滤 ` |
preg_match() |
正则匹配 | 检测参数中是否包含命令连接符 |