靶场环境:docker安装Pikachu
docker直接search pikachu并pull下来即可,非常方便
docker pull area39/pikachu
docker run -itd -p 80:80 -p 3306:3306 --name "pikapika" area39/pikachu
任意文件下载漏洞
概念
一些网站由于业务需求,往往需要提供文件查看或文件下载功能,但若对用户查看或下载的文件不做限制,则恶意用户就能够查看或下载任意敏感文件,这就是文件查看与下载漏洞。
利用方式
一般链接形式
download.php?path=
down.php?file=
data.php?file=
download.php?filename=
或者包含参数
&Src=
&Inputfile=
&Filepath=
&Path=
&Data=
常规思路
- 下载常规的配置文件,例如:ssh,weblogic,ftp,mysql等相关配置
- 下载各种
.log
文件,从中寻找一些后台地址,文件上传点之类的地方
-
- 如果运气好的话会获得一些前辈们的后门
- 下载web业务文件进行白盒审计,利用漏洞进一步攻入服务器
- 尝试读取
/root/.bash_history
看自己是否具有root权限
-
- 如果没有的话,我们只能按部就班的利用
../
来回跳转读取一些.ssh
下的配置信息文件 - 读取mysql下的
.bash_history
文件,来查看是否记录了一些可以利用的相关信息,然后逐个下载我们需要审计的代码文件 - 但是下载的时候变得很繁琐,我们只能尝试去猜解目录,然后下载一些中间件的记录日志进行分析
- 如果没有的话,我们只能按部就班的利用
常见可利用文件
/etc/passwd
//用户信息文件/etc/shadow
//密码文件/etc/my.cnf
//mysql配置文件/etc/httpd/conf/httpd.conf
//apache配置文件/root/.bash_history
//用户历史命令记录文件/root/.mysql_history
//mysql历史命令记录文件/proc/mounts
//记录系统挂载设备/porc/config.gz
//内核配置文件/var/lib/mlocate/mlocate.db
//全文件路径/porc/self/cmdline
//当前进程的cmdline参数
实验环境-Pikachu
漏洞概述
文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载
如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞
此时如果攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd
),则很有可能会直接将该指定的文件下载下来,从而导致后台敏感信息(密码文件、源代码等)被下载
所以,在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑
漏洞利用
下载其中一张图片,BurpSuite抓包可抓到
.php?filename=
链接存在任意文件下载漏洞,可以获取目录下的任意文件
获取index页面
获取flag.txt文件内容
防御策略
- 过滤
.
,使用户在url中不能回溯上级目录 - 正则严格判断用户输入参数的格式
php.ini
配置open_basedir
限定文件访问范围
任意文件上传漏洞
概念
大多数网站都有文件上传的接口,但如果在后台开发时并没有对上传的文件进行安全考虑或采用了有缺陷的措施,导致攻击者可以通过一些手段绕过安全措施从而上传一些恶意文件,从而通过该恶意文件的访问来控制整个后台
利用方法
客户端检测绕过(javascript检测)
观察到提示只允许上传图片文件,查看代码前端的代码,当页面发生改变时,会调用类似于checkFileExt
函数来检查上传的是不是图片,我们只需要在前端将checkFileExt
函数删除,就能上传一个非图片文件
服务端验证绕过(MIME类型检测)
MlME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式
每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类
常见的MIME类型(通用型)
- 超文本标记语言文本
.html text/html
- xml文档
.xml text/xml
- XHTML文档
.xhtml application/xhtml+xml
- 普通文本
.txt text/plain
- RTF文本
.rtf application/rtf
实验环境-Pikachu
漏洞概述
文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式进行重命名后存储在指定的目录
如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨,则攻击着可能会上传一些恶意的文件,比如一句话木马,从而导致后台服务器被webshell
所以,在设计文件上传功能时,一定要对传进来的文件进行严格的安全考虑。比如:
- 验证文件类型、后缀名、大小;
- 验证文件的上传方式;
- 对文件进行一定复杂的重命名;
- 不要暴露文件上传后的路径;
这里只是上传,不会解析,所以连不了webshell
漏洞利用
客户端检测绕过
javascript检测
上传就会报错
文件后缀先改为png绕过,利用BurpSuite直接抓包改上传的后缀为php即可绕过前端检测
服务端验证绕过
MIME类型检测
点击开始上传才会报错
文件绕过方式跟客户端绕过差不多,BP直接改后缀就可以,不再演示
getimagesize()
点击开始上传才会报错
getimagesize()
会判断文件头,绕过需要在一句话脚本之前加上图片的文件头(比如png),或者直接写在png文件的后面
防御策略
针对文件上传漏洞的特点和必须具备的三个条件,我们阻断任何一个条件就可以达到组织文件上传攻击的目的:
- 将文件上传目录直接设置为不可执行
-
- 最有效
- 对于Linux而言,撒销其目录的
x
权限 - 实际中很多大型网站的上传应用都会放置在独立的存储上作为静态文件处理
- 方便使用缓存加速降低能耗
- 杜绝了脚本执行的可能性
- 文件类型检查
-
- 强烈推荐白名单方式,结合MIME Type、后缀检查等方式(即只允许允许的文件类型进行上传)
- 对于图片的处理可以使用压缩函数或
resize
函数,处理图片的同时破坏其包含的HTML代码
- 使用随机数改写文件名和文件路径,使得用户不能轻易访问自己上传的文件
- 单独设置文件服务器的域名