文件上传漏洞面试题

————————————————
版权声明:本文为 CSDN 博主「_PowerShell」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_51577576/article/details/128107202
转发博文:http://t.csdn.cn/6b1Jg

什么是文件上传漏洞?

1
2
1、文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
2、Web应用程序一般都具有上传功能,如果服务端代码未对客户端上传的文件进行严格的验证和过滤,恶意攻击者可以上传脚本文件并被服务器解析,文件上传漏洞就产生了。

什么是 webshell?

1
WebShell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称之为一种网页后门。攻击者在入侵了一个网站后,通常会将这些asp或php后门文件与网站服务器web目录下正常的网页文件混在一起,然后使用浏览器来访问这些后门,得到一个命令执行环境,以达到控制网站服务器的目的(可以上传下载或者修改文件,操作数据库,执行任意命令等)。 WebShell后门隐蔽较性高,可以轻松穿越防火墙,访问WebShell时不会留下系统日志,只会在网站的web日志中留下一些数据提交记录

文件上传危害有哪些?

1
2
3
4
5
6
1、上传漏洞与SQL注入或 XSS相比,其风险更大。
2、如果 Web应用程序存在上传漏洞,攻击者上传的文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行。
3、如果上传的文件是Flash的策略文件crossdomain.xml,黑客用以控制Flash在该域下的行为。
4、如果上传的文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行。
5、如果上传的文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。
6、甚至攻击者可以直接上传一个webshell到服务器上 完全控制系统或致使系统瘫痪。

能讲一下在 WEB 中进行文件上传的原理吗?

1
2
在WEB中进行文件上传的原理是通过将表单设为 multipart/form-data,同时加入文件域,而后通过 HTTP 协议将文件内容发送到服务器,服务器端读取这个分段 (multipart) 的数据信息,并将其中的文件内容提取出来并保存的。
通常,在进行文件保存的时候,服务器端会读取文件的原始文件名,并从这个原始文件名中得出文件的扩展名,而后随机为文件起一个文件名 ( 为了防止重复 ),并且加上原始文件的扩展名来保存到服务器上。

文件上传后常见的安全问题有哪些?

1
2
3
4
5
1、上传文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行;
2、上传文件是Flash的策略文件crossdomain.xml,黑客用以控制Flash在该域下的行为(其他通过类似方式控制策略文件的情况类似);
3、上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行;
4、上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈;
5、除此之外,还有一些不常见的利用方法,比如将上传文件作为一个入口,溢出服务器的后台处理程序,如图片解析模块;或者上传一个合法的文本文件, 其内容包含了PHP脚本,再通过“本地文件包含漏洞(Local File Include)"执行此脚本。

产生文件上传漏洞的原因有哪些?

1
2
由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致用户可以越过其本身权限向服务器上传可执行的动态脚本文件。
说白了就是没有对文件上传后的安全问题做正确的处理
1
2
3
4
1、对于上传文件的后缀名(扩展名)没有做较为严格的限制
2、对于上传文件的MIMETYPE(用于描述文件的类型的一种表述方法) 没有做检查
3、权限上没有对于上传的文件目录设置不可执行权限,(尤其是对于shebang类型的文件)
4、对于web server对于上传文件或者指定目录的行为没有做限制

常见的上传绕过方式有哪些?

前端

1
2
burpsuite抓包后修改filename。
浏览器设置中选择禁用javascript即可。

后端

1
2
3
4
5
6
7
8
9
1.黑名单(php、asp、xasp、jsp等)。
2.检测MIME类型。
3.低版本php的截断问题。
4.上传特殊文件(.htaccess .user .ini等文件)。
5.解析漏洞(apache解析漏洞、IIS解析漏洞、Nginx解析漏洞等)。
6.大小写绕过(如果禁止php文件上传,把文件名改成pHp,PhP等绕过)。
7.点绕过(如果服务器开启了黑名单过滤,则可采用1.php.的方式(仔细看有两个点)绕过并解析)。
8.双写绕过(如果禁止php文件上传,把文件名改成1.phphpp即可,其中中间的php过滤掉后仍可成功上传)。
9.二次渲染绕过(有些网站会使用二次渲染清除恶意代码,使上传的一句话木马失效)。方法:做图片马,上传后发现被清除,下载源码和上传的进行比较,发现未被渲染的字段之后把一句话马放到未被渲染的字段即可获得webshell。

文件上传漏洞常见的防护措施有哪些?

1
2
3
4
5
6
7
8
9
1、将文件上传目录的所有用户执行权限全部取消
2、判断文件类型
在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经 无数次被证明是不可靠的。此外, 对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码,或者在使用白名单的时候,使用分割字符串(上传来的文件名),使用"."来分割,仅允许分割后,字符串只有两个,一 个是文件名,一个是文件扩展名。
3、使用随机数改写文件名和文件路径
文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。
4、单独设置文件服务器的域名
把网站服务器和文件服务器分开,但是要保证,文件服务器的安全级别很高,且保证上传文件是相对高的可靠,直接把上传的图片等文件存储在文件服务器,并在文件服务器把所有目录设置为可读可写不可执行
5、二次渲染
原理:将上传的图片重新保存为一个新的图片,将里面可能含有的的可执行代码删除

审查上传点的元素有什么意义?

1
有些站点的上传文件类型的限制是在前端实现的,这时只要增加上传类型就能突破限制了。

常见的一句话木马有哪些?

PHP 一句话

1
2
<?php @eval($_POST['pass']);?> 
<?php phpinfo();?>

JSP 一句话

1
<%if(request.getParameter("f")!=null)(newjava.io.FileOutputStream (application.getRealPath("\\")+request.getParameter("f"))).write (request.getParameter("t").getBytes());%> 

ASP 一句话

1
<%eval(Request.Item["pass"],”unsafe”);%>

aspx 一句话

1
<scriptrunat=”server”>WebAdmin2Y.x.y aaaaa =newWebAdmin2Y.x.y (“add6bb58e139be10″);</script> 

你会如何检测文件上传漏洞?

1
2
3
4
5
6
1、首先找到一些上传点(如图片上传点)
2、上传不同类型的 恶意文件(其他后缀名等)
3、看网页源码,看是否通过前端的js限制(可绕过)
4、尝试不同的绕过方式进行绕过(黑名单/MIME类型/目录0x00截断绕过等等)
5、进行相关的尝试和猜测,去饶过他的限制
6、如果非法文件上传成功,那么就存在漏洞

对于文件上传漏洞,你是如何利用的?

1
首先寻找上传点,确认存在任意文件上传漏洞,然后上传webshell,然后连接webshell,然后进行入侵和攻击。

如何制作图片码?

利用 CMD

1
copy /b test.png + muma.php ccc.png

使用 GIMP (开源的图片修改软件)

1
通过增加备注,写入执行命令

能介绍一下 php 中 $_file()函数吗?

PHP 中的 $_FILES () 函数是用来处理客户端向服务器端上传文件的

1
2
3
4
5
$_FILES['file']['name']  #文件名
$_FILES['file']['type'] # 文件类型
$_FILES['file']['size'] # 文件大小,单位为字节
$_FILES['file']['tmp_name'] # 存储在服务器的文件临时副本的名称
$_FILES['file']['error'] # 文件上传的错误代码

其中 $_FILES [‘file’][‘type’] 就是从我们前面说的 MIME 类型,而 http 请求 content-type 用户可控,所以可以绕过。
抓包上传请求,修改 content-type 字段文件类型为允许的类型即可。

访问量 访客