2025-10-31-php伪协议深入刨析

2025-10-31-php伪协议深入刨析

十月 31, 2025

PHP伪协议本质

例:

1
<?php include($_GET['url']);?> 

传入url=php://input 消息载体为 <?php system("xxx");?> 即可执行命令

为什么可以?

php伪协议是 PHP内置的流包装器

  • 通过URL传递 ?url=php://input 并在请求体中传入 <?php system("xxx);?> 时,include 函数会执行请求体中的内容作为PHP代码

过程:

  • php://input 流读取了HTTP请求体中的原始数据(即 <?php system("xxx");?>)。

  • include 函数将这些数据当作PHP文件执行,因此 system("xxx") 命令被运行,并将结果返回。

日志包含漏洞

本质上就是把危险的php代码注入到日志中,然后把日志作为php代码解析进去(因为文件包含可以包含到日志文件)

例如 CTF秀的 web4

众所周知,Linux系统下,日志位置是:/var/log/nginx/access.log

题目提示是: <?php include($_GET['url']);?> 文件包含这个url= 什么

他的日志格式是这样的

172.12.109.181 - - [31/Oct/2025:08:03:09 +0000] "GET / HTTP/1.1" 200 715 "https://ctf.show/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:144.0) Gecko/20100101 Firefox/144.0"

Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:144.0) 是来自客户端的信息,也就是我的浏览器,这个我可以任意更改,我直接改成木马,然后让其包含,就getshell了。

MD5 判断 绕过

依然继续在CTF秀中学知识

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$flag="";
$v1=$_GET['v1'];
$v2=$_GET['v2'];
if(isset($v1) && isset($v2)){
if(!ctype_alpha($v1)){ // 只有字母
die("v1 error");
}
if(!is_numeric($v2)){ // 只有数字
die("v2 error");
}
if(md5($v1)==md5($v2)){ // 注意这里不是严格检查 不是 ===
echo $flag;
}
}else{
echo "where is flag?";
}
?>

1.md5比较使用松散比较。在PHP中,松散比较(==)会进行类型转换。如果两个md5哈希值在比较时被转换为数字或其它类型,就有问题!

2.如果! md5加密后密文都以 0e 开头,PHP会当作科学计数法来处理,也就是0的n次方,因此会实现绕过!

以下是一些著名的数值

1
2
3
4
5
6
7
8
9
字符串: 240610708 | MD5: 0e462097431906509019562988736854
字符串: 314282422 | MD5: 0e990995504821699494520356953734
字符串: QNKCDZO | MD5: 0e830400451993494058024219903391
字符串: aabg7XSs | MD5: 0e087386482136013740957780965295
字符串: aabC9RqS | MD5: 0e041022518165728065344349536299

ps:
aaK1STfY sha1() 0e76658526655756207688271159624026011393
aaO8zKZF sha1() 0e89257456677279068558073954252716165668