ssrf 过滤.php,SSRF技巧之如何绕过filter_var( )

101058

0x00 前言

前几天我读了两篇非常棒的论文:第一篇是发表在blackhat.com上的“A New Era of SSRF ”,讲述的是不同编程语言的SSRF问题;第二篇是由Positive Technology发表的一篇名为“PHP Wrapper” 的论文,它主要讲述的是如何以多种不同的方式使用PHP Wrapper来绕过过滤器以及受过滤的输入(您可以在结尾处找到这两个链接)。

在本文中,我将深入介绍一些SSRF技术,您可以使用这些技术攻击那些使用filter_var()或preg_match()等过滤器的PHP脚本,并且可以使用curl或file或file_get_contents()来获取HTTP内容。

101058

图1:对于抓娃娃机的一种典型的SSRF攻击

引用OWASP上的定义:

在服务器端请求伪造(SSRF)攻击中,攻击者可以利用服务器上的功能来读取或更新内网资源。 攻击者可以配置或更改与服务器上运行的代码有关的URL链接来读取或提交数据,此外,通过精心构造的URL,攻击者可以读取服务器配置,例如AWS元数据,连接到启用http数据库的内部服务器中抑或是对内部的非公开服务发起post请求。

0x01 PHP中易受攻击的代码

本文所有的实验代码都是基于PHP7.0.25完成的(或许当你读到这篇文章时,它已经过时了,但描述的技术细节和原理都是有效的)。

101058

图2:使用的PHP版本

以下是我用来测试的PHP脚本:

echo "Argument: ".$argv[1]."n";

// check if argument is a valid URL

if(filter_var($argv[1], FILTER_VALIDATE_URL)) {

// parse URL

$r = parse_url($argv[1]);

print_r($r);

// check if host ends with google.com

if(preg_match('/google.com$/', $r['host'])) {

// get page from URL

exec('curl -v -s "'.$r['host'].'"', $a);

print_r($a);

} else {

echo "Error: Host not allowed";

}

} else {

echo "Error: Invalid URL";

}

?>

如您所见,脚本从第一个参数中获取URL(可以是web应用中的post方式或者get方式),然后使用函数filter_var()来验证URL的格式。如果没问题,解析函数parse_url()会解析URL,再使用函数preg_match()用正则表达式来检查主机名是否以google.com结尾。

如果一切正常,脚本会通过curl发起一个http请求以获取目标网页内容,之后使用print_r()打印出响应主体。

0x02 预期行为

此PHP脚本只能接受针对google.com 主机名的请求,其余目标一律拒绝,不如让我们试一试:

http://google.com

101058

图3:尝试请求google.com页面

http://evil.com

101058

图4:尝试请求evil.com页面

截止目前,一切都很顺利。第一个针对google.com 的请求被接受,而第二个对evil.com的请求被拒绝。安全等级:1337+ 呵呵。

0x03 绕过URL验证和正则表达式

在上文我并不美观的代码中,正则表达用于检验请求主机名是否以google.com结尾。这似乎很难避免,但倘若你熟悉URI RFC语法,你应该明白分号和逗号可能是你利用远程主机上的ssrf的秘密武器。

许多URL方案中都有保留字符,保留字符都有特定含义。它们在URL的方案特定部分中的外观具有指定的语义。如果在一个方案中保留了与八位组相对应的字符,则该八位组必须被编码。除了字符“;”, “/”, “?”, “:”, “@”, “=” 和 “&” 被定义为保留字符,其余一律为不保留字符。

除了分层路径中的dot-segments之外,一般语法认为路径段不透明。 生成应用程序的URI通常使用段中允许的保留字符来分隔scheme-specific或者dereference-handler-specific子组件。 例如分号(“;”) 和等于(“=”) 保留字符通常用于分隔适用于该段的参数和参数值。 逗号(“,”) 保留字符通常用于类似目的。

例如,一个URI生产者可能使用一个段name;v=1.1来表示对“name”版本1.1的引用,而另一个可能使用诸如“name,1.1”的段来表示相同含义。参数类型可以由scheme-specific 语义来定义,但在大多数情况下,一个参数的语法是特定的URI引用算法的实现。

