Apache 文件解析漏洞 SSRF漏洞原理介绍及代码
1. Apache 环境简介
2. Apache 解析漏洞介绍
3. 解析漏洞利用演示
4.利用场景介绍
1. Apache 环境简介
Apache 和 PHP 采用 module 的方式结合(Apache2.2)
2. Apache解析漏洞介绍
Apache 认为一个文件夹可以拥有多个扩展名,哪怕没有文件名,也可以拥有多个扩展名。 Apache 认为应该从右边到左开始判断解析方法的。如果最右侧的拓展名为不可识别的,就继续向左判断,知道判断到文件名为止。
官方解释:http://httpd.apache.org/docs/current/mod/directive-dict.html
并不是 Apache 直接解析,而是 Apache 直接调用 PHP 进行解析。
3. 解析漏洞利用
在站点跟目录下新建一个 1.php.xxxx 文件, xxxx文件后缀名为无法识别的后缀名。其中内容为 phpinfo();
### 4.利用场景介绍
在 Web 程序中存在文件上传,但是有黑名单验证时,利用该解析漏洞可以上传对应的 Webshell 到目标服务器随后蚁剑连接
SSRF漏洞
1、SSRF 漏洞原理介绍
1.1、SSRF 漏洞定义
1.2、SSRF 漏洞原理
1.3、SSRF 漏洞代码分析
1.4、SSRF 漏洞利用
2、产生 SSRF 漏洞的代码
2.1、产生 SSRF 漏洞的 php 函数
2.2、file_get_contents
2.3、fsockpoen()
2.4、curl_exec()
1.1、SSRF 漏洞定义:
SSRF (服务器请求伪造)是一种构造请求,有服务端发起请求的安全漏洞。
1.2、SSRF 漏洞原理
SSRF 形成原因:服务端提供了从其他服务器获取数据的功能,但没有对内网目标地址做过滤与限制
主要方式:
1、 对外网、服务器所在内网、本地进行端口扫描,获取Banner信息
2、测试运行在内网或本地的应用程序
3、利用 file 协议读取本地文件等
1.3 SSRF 漏洞代码分析
存在 SSRF 漏洞代码
<?php
function curl($url){ ## curl函数用来发送请求 通过url来获取发送请求
$ch=curl_init(); ##利用curl库发送请求
curl_setopt($ch,CURLOPT_URL,$url); ##利用参数设置一个url地址
curl_setopt($ch,CURLOPT_HEADER,0); ## 将结果输出
curl_exec($ch); ##执行对应的访问
curl_close($ch); ##关闭创建的对象,释放对应的资源
}
$url=$_GET["url"]; ##通过GET函数,获取对应的目标地址
curl($url); ## 构造url进行内网访问
?>
1.4、SSRF漏洞利用
利用 SSRF 进行文件读取,
url=file:///..................................... #目录读取
2.1、产生 SSRF 漏洞的PHP函数
很多 Web 应用都提供了从其他的服务器上获取数据的功能。使用用户指定的 URL ,Web 应用可以获取图片,下载文件,读取文件内容等。这个功能如果被恶意使用,可以利用存在缺陷 Web 应用作为代理攻击远程和本地的服务器。这种形式的攻击称为服务器请求伪造攻击(Sever-side Request Forgery)。
SSRF 攻击可能存在任何语言编写的应用,下将展示可能存在 SSRF 漏洞的函数
file_get_content() fsockopen() curl_exec()
2.2、file_get_contents
使用 file_get_contents 函数从用户指定的 url 获取图片。然后把他用一个随机文件名保存在硬盘上,并展示给用户
<?php
if(isset($_POST['url'])) #获取用户提交的 url
{
$content=file_get_contents($_POST['url']); #使用 file_get_contents 获取远程url内容,保存concent中
$filename='./images/'.rand().';img1.jpg'; #使用filename新建.rand随机获取文件名保存在目录中
file_put_contents($filename,$content); #将concent内容写入到filename中
echo $_POST['url']; #测试输出 url
$img="<img src=\"".$filename."\"/>"; #使用img变量保存一个字符串,src设置文件类型
}
echo $img; #当前网页输出文件内容
?>
2.3、fsockopen()
使用 fsockopen 函数实现获取用户指定 url 的数据(文件或者 html)。这个函数会使用 socket 跟服务器建立 tcp连接,传输原始数据。
<?php
function GetFile($host,$port,$link) #定义了 ip,端口,位置
{
$fp=fsockopen($host,inval($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"; #创建一个 HTTP 请求
fwrite($fp,$out); #写到fsockopen中
$contents=''; #获取内容
while(!feof($fp)){ #当feof为true时 读取完毕
$contents.=fgets($fp,1024); #通过 fgets 每次获取1024个数据拼接
}
fclose($fp); #关闭套接字
return $contents; #返回主体内容
}
?>
2.4、curl_exec()
使用 curl 发送请求获取数据
<?php
if (isset($_POST['url'])) #获取用户提交的url
{
$link=$_POST['url']; #将提交内容存在link中
$curlobj=curl_init(); #初始化curl 设置它对应的选项
curl_setopt($curlobj,CURLOPT_POST,0); #不使用POST提交,使用GET提交
curl_setopt($curlobj,CURLOPT_RETURNTRANSFER,TURE);
#TRUE将curl_exec()获取的信息以字符串返回,而不是直接输出
$result=curl_exec($curlobj); #接收返回的字符串
curl_close($curlobj); #关闭初始化的curl选项
$filename='./curled'.rand().'.txt';
file_put_contents($filename,$result); #将接收到的字符串,存储到上创建的文件内
echo $result;
}
?>
SSRF漏洞的利用 - 内网资源探测
1、SSRF 漏洞代码分析
2、实验环境搭建
3、利用 SSRF 进行内网资源访问
4、利用 SSRF 进行端口扫描
1、SSRF 漏洞代码分析
分析下列代码的 SSRF 漏洞:
<?php
if (isset($_GET['url'])) #判断是否提交参数
{
$link=$_GET['url']; #赋值给link
$curlobj=curl_init($link);
curl_setopt($curlobj,CURLOPT_HEADER,0); #设置curl选项
curl_setopt($curlobj,CURLOPT_RETURNTRANSFER,1); #设置返回结果字符串
$result=curl_exec($curlobj); #返回result字符串
}
?>
3.3、使用SSEF进行内网资源访问
一般情况下将 Web 应用程序暴露在互联网可以通过 Web 浏览器进行访问。但是会将内网资源封闭起来,避免与外部接触。那么如果网站存在 SSRF 漏洞,利用 SSRF 进行内网资源访问。
对目标地址的302重定向,使用:
http://www.xxx.com/xxx.x?url=http://xxx.xxx.x.x/../../../
对相应内网进行访问
3.4、利用 SSRF 进行端口扫描
提交对应参数 url 包含 IP 地址:端口号,测试端口状态。
http://xxx.x.x.x/xxxx/xxx.x?url=http://xxx.x.x.x:(端口号)
21号端口:文件传输协议 - 控制端口
22号端口:SSH (Secure Shell)- 远程登录协议
23号端口:Telnet 终端仿真协议 - 未加密文本通信
25号端口:SMTP (简单邮件传输协议)
80号端口:超文本传输协议 - 用于传输网页
443号端口:超文本传输安全协议 - 超文本传输协议 over TLS/SSL (加密传输)
445号端口:SMB文件共享
3306号端口:MySQL 数据库系统
3389号端口:远程桌面协议(RDP)
21号端口:文件传输协议 - 控制端口
22号端口:SSH (Secure Shell)- 远程登录协议
23号端口:Telnet 终端仿真协议 - 未加密文本通信
25号端口:SMTP (简单邮件传输协议)
80号端口:超文本传输协议 - 用于传输网页
443号端口:超文本传输安全协议 - 超文本传输协议 over TLS/SSL (加密传输)
445号端口:SMB文件共享
3306号端口:MySQL 数据库系统
3389号端口:远程桌面协议(RDP)