一、SSRF简述
1️⃣、形成原因
原因大都是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,文档,等等。
2️⃣、原理
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF是要目标网站的内部系统。(因为他是从内部系统访问的,所有可以通过它攻击外网无法访问的内部系统,也就是把目标网站当中间人)
3️⃣、用途
①、可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息。
②、攻击运行在内网或本地的应用程序(比如溢出);
③、对内网web应用进行指纹识别,通过访问默认文件实现;
④、攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等);
⑤、利用file协议读取本地文件等。
4️⃣、如何挖SSRF漏洞
注释:所有调外部资源的参数都有可能存在ssrf漏洞。
①、分享:通过URL地址分享网页内容;
②、转码服务
③、在线翻译
④、图片加载与下载:通过URL地址加载或下载图片
⑤、图片、文章收藏功能
⑥、未公开的api【API(Application Programming Interface,应用程序接口)是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。 [1] 用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程,而又无需访问源码,或理解内部工作机制的细节】实现以及其他调用URL的功能
⑦、从URL关键字中寻找:share-----wap----url------link-----src-----source----target---u----3g----display---sourceURl-----imageURL----domain...
二、SSRF测试实验
1️⃣、SSRF(url)函数
①、遇到一个网址如果看到上述关键字中的内容,可以修改等号后面的东西进行测试
###②、 发现可以调用任意地址。借此可以去探测任意内网机器
③、也可以进行端口检测
2️⃣、SSRF(file_get_content)
①、可以读取本地PHP文件(php://filter/read=convert.base64-encode/resource=文件名)【读取文件】
读取出来的文件借助burp解密,格式选择base64;
3️⃣、使用bwapp进行ssrf实验
①、端口获取
②、使用XXE获取敏感文件中的内容
③、使用XXE进行内网sql注入
三、绕过(有时候程序员会把内网地址加入黑名单,此时我们就需要做些改变,)
1️⃣、更改IP地址写法《用十进制、八进制、十六进制代替》
2️⃣、利用解析url所出现的问题
在某些情况下,后端程序可能会对访问的URL进行解析,对解析出来的host地址进行过滤。这时候可能会出现对URL参数解析不当,导致可以绕过过滤。
http://www.oldboyedu.com@192.168.0.1/
四、防护
1️⃣、防护措施
(黑名单)
(1)过滤10.0.0.0/8 、172.16.0.0/12、192.168.0.0/16、localhost私有地址、IPv6地址
(2)过滤file:///、dict://、gopher://、ftp:// 危险schema
(3)对返回的内容进行识别
(4)内网服务开启鉴权(Memcached, Redis, Elasticsearch and MongoDB)
2️⃣、最佳防护
(1)使用地址白名单
(2)对返回内容进行识别
(3)需要使用互联网资源(比如贴吧使用网络图片)而无法使用白名单的情况:首先禁用 CURLOPT_FOLLOWLOCATION;然后通过域名获取目标ip,并过滤内部ip;最后识别返回的内容是否与假定内容一致
weblogic中间件只要有UUDI插件,就一定会存在SSRF漏洞
XXE原理利用防御
一、XXE介绍
1️⃣、原理:
运维人员使用了低版本php,libxml低于2.9.1就会造成XXE或者程序员设置了libxml_disable_entity_loader(FALSE);
2️⃣、定义:
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
3️⃣、DTD的基础知识
Document Type Definition 即文档类型定义,用来为XML文档定义语义约束。可以嵌入在XML文档中(内部声明),也可以独立的放在一个文件中(外部引用),由于其支持的数据类型有限,无法对元素或属性的内容进行详细规范,在可读性和可扩展性方面也比不上XML Schema。
参考链接: http://www.w3school.com.cn/dtd/index.asp
基本的PAYLOAD结构:
使用DTD实体的攻击方式 :
DTD 引用方式(简要了解):
1. DTD 内部声明
|||||||||||||||<!DOCTYPE 根元素 [元素声明]>
2. DTD 外部引用
3. 引用公共DTD
||||<!DOCTYPE 根元素名称 PUBLIC "DTD标识名" "公用DTD的URI">
4️⃣、如何找xxe漏洞
①、抓包看accept头是否接受xml
借助burp抓包
②、抓包修改数据类型,把json改成xml来传输数据
5️⃣、xxe攻击
①、有回显
自定义代码
②、无回显(需要用到dtd文件)
编码被解译之后
6️⃣、防御
①、提高PHP版本
②、若不能提升版本则在PHP中加上
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="php" cid="n106" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">libxml_disable_entity_loader(true);//为true拦截漏洞</pre>
③、Java下:(都加在配置文件下)
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="java" cid="n108" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
setFeature("http://xml.org/sax/features/external-general-entities",false)
setFeature("http://xml.org/sax/features/external-parameter-entities",false);</pre>
④、Python:
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="python" cid="n110" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))</pre>
⑤、手动黑名单过滤(不推荐)
过滤关键词:
<!DOCTYPE``、``<!ENTITY SYSTEM``、``PUBLIC