例如,若应用于主机evil.com;google.com可能会被curl 或者wget 解析成hostname: evil.com 和 querystring: google.com,不如来试一下:

http://evil.com;google.com

101058

图5:尝试用 ;google.com bypass 过滤器

函数filter_var()可以解析许多类型的 URL schema,从上面可以看出filter_var()拒绝以主机名和“HTTP”作为schema验证我请求的URL,但如果我把 schema从http:// 改成别的会怎样呢?

0://evil.com;google.com

101058

图6:过滤器被使用0代替HTTP bypass掉了

完美!成功绕过filter_var() 和preg_match(),但是curl依然请求不到evil.com页面。。。。为什么呢?不如来尝试下使用别的语法,尽量让;google.com不被解析成主机名的一部分,例如通过制定目标端口:

0://evil.com:80;google.com:80/

101058

图7:SSRF使curl对evil.com进行了请求而不是google.com

耶,我们看到curl已经开始连接evil.com,使用逗号代替分号会出现同样的情况 :

0://evil.com:80,google.com:80/

101058

图8:相同的SSRF不过此处使用逗号代替分号

0x04 对URL解析函数进行SSRF

parse_url()是用于解析一个 URL 并返回一个包含在 URL 中出现的各种组成部分关联数组的PHP函数。这个函数并不是要验证给定的URL,它只是将它分解成上面列出的部分。 部分网址也可以作为parse_url()的输入并被尽可能的正确解析。

在一个PHP脚本中去bypass一个用于将部分字符串转换为一个变量的的正则表达式是我们最喜欢研究的技术之一。这项工作是否成功最终将由Bash来认定。例如:

0://evil$google.com

101058

图9:使用“Bash中变量的语法”来绕过过滤器并利用SSRF

使用这种方式,我让bash将$google分析为一个空变量,并且使用curl请求了evil .com。 这是不是很酷?:)

然而这只发生在curl语法中。 实际上,正如上面的屏幕截图所示,由parse_url()解析的主机名仍然是 evil$google.com。 $ google变量并没有被解释。 只有当使用了exec()函数而且脚本又使用$r[‘host’]来创建一个curl HTTP请求时,Bash才会将其转换为一个空变量。

显然,这个工作只是为了防止PHP脚本使用exec()或system()函数来调用像curl,wget之类的系统命令。

0x05 win环境中data:// 之于XSS

另一个使用file_get_contents()代替PHP使用system()或exec()调用curl的例子:

echo "Argument: ".$argv[1]."n";

// check if argument is a valid URL

if(filter_var($argv[1], FILTER_VALIDATE_URL)) {

// parse URL

$r = parse_url($argv[1]);

print_r($r);

// check if host ends with google.com

if(preg_match('/google.com$/', $r['host'])) {

// get page from URL

$a = file_get_contents($argv[1]);

echo($a);

} else {

echo "Error: Host not allowed";

}

} else {

echo "Error: Invalid URL";

}

?>

正如你所见,file_get_contents()在使用之前描述的相同技术验证之后使用了原始参数变量。 让我们尝试通过注入一些文本来修改响应主体,如“I Love PHP”:

data://text/plain;base64,SSBsb3ZlIFBIUAo=google.com

101058

图10:尝试控制响应主体

parse_url()不允许将文本设置为请求主机,并且它返回了“not allowed host”正确拒绝解析。不要绝望! 有一件事我们可以做,我们可以尝试将某些东西“注入”URI的MIME类型部分……因为在这种情况下,PHP不关心MIME类型…也是,又有谁在乎呢?

data://google.com/plain;base64,SSBsb3ZlIFBIUAo=

101058

图11:向响应体注入 “I love PHP”

接下来进行XSS攻击便是小菜一碟了…

data://text.google.com/plain;base64,<...b64...>

101058

图12:使用之前描述的技术进行简单的XSS

以上便是全部,感谢观看!

0x06 Links

Positive Technologies: “PHP Wrappers” http://bit.ly/2lXk1e8

Orange Tsai: “A new era of SSRF” http://ubm.io/2FdUu9F

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何用notepad写php,notepad新手怎么使用

新手使用notepad的几个小技巧&#xff1a;一、软件始终置于屏幕最前方有时候我们在运行程序时&#xff0c;需要将notepad放置到屏幕最前方&#xff0c;此时只需要在工具栏中点击&#xff1a;view——always on tops&#xff1b;此时notepad就会一直处于屏幕最前方。注&#xff…

