漏洞学习
RCE漏洞——远程代码执行
1.形成原因
应用系统从设计上需要给用户提供指定的远程命令操作的接口,比如常见的路由器、防火墙、入侵检测等设备的web管理界面上一般会给用户提供一个ping操作的web界面。后台对该命令进行执行。
2.漏洞危害
-
获取服务器权限
-
获取敏感数据文件
-
写入恶意文件GETSHELL
-
植入木马病毒勒索软件等
3.实际漏洞
- CVE-2021-3177 python RCE漏洞
- CVE-2021-21972 VMware RCE漏洞
- CVE-2021-25646 Apache Druid RCE漏洞
- CNVD-2020-46552 深信服EDR
- 网康下一代防火墙RCE漏洞
4.php相关函数
system() //执行外部程序,并显示输出
exec() //通过shell环境命令,并且将完整的输出以字符串的方式返回
shell_exec()
pcntl_exec() //在当前进程空间执行指定程序
passthru() //执行外部程序并且显示原始输出
popen() //打开进程文件指针
proc_open() //执行一个命令,并且打开用来输入/输出的文件指针
-
代码code注入
eval() //将字符串code作为php代码执行 assert() //检查一个断言是否为false preg_replace() //执行一个正则表达式的搜索和替换 create_function() //创建一个匿名函数并且返回换数名称 call_user_func() call_user_func_array() usort() uasort()
5.windows命令拼接符号
&& 左边的命令执行成功,右边的才执行
& 简单的拼接
| 上一条命令的输出,作为下一条命令参数
|| 左边的命令执行失败,右边的才执行
6.Linux命令拼接符号
&& 左边的命令执行成功,右边的才执行
| 上一条命令的输出,作为下一条命令参数
|| 左边的命令执行失败,右边的才执行
; 没有任何逻辑关系的连接符
& 任务后台执行,与nohup命令功能差不多
7.实战技巧
关键字替换
空格 ${IFS}
flag f*** 通配符
cat more
;—— %0a回车 %0d换行 uml编码 在uml输入
例子: 127.0.0.1;cd flag_is_here;cat flag.php
playload: 127.0.0.1%0acd I F S f ∗ ∗ ∗ i s h e r e {IFS}f***_is_here%0amore IFSf∗∗∗ishere{IFS}flag.php
8.漏洞防御
- 开源框架,升级到最新版本
- 尽量不要使用命令执行的函数
- 如果必须使用,需要做白名单处理
- 用正则表达式对用户输入的内容进行处理
- 使用waf
反序列化漏洞
1.PHP类与对象
2.magic函数
PHP保留所有以__开头的方法名称。因此,除非覆盖PHP的行为,否则不建议使用此类方法名称。
对一个类的生命周期进行丰富的操作,例如类创建时、类销毁时等。
3.PHP序列化和反序列化
序列化(serialize):将一个对象字符化
反序列化(unserialize):将一串字符恢复成对象
反序列化:注意
- 如果转递的字符串不可以序列化,则返回FALSE
- 如果对象没有预定义,反序列化得到的对象是_PHP_Incomplete_Class
作用:1.传输对象
2.用作缓存(Cookie、Session)
反序列化与Magic函数
__wakeup
__unserialize 7.4.0)
如果类中同时定义了 unserialize()和 wakeup()两个魔术方法,则只有unserialize()方法会生效,wakeup()方法会被忽略。
其他序列化格式
- json字符串 json_encode
- xml字符串 wddx_serialize_value
- 二进制格式
- 字节数组
4.反序列化漏洞的出现
- unserialize函数的参数可控,比如通过GET请求传参(漏洞触发点)
- 脚本中定义了有Magic方法,方法里面有向php文件做读写数据或执行命令的操作,比如__destruct()、unlink()
- 操作的内容需要有对象中的成员变量的值,比如:filename
5.反序列化漏洞实例
CVE-2016-7124
当定义的成员变量数目大于实际的成员变量数目则跳过__wakeup()函数执行
6.typecho反序列化漏洞分析
CVE-2018-18753