漏洞点总结 第1篇
Spring Data Commons远程命令执行(CVE-2018-1273),当用户在项目中利用了Spring-data的相关web特性对用户的输入参数进行自动匹配的时候,会将用户提交的form表单的key值作为Spel的执行内容而产生漏洞
Spring Data Commons - (Ingalls SR10) Spring Data REST - (Ingalls SR10) Spring Data Commons to (Kay SR5) Spring Data REST - (Kay SR5)
这里直接看补丁进行分析,这是一个spel表达式注入漏洞。补丁的内容如下:
补丁大致就是将StandardEvaluationContext替代为SimpleEvaluationContext,由于StandardEvaluationContext权限过大,可以执行任意代码,会被恶意用户利用。
SimpleEvaluationContext的权限则小的多,只支持一些map结构,通用的都已经不再支持。
首先进入CVE-2018-1273的docker环境
访问并用bp抓包
这里随便填一下Username跟Password
生成一个文件
用python起一个http服务,并构造payload下载文件保存在/tmp/目录下,名称为1
nc打开端口监听再构造payload进行命令执行即可收到反弹shell
漏洞点总结 第2篇
当Web应用向后台数据库传递SQL语句进行数据库操作时。如果对用户输入的参数没有经过严格的过滤处理,那么攻击者就可以构造特殊的SQL语句,直接输入数据库引擎执行,获取或 修改数据库中的数据。
把用户输入的数据当做代码来执行,违背了 “数据与代码分离”的原则。
SQL注入的两个关键点:
1、用户能控制输入的内容;
2、Web应用把用户输入的内容带入到数据库中执行;
(1)采用sql语句预编译和绑定变量 #{name}
其原因就是:采用了PrepareStatement,就会将SQL语句:“select id,name from user where id=?”预先编译好,也就是SQL引擎会预先进行语法分析,产生语法树,生成执行计划,也就是说,后面你输入的参数,无论你输入的是什么,都不会影响该SQL语句的语法结构了。因为语法分析已经完成了,而语法分析主要是分析SQL命令,比如:select、from、where、and、or、order by等等。
所以即使你后面输入了这些SQL命令,也不会被当成SQL命令来执行了,因为这些SQL命令的执行,必须先通过语法分析,生成执行计划,既然语法分析已经完成,已经预编译过了,那么后面输入的参数,是绝对不可能作为SQL命令来执行的,只会被当成字符串字面值参数。
(2)使用正则表达式过滤传入的参数
(3)过滤字符串,如insert、select、update、and、or等
漏洞点总结 第3篇
Spring Web Flow框架远程代码执行(CVE-2017-4971)漏洞,是由于Spring Web Flow的数据绑定问题带来的表达式注入,从而导致任意代码执行。
、Older unsupported versions are also affected
view对象处理用户事件,会根据HTTP参数绑定相应的model
如果model没有设置BinderConfiguration
, 则会调用addDefaultMappings
函数
进一步查看addDefaultMappings
函数,可以发现输入参数以fieldMarkerPrefix
(“_”)开头,则会调用addEmptyValueMapping
函数
若useSpringBeanBinding
参数设置为false
,则 expressionParser
将设置为SpelExpressionParser
对象的实例,而不是BeanWrapperExpressionParser
对象的实例。当调用getValueType
函数时,SpelExpressionParser
对象将执行表达式,触发任意代码执行
首先进入CVE-2017-4971的docker环境
这里列出了一些登录账户,这里随便使用一个登录即可
登录之后显示如下界面
漏洞点总结 第4篇
越权访问(Broken Access Control,简称BAC)是Web应用程序中一种常见的漏洞,由于其存在范围广、危害大,被OWASP列为Web应用十大安全隐患的第二名。
该漏洞是指应用在检查授权时存在纰漏,使得攻击者在获得低权限用户账户后,利用一些方式绕过权限检查,访问或者操作其他用户或者更高权限。越权漏洞的成因主要是因为开发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判定。越权访问漏洞主要分为水平越权访问和垂直越权访问
水平越权访问是一种“基于数据的访问控制”设计缺陷引起的漏洞。由于服务器端在接收到请求数据进行操作时没有判断数据的所属人/所属部门而导致的越权数据访问漏洞。
假设用户A和用户B属于同一角色,拥有相同的权限等级,他们能获取自己的私有数据(数据A和数据B),但如果系统只验证了能访问数据的角色,而没有对数据做细分或者校验,导致用户A能访问到用户B的数据(数据B),那么用户A访问数据B的这种行为就叫做水平越权访问。
垂直越权是一种“基于URL的访问控制”设计缺陷引起的漏洞,又叫做权限提升攻击。
由于后台应用没有做权限控制,或仅仅在菜单、按钮上做了权限控制,导致恶意用户只要猜测其他管理页面的URL或者敏感的参数信息,就可以访问或控制其他角色拥有的数据或页面,达到权限提升的目的。
漏洞点总结 第5篇
Spring-Data-REST-RCE(CVE-2017-8046),Spring Data REST
对PATCH方法处理不当,导致攻击者能够利用JSON数据造成RCE。本质还是因为spring的SPEL解析导致的RCE
Spring Data REST versions < , , RC3 Spring Boot version < Spring Data release trains < Kay-RC3
这里直接从补丁分析,从官方的描述来看就是就是Spring-data-rest服务处理PATCH请求不当,导致任意表达式执行从而导致的RCE。首先来看下补丁,主要是evaluateValueFromTarget添加了一个校验方法verifyPath,对于不合规格的path直接报异常退出,主要是(pathSource,type)实现,基本逻辑就是通过反射去验证该Field是否存在于bean中
进入CVE-2017-8046的docker环境
访问返回如下界面则存在漏洞
这里先对customers/1
这个页面bp抓包,还是通过bash反弹,通过处理后得到命令
因为这里执行的代码被编码为xxx制位于new (new byte[]{xxxxxx})中,所以需要对bash命令转成xxx制编码
使用python进行编码处理,在python中转xxx制的方法为_,_.join(map(str, (map(ord,_命令_))))
得到xxx制后放入bp包里面进行构造
构造后如图所示
发包即可得到反弹shell
漏洞点总结 第6篇
一般来说,函数的形参是指由外往内函数体传递变量的入口,但此处加了callback后则完全相反,它是指函数体在完成某种使命后调用外部函数的出口,也就是回头调用外部函数的意思;
链接如下:https://xxx/login?callback=https%3A%2F%
我们在挖漏洞的时候,着重关注关键的参数:id,callback,filename,uid等等
我们可以在这个页面搜索关键字来进行过滤;选出敏感的信息;
漏洞点总结 第7篇
Spring Messaging 命令执行漏洞(CVE-2018-1270),Spring框架中的 spring-messaging 模块提供了一种基于WebSocket的STOMP协议实现,STOMP消息代理在处理客户端消息时存在SpEL表达式注入漏洞,攻击者可以通过构造恶意的消息来实现远程代码执行。
Spring Framework - Spring Framework -
由expression
,getValue
,setValue
造成的代码执行,造成这种命令执行是由Spring的SPEL表达式造成的
SPEL命令执行有两种方式,一是静态方法,二是new 对象
再看一下spring-boot-messaging实现中的代码
那么一是可以利用()
得到selector的表达式,二是利用((context, ))
获取表达式的值,从而造成命令执行
进入CVE-2018-1270的docker漏洞环境
这里直接使用前辈们写好的exp,注意修改一下bash命令和靶机地址即可
首先还是bash编码
修改exp中的靶机ip和反弹命令
如图所示
运行即可得到反弹shell
漏洞点总结 第8篇
与个人习惯和安全意识相关,为了避免忘记密码,使用一个非常容易记住 的密码,或者是直接采用系统的默认密码等。
通过弱口令,攻击者可以进入后台修改资料,进入金融系统盗取钱财,进入OA系统可以获取企业内部资料,进入监控系统可以进行实时监控等等。
设置密码通常遵循以下原则:
(1)不使用空口令或系统缺省的口令,为典型的弱口令;
(2)口令长度不小于8 个字符;
(3)口令不应该为连续的某个字符(例如:AAAAAAAA)或重复某些字符的组合(例如:.)。
(4)口令应该为以下四类字符的组合:大写字母(A-Z)、小写字母(a-z)、数字(0-9)和特殊字符。每类字符至少包含一个。如果某类字符只 包含一个,那么该字符不应为首字符或尾字符。
(5)口令中不应包含特殊内容:如本人、父母、子女和配偶的姓名和出生日期、纪念日期、登录名、E-mail 地址等等与本人有关 的信息,以及字典中的单词。
(6)口令不应该为用数字或符号代替某些字母的单词。
(7)口令应该易记且可以快速输入,防止他人从你身后看到你的输入。
(8)至少90 天内更换一次口令,防止未被发现的入侵者继续使用该口令。
漏洞点总结 第9篇
防止XSS需要将不可信数据与动态的浏览器内容区分开。这可以通过如下步骤实现:
反序列化最严重可导致远程代码执行(RCE,Remote Code Execution),但最常见的反序列化安全问题却是通过修改序列化之后的数据字段,从而进行提权或越权操作。
注:用户登陆后,服务器将用户身份信息存储在浏览器cookie中
存储于cookie中的这份数据的格式是应用程序自定义的,但攻击者通过探索尝试后发现,修改其中的某个字段就能将用户从普通用户修改为管理员。
存储于cookie中的原始数据:
经过修改后的数据
由于缺乏对数据完整性的校验,服务器端在收到被修改过的这段数据后,就把当前用户当作ADMIN用户来处理了。
漏洞点总结 第10篇
Spring Security OAuth RCE(cve-2016-4977),是为Spring框架提供安全认证支持的一个模块,在7月5日其维护者发布了这样一个升级公告,主要说明在用户使用Whitelabel views
来处理错误时,攻击者在被授权的情况下可以通过构造恶意参数来远程执行命令。漏洞的发现者在10月13日公开了该漏洞的挖掘记录
这个漏洞的触发点也是对用户传的参数的递归解析,从而导致SpEL注入,可是两者的补丁方式大不相同。Springboot的修复方法是创建一个NonRecursive类,使解析函数不进行递归。而SpringSecurityOauth的修复方法则是在前缀${前生成一个六位的字符串,只有六位字符串与之相同才会对其作为表达式进行解析。然而如果请求足够多,这种补丁也是会失效的。
这里直接查看补丁情况
可以看到在第一次执行表达式之前程序将替换成了由RandomValueStringGenerator().generate()生成的随机字符串,也就是{errorSummary} -> random{errorSummary},但是这个替换不是递归的,所以
然后创建了一个helper
使程序取random{}
中的内容作为表达式,这样就使得errorSummary
被作为表达式执行了,而${2334-1}
因为不符合random{}
这个形式所以没有被当作表达式,从而也就没有办法被执行了。
不过这个Patch有一个缺点:RandomValueStringGenerator
生成的字符串虽然内容随机,但长度固定为6,所以存在暴力破解的可能性。
首先进入CVE-2016-4977的docker环境
访问url,输入admin/admin
出现以下界面则存在漏洞
使用github上找到的poc对传入值进行处理
这里我传入一个whoami,返回了一个payload