双网卡主机配置oracle监听,VirtualBox设置双网卡实现虚机上网及主宿机互访

VirtualBox 虚拟机之间互连、主宿机互连、以及主宿机连接互联网的功能非常实用。下面介绍实现主宿机通过虚拟网卡互连方式。1 全局配置VirtualBox安装完成后&#xff0c;会在系统中装一块虚拟网卡&#xff0c;我们在 管理> 全局设定中可以看到。这块网卡是在 Host-Only 连接…

linux无filelength函数,Linux Shell 自定义函数(定义、返回值、变量作用域)介绍

定义Shell函数(define function) 语法&#xff1a;[ function ] funname [()]{action;[return int;]}说明&#xff1a;可以带function fun() 定义&#xff0c;也可以直接fun() 定义,不带任何参数。参数返回&#xff0c;可以显示加&#xff1a;return 返回&#xff0c;如果不加&…

linux ssh登录历史,Linux中的SSH登录

在Linux系统中需要使用SSH远程登录到另一个Linux系统&#xff0c;可以使用SSH命令加用户和IP地址的方法。ssh命令用于远程登录上的Linux主机。常用格式&#xff1a;ssh [-l login_name] [ –p port] [userhostname]例如不指定用户&#xff1a;ssh 192.168.0.100指定用户&#x…

linux监控电脑配置,Zabbix基本配置及监控主机

监控主机一版需要在被监控的主机上安装Zabbix Agent监控主机安装zabbix-agent首先需要在被监控的主机上安装agent&#xff0c;可以下载预编译好的RPM进行安装&#xff0c;下载地址&#xff1a;http://www.zabbix.com/download也可以源码安装&#xff0c;类似server的安装&#…

linux内网安装git,一键安装GitLab7在RHEL6.4上

&#xff11; 关于gitlab7无论如何gitlab是个好东西&#xff0c;但是极难安装和配置。bitnami(https://bitnami.com/)的一键安装包虽然可以解决大问题&#xff0c;但是仍有很多人无法配置gitlabnginx和email发送等等问题。今天特意完整地再梳理一次。对各位读者的问题不再逐一…

linux显示点阵字体,Fedora 17中文字体显示点阵状的解决方法

在Fedora 17中文字体的显示变成点阵状了&#xff0c;为什么在Fedora 16下中文字体是文泉驿正黑。到Fedora 17之后&#xff0c;中文字体由文泉驿正黑(WenQuanYi Zen Hei)变为WenQuanYi Zen Hei Sharp。这个新字体的特殊之处就是在12磅及以下的中文字体&#xff0c;将显示成点阵字…

c语言打印空心矩形图案的程序,C语言之输出空心棱形图案

#include#includevoid main(){int n,j,i; /*i为行数,j为每行中的项数*/printf("输入图案上三角的高度n:");scanf("%d",&n);;i < n;i) /*打印上三角&#xff0c;(包括中间行)*/{;j < n - i;j){-i || j n - - i * i )printf(" *");el…

c语言优化冒泡法,C语言:冒泡法排序一组数,如何优化?

#define _CRT_SECURE_NO_WARNINGS 1#include#includeint main(){int arr[] { 5, 6, 7, 8, 9 ,1, 2, 3, 4};int i 0;int j 0;int flag;int size sizeof(arr) / sizeof(arr[0]);for (i 0; i < size- 1 ; i){flag 1;//设置标志位&#xff0c;优化冒泡for (j 0; j < s…

android 分享到豆瓣,Android项目总结之社会化分享

随着现在社交网络的日益繁多&#xff0c;众多的社交客户端已占据了人们的大量时间&#xff0c;所以在我们的应用中具有一键分享的功能对提高我们产品的知名度有很大的帮助。新浪微博、腾讯微博、腾讯QQ、微信、QQ空间、豆瓣等众多知名社交站点&#xff0c;都是我们可以分享的去…

android实现自动横竖屏切换,android 中实现横竖屏切换【原创】

