代码执行与命令执行

代码执行与命令注入

  • 0x01 代码执行
    • 1.eval
    • 2.assert
    • 3.call_user_func
    • 4.call_user_fuc_array
    • 5.create_function
    • 6.preg_replace
    • 7.array_map
    • 8.array_filter
    • 9.usort
    • 10.${}
  • 0x02 命令执行
    • 1.system
    • 2.exec
    • 3.passthru
    • 4.shell_exec
    • 5.反引号
    • 6.ob_start
  • 0x03 绕过
    • 1.常见分隔符
    • 2.绕过空格
    • 3.各类符号
    • 4.敏感字符绕过

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

内容引自:链接地址

0x01 代码执行

代码执行概念

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

执行方法

1.eval

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

2.assert

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

	

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

	

3.call_user_func

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

demo:

	

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

4.call_user_fuc_array

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

demo:

	

5.create_function

create_function():创建匿名函数

string create_function(string $args,string $code)

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

demo:

	

6.preg_replace

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

demo:

	

7.array_map

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

demo:

	

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

8.array_filter

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

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

demo:

	

9.usort

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

demo:

	

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

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

大致过程:

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

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

10.${}

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

demo:

	

代码执行例题
题目:

	

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

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

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

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

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

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

0x02 命令执行

命令执行概念

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

命令执行常见函数

1.system

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

demo:

	

2.exec

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

demo:

	

3.passthru

passthru:执行命令并输出

demo:

	

4.shell_exec

shell_exec:执行命令,但无回显

demo:

	

5.反引号

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

demo:

	

6.ob_start

ob_start:打开输出控制缓冲

demo:

	

0x03 绕过

1.常见分隔符

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

2.绕过空格

	•	$IFS
	•	<
	•	${IFS}
	•	$IFS$9
	•	%09

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

4.敏感字符绕过

变量绕过

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

base64编码绕过

	echo 'cat' | base64

未定义的初始化变量

	cat$b /etc/passwd

连接符

	cat /etc/pass’w’d

使用通配符:

如:

/???/?s --help

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

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

你可能感兴趣的:(杂谈)