0X00前言

参考了很多师傅的总结,会贴上出处,侵权必删,感谢师傅们QAQ

0X01概括

服务端请求伪造可以使用户在没有获得服务器所以权限时,通过构造恶意的请求到服务器造成攻击。

一般web程序中某些功能是以url为参数,比如一些加载图片,或着跳转。当url我们可以控制时,造成的危害就很多分为以下几点。

0X01-1分类

1.端口扫描

2.获取banner信息

3.攻击内网应用(例如redis)

4.读取文件

5.dos

暂时就先写这几个把

0X02利用姿势

本地利用和远程利用差不多就不分开写了。

dict协议

1.可以利用此协议查看一些服务的banner信息,例如ssh的banner信息

2.端口探测

3.对内网应用进行控制

dict://127.0.0.1:22/info //一般可以利用curl进行漏洞攻击

通过回显即可看到ssh的banner信息,但如果没有回显呢?

可以利用nc监听端口,反弹传输数据

3.可以像gopher一样getshell

但需要注意的是dict协议只能一步一步执行,而gopher一个url就可以全部执行。

file协议

文件读取,如果不可回显的话,那就没有什么用了

curl -v 'http://xxx/?url=file:///etc/passwd'
gopher协议

攻击内网服务并且反弹shell

  1. PHP的curl默认不跟随302跳转
  2. curl7.43上gopher协议存在%00截断的BUG,v7.49可用
  3. file_get_contents()的SSRF,gopher协议不能使用URLencode
  4. file_get_contents()的SSRF,gopher协议的302跳转有BUG会导致利用失败

http/https协议

探测内网主机存活以及探测内网服务。

SFTP
TFTP
ldap

漏洞函数

php:file_get_contents()fsockopen()curl_exec()fopen()readfile()

1.一般情况下PHP不会开启fopen的gopher wrapper
2.file_get_contents的gopher协议不能URL编码
3.file_get_contents关于Gopher的302跳转会出现bug,导致利用失败
4.curl/libcurl 7.43 上gopher协议存在bug(%00截断) 经测试7.49 可用
5.curl_exec() //默认不跟踪跳转,
6.file_get_contents() // file_get_contents支持php://input协议

bypass

ip改写

对于这种过滤我们采用改编IP的写法的方式进行绕过,例如192.168.0.1这个IP地址可以被改写成:

  • 8进制格式:0300.0250.0.1
  • 16进制格式:0xC0.0xA8.0.1
  • 10进制整数格式:3232235521
  • 16进制整数格式:0xC0A80001
  • 合并后两位:1.1.278 / 1.1.755
  • 合并后三位:1.278 / 1.755 / 3.14159267

另外IP中的每一位,各个进制可以混用。

访问改写后的IP地址时,Apache会报400 Bad Request,但Nginx、MySQL等其他服务仍能正常工作。

另外,0.0.0.0这个IP可以直接访问到本地,也通常被正则过滤遗漏。

使用解析到内网的域名

如果服务端没有先解析IP再过滤内网地址,我们就可以使用localhost等解析到内网的域名。

另外 xip.io 提供了一个方便的服务,这个网站的子域名会解析到对应的IP,例如192.168.0.1.xip.io,解析到192.168.0.1。

还有 xip.name

利用解析URL所出现的问题

在某些情况下,后端程序可能会对访问的URL进行解析,对解析出来的host地址进行过滤。这时候可能会出现对URL参数解析不当,导致可以绕过过滤。

比如 http://www.baidu.com@192.168.0.1/ 当后端程序通过不正确的正则表达式(比如将http之后到com为止的字符内容,也就是www.baidu.com,认为是访问请求的host地址时)对上述URL的内容进行解析的时候,很有可能会认为访问URL的host为www.baidu.com,而实际上这个URL所请求的内容都是192.168.0.1上的内容。

在对@解析域名中,不同的处理函数存在处理差异,如:
http://www.aaa.com@www.bbb.com@www.ccc.com
在PHP的parse_url中会识别www.ccc.com,而libcurl则识别为www.bbb.com

利用跳转

如果后端服务器在接收到参数后,正确的解析了URL的host,并且进行了过滤,我们这个时候可以使用跳转的方式来进行绕过。

可以使用如 http://httpbin.org/redirect-to?url=http://192.168.0.1 等服务跳转,但是由于URL中包含了192.168.0.1这种内网IP地址,可能会被正则表达式过滤掉,可以通过短地址的方式来绕过。

常用的跳转有302跳转和307跳转,区别在于307跳转会转发POST请求中的数据等,但是302跳转不会。

302跳转可以 在自己的vps写一个辅助脚本进行跳转

 

DNS Rebinding

一个常用的防护思路是:对于用户请求的URL参数,首先服务器端会对其进行DNS解析,然后对于DNS服务器返回的IP地址进行判断,如果在黑名单中,就禁止该次请求。

但是在整个过程中,第一次去请求DNS服务进行域名解析到第二次服务端去请求URL之间存在一个时间差,利用这个时间差,可以进行DNS重绑定攻击。

要完成DNS重绑定攻击,我们需要一个域名,并且将这个域名的解析指定到我们自己的DNS Server,在我们的可控的DNS Server上编写解析服务,设置TTL时间为0。这样就可以进行攻击了,完整的攻击流程为:

  • 服务器端获得URL参数,进行第一次DNS解析,获得了一个非内网的IP
  • 对于获得的IP进行判断,发现为非黑名单IP,则通过验证
  • 服务器端对于URL进行访问,由于DNS服务器设置的TTL为0,所以再次进行DNS解析,这一次DNS服务器返回的是内网地址。
  • 由于已经绕过验证,所以服务器端返回访问内网资源的结果。
利用IPv6

有些服务没有考虑IPv6的情况,但是内网又支持IPv6,则可以使用IPv6的本地IP如 [::] 0000::1 或IPv6的内网域名来绕过过滤。

http://[::]:80/  >>>  http://127.0.0.1
利用IDN

一些网络访问工具如Curl等是支持国际化域名(Internationalized Domain Name,IDN)的,国际化域名又称特殊字符域名,是指部分或完全使用特殊的文字或字母组成的互联网域名。

在这些字符中,部分字符会在访问时做一个等价转换,例如 ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ  example.com 等同。利用这种方式,可以用           等字符绕过内网限制。

利用短网址
站长工具短网址
百度短网址

http://tinyurl.com

参考

https://www.anquanke.com/post/id/145519#h2-20

https://xz.aliyun.com/t/7405#toc-4

https://joychou.org/web/phpssrf.html#directory0297179831691023473

http://blog.safebuff.com/2016/07/03/SSRF-Tips/

http://www.91ri.org/17111.html

https://docs.ioin.in/writeup/fuzz.wuyun.org/_src_build_your_ssrf_exp_autowork_pdf/index.pdf

案例分析

占坑


0 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注