我们在使用android手机的时候&#xff0c;发现一些应用有横竖屏切换的功能&#xff0c;一般实现有以下几种方法&#xff1a;一、设置1.通过XML设置横竖屏切换在项目的 AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation属性&#xff0c;它有以下几个…

超级管理器Android,超级文件管理器app

详情超级文件管理器app&#xff0c;一款帮助你管理手机内存的软件&#xff0c;还可以重命名&#xff0c;移动&#xff0c;删除文件&#xff0c;在Android平台上完美运行&#xff0c;并能够与其他OI系列软件结合使用! 能快速地查找到目标文件&#xff0c;十分方便用户管理自己手…

android miui ios,从iOS到Android——小米11及小米生态实际使用体验

从iOS到Android——小米11及小米生态实际使用体验2021-02-22 15:29:5693点赞155收藏131评论创作立场声明&#xff1a;文中的设备均为自购&#xff0c;无任何特定立场。2021年2月10日&#xff0c;我的iPhoneX手机突然黑屏&#xff0c;拿到Apple Store检测&#xff0c;经诊断是屏…

p50会搭载鸿蒙吗,华为Mate40和华为P50也会搭载鸿蒙,华为Mate30跌至白菜价让路

原标题&#xff1a;华为Mate40和华为P50也会搭载鸿蒙&#xff0c;华为Mate30跌至白菜价让路华为Mate40和华为P50也会搭载鸿蒙&#xff0c;华为Mate30跌至白菜价让路&#xff01;华为P50Pro的机身部分后置摄像头模块的外观有发生了改变&#xff0c;可以看到华为P50Pro并没有将所…

linux将db2账户添加到组_超实用的shell脚本--Linux安全加固设置,值得收藏

概述近几年来Internet变得更加不安全了。网络的通信量日益加大&#xff0c;越来越多的重要交易正在通过网络完成&#xff0c;与此同时数据被损坏、截取和修改的风险也在增加。 只要有值得偷窃的东西就会有想办法窃取它的人。Internet的今天比过去任何时候都更真实地体现出这一点…

迷你世界无人驾驶地铁火车_出口伊斯坦布尔地铁列车“云下线”

轨道世界 RailWorld开放&#xff5c;共享&#xff5c;价值导读 ID&#xff1a;RailWorld出口伊斯坦布尔地铁列车“云下线”全自动无人驾驶&#xff0c;全寿命远程跟踪、诊断和维护&#xff0c;全车内循环感应系统&#xff0c;极具土耳其风情的外观及内饰……7月14日&#xff0c…

java: 程序包com.github.pagehelper不存在_Rust语言正在兴起,Java、Python、C的末日来临?...

您可能从未用Mozilla创建的开源&#xff0c;系统级编程语言Rust编写任何东西&#xff0c;但是您可能会在某个时候写。在Stack Overflow的2019年开发人员调查中&#xff0c;开发人员将Rust评为“最受欢迎的”语言&#xff0c;而Redmonk在半年的语言排名中&#xff0c;Rust 跻身前…

惠安七号机器人创意园_我是F518创意园,请为我投票!

春去秋来&#xff0c;一个轮回又一年。“ 你知道F518创意园开园多久了吗&#xff1f;对的&#xff0c;13年&#xff01;”作为深圳实施“腾笼换鸟”首批项目和深圳申请联合国科教文组织“设计之都”重要组成部分&#xff0c;我们开园至今已经13年了&#xff01;白驹过隙&#x…

c++ 获取文件夹创建时间_手把手教学免费创建个人网站

点击蓝字关注我们可以不成材 不能不成长&#xff01;给大家分享一个非常有用的skill——在GitHub上免费创建个人网站。什么是GitHubGitHub是一个面向开源及私有软件项目的托管平台&#xff0c;因为只支持git 作为唯一的版本库格式进行托管&#xff0c;故名GitHub。在GitHub上…

量子计算机通用程序,基于拓扑量子纠错码的量子计算机,量子计算机程序具有通用性?...

不管量子计算机的内部是由什么组成&#xff0c;量子计算机的快速计算都可以归结为应用于量子比特的简单指令序列&#xff0c;即量子计算机内部的基本信息单位。无论这台计算机是由离子链、超导体结还是硅片组成&#xff0c;事实证明&#xff0c;一次只影响一个或两个量子比特的…