PHP伪协议

伪协议,个人感觉就像是对数据流的一种处理方式合集,所有以数据流作为参数的函数都应该考虑是否能够使用伪协议

现在基本就能确定,有文件包含的地方,就特别应当考虑伪协议的各种妙用

关于伪协议中的过滤器真的是要赞下,如果可以使用过滤器的话,代码检测几乎是没有任何用处的,我们可以使用过滤器进行各种各样的字符串处理,鬼知道有多少种姿势。。。

伪协议可以分为以下几类:

  • 生成数据流 (上面两种在wamp 5.6php版本中都被禁用了)
    • php://input
    • data://text/plain;base64,base64编码字符串
  • 数据流过滤器(测试可以看到在5.6版本的php中还没有被禁用)
    • php://filter/convert.base64-encode/resource=xxx
    • php://filter/convert.base64-decode/resource=xxx
    • phar://
    • zip://
  • 远程文件访问
    • http://
    • ftp://
  • 本地文件访问
    • file:///

现在将逐一介绍这些伪协议以及其常用的应用场景


php://input

很常用的数据流构造器,将读取提交的数据作为数据流的输入,也就是post的部分

data://text/plain;base64,base编码字符串

很常用的数据流构造器,将读取后面base编码字符串后解码的数据作为数据流的输入

php://filter/convert.base64-[encode/decode]/resource=xxx

php://filter/convert.base64-encode/resource=

base64本来就有不少小trick,结合文件包含更是会有各种妙用,看下面这些:

  • 在引入resource所指的资源时,通过过滤器进行base64进行编码或解码通常用于获取文件数据时,将文件进行编码后传输

  • Ph师傅的文章中介绍到了这样一种很巧妙的场景,文件包含参数可控制,可上传内容为固定8种字符,于是首先使用可控制的文件包含结合php://filter读到源码,上传文件因为只能包含8种字符,可以使用base64的小trick经过n次编码将shell转换成只有8种字符的要求,然后文件包含shell中利用多次过滤器嵌套来实现多次base64解码,最终解析到shell

    php://filter/convert.base64-decode/resource=php://filter/convert.base64-decode/resource=.....

php://filter/[read/write]=string.[rot13/strip_tags/…..]/resource=xxx

过滤器里还支持用一些字符串处理函数进行过滤,这样选择的范围就更多了,但目前也就从p牛的博客里看到有这两个函数,其他的没有找到,strip_tags可以用来去掉字符串中的标签

注意这个过滤器是要分清read与write两个情景的,用错的话就不会产生相应的效果。在file_put_contents()中就要使用write才有过滤效果,在include(),file_get_contents()中就要使用read才有效

phar://archive.[zip/jpg/png…]/file.txt

经测试,其实可以将任意后缀名的文件(必须要有后缀名),只要是zip格式压缩的,都可以进行解压,因此上面可以改为phar://archive.abc/file.txt也可以运行

phar简直就是文件上传+文件包含场景中的神器:

如果文件上传后可以利用文件包含实现代码执行的话,文件上传中的后缀名过滤基本上一点用都没有了,我们其实可以上传任意后缀名的压缩文件,压缩文件里面包含着我们的任意文件,然后在文件包含的时候使用phar伪协议将我们的文件从压缩包里面提取出来

zip://archive.zip#file.txt

用处和phar是一样的,应用场景也一样,但是要注意 ‘#’ 书写的时候要编码为%23才行,因为url的#后面是默认不传输的

还有测试上,不知为什么,同样是5.6版本,在kali虚拟机上测试通过了,但在windows下就没有通过,也许是配置的问题

###