安全学习笔记day02
文件上传
什么是文件上传漏洞:
文件上传漏洞指的是攻击者上传了一个可执行的脚本文件,通过此脚本文件获得了执行服务器端命令的能力,即获得了服务端的某些权限。
常见的场景是:
某个网站或者app上,服务端允许用户上传图片或者普通的文本文件,然后攻击者能绕过这个限制,上传可执行的脚本文件来获取权限。
文件上传漏洞的危害:
1、网站被控制,对文件增删改查,执行命令,链接数据库
2、如果服务器长久未更新,可以利用exp提权,导致服务器沦陷
3、同服务器的其他网站沦陷
文件上传漏洞攻击的流程:
查看文件上传的限制条件
准备上传所用的php文件:
1、上传Web脚本语言,服务器的WEB容器解释并执行了用户上传的脚本,导致代码执行,篡改主页
2、上传Flash策略文件crossdomain.xml,以此来控制Flash在该域下的行为。
3、上传病毒、木马文件,攻击者用以诱骗用户或管理员下载执行,放置后门<?php system($ ['cmd']); ?>
4、上传钓鱼图片或包含了脚本的图片,某些浏览器会作为脚本执行,实施钓鱼或欺诈。
5、创建服务器用户,查看服务器信息 (使用net user 命令)
通过文件上传来将文件上传到服务端
用蚁剑或者中国菜刀连接(或者用apache解析,网页上查看服务器配置信息)
对服务端的文件等进行修改或执行某些命令(或者信息的搜集)
以upload-labs pass-1为例:
直接上传php文件会报错
考虑可以先将写好的php文件(例子中为一句话木马测试用php文件)改为png格式,再使用bp抓包,在bp中将抓下来的包更改回php格式再将包放出
选择修改好的png格式文件,点击上传:
bp抓包完成,将抓下来的包重命名:
单击forward:
查看upload上传的位置可知,已经成功绕过,将木马文件上传。利用蚁剑或者菜刀进行连接
tip:
asp一句话木马:
<%eval request(“c”)%>
php一句话木马:
<?php @eval($_POST[value]);?>
Aspx 一句话木马:
<%@ Page Language="Jscript"%>
<%eval(Request.Item["pass"],"unsafe");%>
成功进入!(ps:使用时需要将php版本设置为5左右,注意密码的填写)php文件若为phpinfo语句则在网页查看其php版本等信息
对文件上传漏洞利用方式的总结:
初学者可以多看看靶场的源码
1、推断文件上传限制的方式:
文件上传漏洞分为客户端和服务端,在分析该网站是否存在文件上传漏洞时可以先进行js检查(客户端)来判断。
例upload-labs pass1,首先先查看其源代码:
发现存在js脚本,可以在火狐的about:config中将javascript.enabled改成false或者用bp抓包,在bp上通过修改文件名后缀来实现绕过js。
若不存在,则应该为服务端存在的文件上传限制的拦截:
若想绕过content-type(内容类型)则可以使用图片木马
图片木马:就是将木马放在txt的上面,cmd 融在一起。
制作图片木马:
1、伪造头部GIF89A(gif的文件头)
2、win下的CMD执行:copy /b test.png + muma.php cccc.png
在这里插入图片描述
3、使用图片修改软件,添加备注,写入执行命令。
服务端
检查后缀
黑名单
白名单
检查内容
文件头检查(几个常见的文件头对应关系)
.JPEG;.JPE;.JPG,”JPGGraphic File”
.gif,”GIF 89A”
.zip,”Zip Compressed”
.doc;.xls;.xlt;.ppt;.apr,”MS Compound Document v1 or Lotus Approach APRfile”
突破getimagesize() PHP提供的方法,用以判断目标文件是否为图片。
其返回结果中有文件大小和文件类型(通过读取文件的前八位的十六进制)。因此可将恶意文件从第9位开始写入,以绕过getimagesize()验证
突破exif_imagetype() 判断是否为图片
二次渲染 上传的图片会被网站进行二次处理
bp抓包,在inturder下添加?a=1爆破点,运行多次(条件竞争)进行上传
将一句话木马插入图片在二次渲染后会保留的那部分数据里面
代码逻辑 条件竞争
-
黑名单 即限制哪些文件类型无法被上传
-
白名单 即限制哪些文件类型可以上传
2、根据黑白名单判断具体文件上传漏洞:
> 黑名单
> 1、 上传特殊可解析后缀
> 2、 上传.htaccess
> SetHandler application/x-httpd-php
> 3、 后缀大小写绕过
> 4、 点绕过
> 5、 空格绕过
> 6、 ::$DATA绕过
> 7、 配合解析漏洞
> Apache陌生后缀解析漏洞
> Apache换行解析漏洞
> 8、双后缀名绕过
> 白名单
> 1、MIME绕过
> 2、%00截断
> 3、0x00截断
3、熟悉各类用于文件上传的php函数:、
-
array() 用于创建数组
-
trim() 移除字符串两侧的空白字符或其他预定义字符
-
deldot() 删除文件名末尾的点
-
strrchr(string,char) 查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符
-
strtolower() 把字符串转换为小写
-
str_ireplace(find,replace,string,count) 替换字符串中的一些字符(不区分大小写)
-
substr(string,start,length) 返回字符串的一部分,从start开始,length表示选取的部分字符串的长度
-
strrpos(string,find,start) 查找查找字符串在另一字符串中最后一次出现的位置
-
rand(min,max) 生成随机整数,在min和max之间
-
rename(oldname,newname,context) 函数重命名文件或目录
-
date() 格式化本地日期和时间,并返回已格式化的日期字符串:
-
fopen() 打开一个文件或 URL
-
fread() 读取打开的文件
-
fclose() 关闭打开的文件
-
@unpack(format,data) 从二进制字符串对数据进行解包
-
@unlink() 删除文件
-
intval() 用于获取变量的整数值
-
imagejpeg() 输出图象到浏览器或文件
-
getReailFileType() 获取真实的文件类型
-
move_uploaded_file() 将上传的文件移动到新位置
-
getimagesize() 取得图像大小
-
image_type_to_extension() 取得图像类型的文件后缀
-
stripos() 查找字符串首次出现的位置(不区分大小写)
-
isImage() 检验图片是否有效
-
imagecreatefromjpeg() 由文件或 URL 创建一个新图象