什么是php伪协议?

1.打开网站,审计,第一个if可以用php://input 或者 data://伪协议绕过,php伪协议分析可看:


4.解码,代码很简单,一个替换,一个遍历,一个代码执行:
5.这里看替换的时候,我脑子短路了下,正则里面/i 是忽略大小写,/e是什么鬼?查了一下发现没有,才想起来preg_replace的/e模式下有代码执行漏洞。

but这里的第二个参数是固定了的,怎么利用?

6.第二个参数既然写成这么特殊的样子,应该是有作用的,查资料发现,\1表示取出正则匹配后的第一个子匹配中的第一项,

看例子:第一次匹配是['1,‘2’],第二次是[‘3’,‘a’],第三次是[‘b’,‘c’],然后下面输出的分别是1,3,b,都是每次匹配的第一项。

7.那么我们就要保证第一个匹配是我们想要执行的东西,那我就传进去phpinfo(),正则我可以填 .* 或者 \S+(大写S,小写s是匹配空白符),因为php里会把参数名里的特殊字符转为下划线“_”,那么我们就可以用第二种,+号在url中的时候记得编码为%2b,不然会认为是空格。

发现还是不能执行,这是为啥?

我在自己环境下面尝试了一遍(因为我的是php7.4版本,没办法用preg_replace函数执行代码):

那应该是strtolower函数的原因了,原因不明= =。

8.然后还是要看WP啊,用到的性质1:

在php中,双引号里面如果包含有变量,php解释器会进行解析;单引号中的变量不会被处理。

就是我们变量覆盖漏洞中常见的可变变量,官方解释:
,因为要避免歧义,除了$$a这样子,还可以${$a}这样子。

10.两条特性结合起来,我们本地测试一下:(又学到一条审计小技巧,preg_replace:“这次的代码执行雨我无瓜,这锅我不背”)

我们可以看到,\1就是被双引号包围起来的,我们传:


发现也可以直接执行eval命令:

11.尝试直接拿flag,好吧好吧,我觉得这里是因为单双引号冲突了:
我在本地测试(先在php.ini里面修改disable_function,把system删掉,记得重启一下),发现是可以的,那肯定就是单双引号冲突了:
调用getFlag函数并传参:

总结:我并不是赛棍,但是觉得做CTF总能学到新知识,说不好审计的时候,就发现哪个开发用了呢?这次在自己本地测试时间用的比较多,不过很多地方也是弄的比较清楚了,每次都要做好几个小时= =。

}

本文章向大家介绍BUUCTF_WEB_,主要包括BUUCTF_WEB_使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

考点:php伪协议、文件包含



}

· 关注我不会让你失望


php伪协议事实上就是支持的协议与封装协议,一共有12种。
常见的伪协议有:1、http://——访问HTTP(s)网址;2、file://——访问本地文件系统。

你对这个回答的评价是?


你对这个回答的评价是?

下载百度知道APP,抢鲜体验

使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。

}

我要回帖

更多关于 伪类型是什么?PHP中有哪些伪类型 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信