1、命令注入攻击
-
概念:指由于开发人员缺少安全意识,在开发Web应用时未对用户提交的数据进行合规性检查,导致攻击者能够将命令作为普通用户数据提交给服务器执行
-
命令攻击形式有以下三种:
-
系统命令注入攻击:利用Web应用程序的漏洞,绕过了Web应用本身,直接与Web应用宿主服务器的命令执行接口交互
-
关键
-
调用系统命令接口
-
输入参数可控
-
-
-
命令注入是调用操作系统命令Shell执行命令
-
ls -l;rm -rf
-
-
远程代码执行是调用服务器网站脚本解释器执行脚本代码
-
<?php phpinfo()?>
-
-
系统命令执行函数
-
在代码审计时要特别注意这些函数
-
安全设置
-
限制用户输入的长度,仅满足业务需要的最低要求
-
-
攻击者对策
-
命令组装
-
命令反转
-
命令续行 同样,在代码审计时要特别注意
-
2、外部实体注入攻击(XXE攻击)
-
概念:当Web应用程序解析XML输入时,如果没有禁止外部实体的使用,导致服务器可加载恶意外部文件和代码,就会产生外部实体注入漏洞,被攻击者利用发起网络攻击
-
实体概念:实体是对数据的引用;根据实体种类的不同,XML解析器将使用实体的替代文本或者外部文档的内容来替代实体引用,由此引入了内部实体和外部实体的概念
-
内部实体 也称为命名实体,在文档类型定义DTD或內部子集中声明
-
在xml文档解析过程中,实体引用将由它的替代值来表示
-
外部实体 调用外部文件所申明的实体,若实体有任何的修改,则直接在该文档中更新,无需修改引用处的脚本,使用方便
-
-
代码示例
-
-
<!ENTITY xxe SYSTEM "expect://id">]>
-
第三行定义了一个通用实体xxe,所示含义为红色代码expect://id,expect是php扩展协议,用于执行系统命令,这句话的含义是查看系统当前用户的标识
-
-
-
第十行通过&xxe;的方式引用了通用实体,将这段xml提交服务器后,服务器就会执行系统命令id,并返回当前用户的身份标识信息
-
-
3、反序列化漏洞
-
序列化:把对象转换成字节流,便于保存在内存、文件、数据库中,即将对象的状态信息转换为可以存储或传输的形式,将其当前状态写入到临时或持久性存储区
-
二进制序列化能保持类型的真实度
-
-
反序列化:即序列化的逆过程,将字节流还原成对象
-
反序列化漏洞原理
-
漏洞关键
-
重写readObject()方法时使用了不安全的系统命令执行函数
-
未限制用户提交参数
-
-
防御
-
应用程序没有严格审查用户提交数据从而导致命令执行参数失控
-
命令执行函数的不正确使用
-
可以从过滤用户输入和限制命令执行函数的使用来降低命令注入攻击成功的概率
-
-
系统命令注入攻击:采用验证用户数据、编码用户数据、预设命令白名单和替换安全执行函数等方法予以规避
-
外部实体注入漏洞实现命令注入攻击:禁用外部实体、过滤和验证用户提交的xml数据、禁止xml中包含任何自声明的文档类型定义
-
利用反序列化漏洞实现命令注入攻击:关闭RMI服务的公网端口、设置Serial Killer补丁、禁止JVM执行外部命令、在不影响业务的情况下删除InvokerTransformer.class文件、定期升级weblogic、apache、jboss。
-