CSRF与SSRF
首先来说一下这两个长得这么像的东西,分别是什么,它们有什么区别?
CSRF,全称为Cross-Site RequestForgery,也就是跨站请求伪造。
SSRF,全称为Server Side RequestForgery,也就是服务器端请求伪造。
XSS与CSRF
说到CSRF,不得不提一下XSS。从名字上来看,同为跨站攻击,XSS是跨站脚本攻击,CSRF是跨站请求伪造,也就是说,CSRF攻击本不是出自用户之手,而是经过第三方恶意攻击者的处理之后,伪装成了受信任用户的“亲历亲为”。
我们所能见到的大部分网站,都是通过cookie等方式记录、分辨出受信任用户的身份,再予以授权的。所以要伪造用户的正常操作,最好的方法是通过XSS或链接引导等途径,让用户在本机发起自己所不知道的危险请求,使得恶意攻击有机可乘,获取用户cookie等信息,以达到身份伪装目的。看到这里不知您是否有所明白,XSS是实现CSRF的诸多途径中的一条,但并不是唯一的一条。
CSRF与SSRF
从字面上来看,SSRF与CSRF不同的是,它是服务器端发出的请求伪造,而非从用户一端发出的。作为受信任用户,服务器当然不可能做出危害用户的事情。它是一种由攻击者构造形成的,由服务端发起请求的一个安全漏洞。因为它是由服务端发起的,所以它能够请求到与它相连但与外网隔离的内部系统。由于服务端提供了从其他服务器应用获取数据的功能(例如分享等功能)且没有对目标地址做过滤与限制,从而给予了攻击者乘虚而入的机会。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载资源等等。SSRF是利用存在缺陷的web应用作为代理,攻击远程和本地的服务器。
总结
总的来说,CSRF是服务器端没有对用户提交的数据进行严格的把控,导致攻击者可以利用用户的Cookie信息伪造用户请求发送至服务器。而SSRF是服务器对用户提供的可控URL地址过于信任,没有经过严格检测,导致攻击者可以以此为跳板攻击内网或其他服务器。
如何判断SSRF是否存在
首先要知道出现SSRF的函数基本就这几个file_get_contents()
、curl()
、fsocksopen()
、fopen()
,如果获取到源码了,发现源码中存在这些函数,那么大致就可以判断是否有SSRF存在。
如果没有获取到源码,SSRF的入口一般是出现在调用外部资源的地方,比如有个url参数让你传入,或者是在html的输入框中,你可以使用http://
、file://
、dict://
协议读取一下。
常见的SSRF探测内网的方法
脚本
# -*- coding: utf-8 -*-
import requests
import time
ports = ['80','6379','3306','8080','8000']
session = requests.Session();
for i in range(1, 255):
ip = '192.168.0.%d' % i #内网ip地址
for port in ports:
url = 'http://ip/?url=http://%s:%s' %(ip,port)
try:
res = session.get(url,timeout=3)
if len(res.text) != 0 : #这里长度根据实际情况改
print(ip,port,'is open')
except:
continue
print('Done')
这里的ports是指定一些端口,有的题目会给出端口范围,可以根据情况将ports改为range()表示的端口范围,同时也要把后面返回的长度len(res.text)更改一下。
burpsuite
使用burpsuite中的Intruder模块去爆破
nmap工具
nmap -sV ip
nmap -sV ip -p4000 //指定4000端口