web安全学习笔记(17)

记一下第29-30节课的内容。任意文件下载/读取漏洞;CSRF漏洞的挖掘与防护

一、任意文件下载/读取漏洞

这节课用的靶场www.9001.zcbug.com

从菜鸟教程复制一段php文件下载的代码实现供参考:

<?php
 
$filename = $_GET['filename'];
 
// 修改这一行设置你的文件下载目录
$download_path = "ficheros/";
 
// 不能下载上一层目录的文件
if(eregi("\.\.", $filename)) die("抱歉,你不能下载该文件!");
$file = str_replace("..", "", $filename);
 
// 包含 .ht 的文件不能下载
if(eregi("\.ht.+", $filename)) die("抱歉,你不能下载该文件!");
 
// 创建文件下载路径
$file = "$download_path$file";
 
// 判断文件是否存在
if(!file_exists($file)) die("抱歉,文件不存在!");
 
//  文件类型,作为头部发送给浏览器
$type = filetype($file);
 
// 获取时间和日期
$today = date("F j, Y, g:i a");
$time = time();
 
// 发送文件头部
header("Content-type: $type");
header("Content-Disposition: attachment;filename=$filename");
header("Content-Transfer-Encoding: binary");
header('Pragma: no-cache');
header('Expires: 0');
// 发送文件内容
set_time_limit(0);
readfile($file);
 
?>

文件下载/读取漏洞一般存在于点击下载、访问文件/图片这些地方,可以在下载文件时直接进行抓包,看看是否存在这样的漏洞。

根据黑鬼的演示,在网站目录下新建了一个File目录,里面放了个1.txt,内容是1111111,然后在user.ini文件中设置白名单,通过抓包的方式,就可以抓出来文件的内容:

下面讲解任意文件读取漏洞:

我们可以通过修改目录的方式,达到直接读取某些文件的目的:

可以看到,这里直接读出来了index.php的内容,我们顺藤摸瓜,还可以查看它包含的inc.php和safe.php文件,然后再继续查看,甚至可以找到数据库的账号密码:

而拿到数据库账号密码之后,如果这个站有phpMyAdmin或者Adminer,就可以直接登录数据库,非常nb:

我们可以使用dirsearch这个工具,来实现网站敏感目录的扫描,它可以进行目录爆破,帮助我们很快地找到我们想要的目录。dirsearch的安装(非常详细)和使用-CSDN博客

我们可以总结出该漏洞的危害:

①读取源码,源码泄露

②数据库连接信息泄露

二、CSRF漏洞(跨站请求伪造)的挖掘与防护

CSRF,简单的说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己以前认证过的站点并运行一些操作(如发邮件,发消息,甚至财产操作(如转账和购买商品))。因为浏览器之前认证过,所以被访问的站点会觉得这是真正的用户操作而去运行。

1.漏洞类型

主要有两种:①写入型;②读取型

2.漏洞实现原理

根据黑鬼的演示,在靶场的管理员界面添加一个管理员账号操作,然后抓包,发送到repeater:

然后右键,相关工具(Engagement tools),生成CSRF PoC:

在打开的界面中,将CSRF HTML中的内容随便复制到一个文本文件里,并将其后缀改为.html:

当我们打开这个html文件时,会有一个Submit request按钮:

点击这个按钮,那么我们的burp就会自动向这个靶场发送一个添加管理员的请求,我们可以开启拦截来看一下:

这就是CSRF漏洞。

CSRF漏洞想要实现,有以下利用前提

①用户必须处于登录状态

假设我们是管理员,我们在登录状态下,不小心点击了黑客给我们发送的页面链接(就是刚才我们复制的CSRF HTML中内容对应的网站),就会直接导致管理员添加成功:

而此外,我们也可以修改代码,使其通过js的方式自动提交表单

请思考,这样应该如何实现?

我们可以把html文件修改为如上内容,这是利用了浏览器特性,图中框出来的script和link资源,都会被浏览器自动加载,我们把数据包的内容传入其中,就会被浏览器自动加载,从而实现自动的添加一个管理员,这是非常危险的。

甚至如果我们使用script标签(这样就不会有任何提示),然后再写一个iframe标签(作用是打开某个页面),会非常有迷惑性,无感知地在后台添加一个管理员:

②必须知道后端接收的参数名称

这是因为,我们想提交数据包,都是“参数名=值”这样的形式提交的,如果不知道参数名的话,那也就无法提交正确的数据包。那么我们该如何去获取参数名呢?有以下的思路供参考:

会员前台:通过抓取会员前台中的数据包,有时可以获取到一些参数的名称。

开源的CMS:如果网站使用了开源的程序搭建,我们只需要下载一份同样的源码,通过查看源码来获取参数的名称

3.CSRF攻击特征

①POST类型CSRF攻击以及GET类型都无来源

②POST或者GET形式的CSRF的REFERER来源地址不是被请求后端域名

4.修复方案

①token修复:当我们打开添加管理员的页面时,给予一个token,当我们提交添加管理员的请求时,要带有相应的token,如果提交的请求没有token,或者该token与session中的token是不一致的,那么这就不是安全的请求,直接过滤掉。

②判断来源host地址:先获取请求的referer地址,然后判断当前域名与referer中的域名进行对比,若不相同,说明不是安全的请求,直接过滤掉。

思考:如何实现js自动提交form表单;修复通过token验证防护CSRF攻击;通过判断来源host验证防护CSRF攻击

  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值