博主介绍
博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~
✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】
点赞➕评论➕收藏 == 养成习惯(一键三连)
欢迎关注一起学习一起讨论⭐️一起进步文末有彩蛋
作者水平有限,欢迎各位大佬指点,相互学习进步!
渗透方向的岗位,涉及到的知识点是很广泛的。
这里我总结了整个一系列的面试题,可能没有覆盖到全部的知识面,但是应该是比较全面的,本文主讲解web漏洞文件包含方向的面试题。
如果整个系列的问题搞懂了大部分,那找个网安方向的工作基本上没什么问题了。
当然了,可能也不是说这些问题都会被问到,但这些题目都是和网安岗位相契合的。
[ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(一)SQL注入相关面试题
[ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(二)XSS注入相关面试题
[ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(三)CSRF相关面试题
[ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(四)SSRF相关面试题
[ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(五)文件上传相关面试题
文件包含漏洞是一种最常见的漏洞类型,它会影响依赖于脚本运行时的web应用程序。当应用程序使用攻击者控制的变量构建可执行代码的路径时,文件包含漏洞会导致攻击者任意控制运行时执行的文件。如果一个文件包含这个漏洞,为了方便起见,经常在开发阶段就实施。由于它经常用于程序开发阶段,所以这就为后来的攻击埋下了伏笔并导致了各种基于文件的攻击。
文件包含漏洞主要是程序员把一些公用的代码写在一个单独的文件中,然后使用其他文件进行包含调用,如果需要包含的文件使用硬编码,一般是不会出现安全问题,但是有时可能不确定需要包含哪些具体文件,所以就会采用变量的形式来传递需要包含的文件,但是在使用包含文件的过程中,未对包含的变量进行检查及过滤,导致外部提交的恶意数据作为变量进入到了文件包含的过程中,从而导致提交的恶意数据被执行。
1、文件包含漏洞的产生原因是在PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。
2、最常见的就属于本地文件包含(Local File Inclusion)漏洞了。
开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,无需再次编写,这个文件调用的过程就是文件包含。如果对传入的文件名限制不严谨就会引发文件包含漏洞。
3、几乎所有脚本语言都会提供文件包含的功能,但文件包含漏洞在PHP站点文件包含漏洞居多,而在JSP、ASP等站点文件包含漏洞非常少,甚至没有,这是有些语言设计的弊端。
文件包含漏洞分为本地文件包含(Loacl File Inclusion,LFI)和远程文件包含(Remote File Inclusion,RFI)。二者有着相同的原理,但前者只能包含服务器上存在的文件,而后者可以包含远程服务器上的文件。
本地文件包含就是通过浏览器包含web服务器上的文件,这种漏洞是因为浏览器包含文件时没有进行严格的过滤允许遍历目录的字符注入浏览器并执行。
远程文件包含就是允许攻击者包含一个远程的文件,一般是在远程服务器上预先设置好的脚本。 此漏洞是因为浏览器对用户的输入没有进行检查,导致不同程度的信息泄露、拒绝服务攻击 甚至在目标服务器上执行代码。
1、通过文件包含漏洞,可以读取系统中的敏感文件,源代码文件等,如密码文件,通过对密码文件进行暴力破解。
2、若破解成功则可获取操作系统的用户账户,甚至可通过开放的远程连接服务进行连接控制。
3、不管是本地文件包含还是远程文件包含,文件包含漏洞还可能导致执行任意代码。
4、简单来说就是可能造成敏感文件泄露,获取webs hell,任意命令执行。
代码复用性
include()
include_once()
require()
re-quire_once()
fopen()
readfile()
......
ava.io.File()
java.io.Fil-eReader()
......
include file
include virtual
......
Require():如果里面有一些错误就会停止运行。
Include():有错误的话会产生警告信息,同时会接着往下执行。
一般来说文件包含漏洞会配合文件上传漏洞进行利用,如果不存在文件上传漏洞的情况下我们可以去获取一些敏感信息,或者利用日志文件记录报错的方法,来往日志文件中“写入”一句话木马
1.制作一个图片木马,通过文件上传漏洞上传
2.通过文件包含漏洞对该图片木马进行包含
3.获取执行结果
由于没有存在文件上传点,而我们又需要服务器本地有个文件存在一句话木马代码,这时候我们想到,日志文件记录报错的方法,来往日志文件中“写入”一句话木马,然后再利用文件包含来执行日志文件中的一句话木马。
由于没有存在文件上传点,而我们又需要服务器本地有个文件存在一句话木马代码,这时候我们想到,日志文件记录报错的方法,来往日志文件中“写入”一句话木马,然后再利用文件包含来执行日志文件中的一句话木马。
1、需要确认allow_url_fopen和allow_url_include的值都为On,也就是打开状态。
2、如果不是打开状态,我们设置未打开并且完成之后需要重启才能生效。
3、allow_url_fopen:默认值是ON。允许url里的封装协议访问文件。
4、allow_url_include:默认值是OFF。不允许包含url里的封装协议包含文件。
任意文件包含漏洞的主要出现在能够解析处理脚本文件的函数上,没有对输入的变量进行过滤,导致任意文件包含,进而导致恶意代码执行。在开发处理这类功能函数上,一定要遵循编程规范;在代码核心处,对变量进行过滤限制,设置文件路径或者白名单,避免执行任意文件包含。
代码在进行文件包含时,如果文件名可以确定,可以设置白名单对传入的参数进行比较。
由于Include/Require可以对PHP Wrapper形式的地址进行包含执行(需要配置php.ini),在Linux环境中可以通过”…/…/”的形式进行目录绕过,所以需要判断文件名称是否为合法的PHP文件。
PHP配置文件中有open_basedir选项可以设置用户需要执行的文件目录,如果设置目录的话,PHP仅仅在该目录内搜索文件。
PHP配置中的allow_url_include选项如果打开,PHP会通过Include/Require进行远程文件包含,由于远程文件的不可信任性及不确定性,在开发中禁止打开此选项,PHP默认是关闭的。
/var/lib/php/sess_PHPSESSID
/var/lib/php/sess_PHPSESSID
/tmp/sess_PHPSESSID
/tmp/sessions/sess_PHPSESSID
包含environ文件即可,常见路径为/pros/self/environ。
proc/self/environ中会保存user-agent头,如果在user-agent中插入php代码,则php代码会被写入到environ中,之后再包含它,就可以完成包含user-agent插入的php代码。
php以cgi方式运行,这样environ才会保持UA头。
environ文件存储位置已知,且environ文件可读。
C:\boot.ini
C:\windows\System32\inetsrv\MetaBas.xml
C:\windows\repair\sam
C:\program Files\mysql\my.ini
C:\program Files\mysql\data\mysql\user.MYD
c\windows\php.ini
C\windows\my.ini
/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/my.cnf
/etc/httpd/conf/httpd.conf
/root/.bash_history
/root/.mysql_history
/proc/self/fd/fd*
/proc/mounts/porc/config.gz
利用工具,将访问路径后加入%00,可以绕过后缀检查。
或者后面加一些特殊字符例如 斜杠 点之类。
有些程序会将传入参数指引到其他位置,或者修改后缀名,先访问文件判断,例如不需要写后缀名。
当写入文件时,发现删除某些特殊字符,我们可以判断是删除了其中字符,例如”php",“…/”,只需再增加一个使其删除后得到我们需要的,需要注意绝对路径与相对路径。
如中间件是nginx时,我们可以利用nginx目录解析,当我们只能上传.jpg文件时,我们无法利用,只能原文读取出来,但是发现在shell.jpg后加/xxx.php,他就能以php方式读取文件,这就是目录解析漏洞。
当我们访问不存在目录时,例如:http://lfi.cn/LFI-1/
它会将错误路径保存在日志中。不同的中间件有不同的路径。
日志文件名字为access_log,access.log,error.log,Logfiles等。
当不能直接访问目录下文件时,可以选择利用伪协议来访问文件,前提是allow_url_fopen和allow_url_include都是打开状态。
1.page=file://[绝对路径]
当页面有file1,file2……后台会判断是否已file开头,我们可以使用此协议。
2.php:// 访问各个输入/输出流(I/O streams)
php://filter用于读取源码
php://input用于执行php代码,或者直接将代码写入执行。
3.zip://[绝对路径], bzip2://[绝对路径], zlib://[绝对路径]协议,都属于压缩楼,访问压缩文件中的子文件,不需要指定后缀
phar:// 可以查找指定压缩包内的文件,相对路径与绝对路径都可以写
4.data: text/plain,<?php 执行内容 ?>与input类似,当我们想查看源代码时,可以将其先转换为base64文件在传到页面上就不会执行PHP了
5.http协议
也可以传入外部链接,自己服务器的钓鱼网站。