CSRF

CSRF全称Cross-site request forgery,即跨站请求伪造,也被称为“One Click Attack”,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用,举个最基本的例子,就是别人给你发了一个奇怪的链接,你点了之后虽然什么都没有输,但是自己的QQ号被盗取了,。即该攻击可以在受害者不知情的情况下以受害者名义伪造请求,执行恶意操作,具有比较大的危害性。

CSRF攻击的两个条件:

  1. 目标用户已经登录了网站,能够执行网站的功能
  2. 目标用户访问了攻击者构造的URL

CSRF黑盒判断的条件:

  1. 看验证来源是否一致
  2. 看凭据是否有token
  3. 看关键操作是否有进行验证

原理图如下所示:

1646264151502-462246ae-7945-482e-904e-26c1aa20452a.png

后台自动添加管理员

当我们处在管理员后台界面的时候,即已登录状态

image-20240813110518720

之后点了别人发过来的url链接,http://127.0.0.1:8081/web/add.html,访问这个地址,我们可以发现我们的管理界面被添加了一个新的管理用户

image-20240813110733548

其实原理就是这个链接所代表的就是添加用户的数据包,当触发后,会以自己的浏览器将这个数据包发出去,然后后端就会认为是管理员进行了增加用户的操作,进而添加了这个用户,那么如何构造相关的数据包呢?这里我们要用到的就是CSRFTester,首先我们先在自己本地搭建一个对应的应用,然后模拟增添用户的操作,如下所示

1646287809235-be0a0c46-e043-4200-8aba-1936705fff3c.png

这个时候我们在CSRFTester中点击start,该工具就会抓取我的数据包

1646287915691-0361a3cf-6b88-4738-b990-fc4777dc39ad.png

然后我们将这个数据包保存为forms表单,然后生成为html格式,放在网站根目录http://127.0.0.1:8081/web/add.html,然后在登录状态下去访问该网站,我们发现可以实现CSRF攻击

CSRF防护

  1. 看验证来源,也就是是否符合同源策略,看数据包的referer的值,确保数据包是从该网站上发出去的,而不是非法数据包,但是这个方法也很好绕过,因为如果修改referer的值,同源策略就失效了
  2. 看凭证是否带有token值,token值用来判断是不是同一个用户,每次操作一次就会更改一次token值,而且会在操作之前对比token值,token值可以有效地防御CSRF攻击

image-20240813140636374

这就是属于token不存在的情况,说明只要是这个用户就可以了,而下面这张图就说明了token存在

image-20240813140917130

  1. 看关键操作有无验证,关键验证就好比修改密码的时候会验证你的用户名和密码

SSRF

SSRF全程Server-Side Request Forgery,即服务器端请求伪造,是一种由攻击者构造形成由服务端发起请求的一个安全漏洞,一般情况下,SSRF攻击的目标是从外网无法访问的内部系统,正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统,SSRF形成的原因大部分都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制,其原理图如下所示

1646264163213-66a6b56a-7e56-4f5c-962f-7e1e864bb22a.png

SSRF可以被拿来做很多事,包括但不限于作为内网探针、读取服务器上的文件,比如我们请求地址为http://127.0.0.1:3306的时候,就是在探测其是否开放了数据库服务,以及可以获得数据库相关信息

1646292590568-78fba5f1-4001-41d2-91ba-ba56b36ede77.png

内网探针

由于内网地址的开头一般是固定的,例如192.168开头,所以我们可以利用bp的爆破模式对内网进行探测,如下所示

1646294799804-abddedf9-1ddf-4ecc-a27e-16d9e6ea6e20.png

1646294962499-66a65a50-1553-4020-98d8-bc3e6d81c85a.png

通过观察返回的数据包,我们可以判断其是否存在内网,以及内网IP地址是什么

接下来以CTFHUB上的题进行相关演示

image-20240813144044100

首先我们的题目告诉我们端口范围,所以我们直接进行脚本爆破

import requests

for i in range(8000,9001):
url = f'http://challenge-951d929ab79bf81a.sandbox.ctfhub.com:10800/?url=127.0.0.1:{i}'
res = requests.get(url)
print(i,res.text)

保存后直接运行,最后我们可以得到相关的结果,如下所示

image-20240813145059547

成功获取

文件读取

我们可以利用伪协议对服务器上的文件进行读取,例如:

file:///D:/www.txt
dict://127.0.0.1:3306/info
ftp://192.168.46.148:21

我们也以CTFHUB上的例题来进行演示,如下所示

image-20240813145208833

题目告诉我们要通过伪协议进行读取web目录下的flag.php,我们知道,web目录一般为var/www/html/flag.php,所以我们直接读取file:///var/www/html/flag.php

image-20240813145536404

同样,我们可以让服务器自己下载我们准备好的木马,然后进攻内网,这里也不再赘述