计算机/网安 面试例题(六)
反序列化
00-序列化和反序列化
序列化:把内存中的对象以二进制的形式保存在文本中(输出流)反序列化:把文本中的对象读出来到内存中(输入流)反序列化用到的函数
序列化:serialize
反序列化:unserialize
01-常见反序列化的流量特征
像这种st2 045、068、shiro反序列化、fastjson这些java反序列化一类的流量特征
- shiro:看cookie中Rememberme字段,什么都要从这里传
- fastjson:可以在提交的包中找找json格式的数据,重点看一下有无rmi或者出网的一些行为,(在十六进制中会呈现ACED开头,这段不确定)
- st2-045:请求头中的Content-Type字段
02-log4j反序列化
该漏洞主要是由于日志在打印时当遇到`${`后,以:号作为分割,将表达式内容分割成两部分,前面一部分prefix,后面部分作为key,然后通过prefix去找对应的lookup,通过对应的lookup实例调用lookup方法,最后将key作为参数带入执行,引发
远程代码执行漏洞
核心原理为,在正常的log处理过程中对**${**这两个紧邻的字符做了检测,一旦匹配到类似于表达式结构的字符串就会触发替换机制,将表达式的内容替换为表达式解析后的内容,而不是表达式本身,从而导致攻击者构造符合要求的表达式供系统执行
日志在打印时当遇到${后,Interpolator类以:号作为分割,将表达式内容分割成两部分,前面部分作为 prefix,后面部分作为 key。然后通过prefix去找对应的 lookup,通过对应的lookup实例调用lookup方法,最后将key作为参数带入执行
03-Shiro反序列化漏洞
shiro提供记住密码功能,Payload产生的过程:命令=》序列化=》AES加密=》base64编码=》RememberMe Cookie值
影响版本
Apache Shiro < 1.2.4
特征判断
返回包中包含rememberMe=deleteMe字段。
第二种 直接发送原数据包,返回的数据中不存在关键字可以通过在发送数据包的cookie中增加字段:****rememberMe=然后查看返回数据包中是否存在关键字
利用
用生成的Payload,构造数据包,伪造cookie发送payload
SHIRO-550
shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值-->Base64解码-->AES解密-->反序列化AES的密钥是硬编码在代码里,就导致了反序列化的RCE漏洞
SHIRO-721反序列化漏洞
不需要key,利用Padding Oracle Attack构造出RememberMe字段后段的值结合合法的RememberMe cookie即可完成攻击
04-weblogic有几种漏洞
weblogic就好多了,基于T3协议的反序列化;基于xml解析时候造成的反序列化,还有ssrf,权限绕过等等
反序列化漏洞
Weblogic(及其他很多java服务器应用)在通信过程中传输数据对象,涉及到序列化和反序列化操 作,如果能找到某个类在反序列化过程中能执行某些奇怪的代码,就有可能通过控制这些代码达到RCE 的效果
常见的weblogic漏洞
1. #CVE-2016-0638 Weblogic 直接反序列化基于Weblogic t3协议引起远程代码执行的反序列化漏洞 漏洞实为CVE-2015-4852绕过 拜Oracle一直以来的黑名单修复方式所赐
2. #CVE-2016-3510 基于Weblogic t3协议引起远程代码执行的反序列化漏洞
3. #CVE-2017-3248 基于Weblogic t3协议引起远程代码执行的反序列化漏洞 属于Weblogic JRMP反序列化
4. #CVE-2018-2628 基于Weblogic t3协议引起远程代码执行的反序列化漏洞 属于 Weblogic JRMP反序列化
5. #CVE-2018-2893 基于Weblogic t3协议引起远程代码执行的反序列化漏洞 实为CVE-2018-2628绕过 同样拜Oracle一直以来的黑名单修复方式所赐 属于Weblogic JRMP反序列化
05-fastjson反序列化漏洞
正常请求是get请求并且没有请求体,可以通过构造错误的POST请求,即可查看在返回包中是否有fastjson这个字符串来判断
fastjson漏洞利用原理
在请求包里面中发送恶意的json格式payload,漏洞在处理json对象的时候,没有对@type字段进行过滤,从而导致攻击者可以传入恶意的TemplatesImpl类,而这个类有一个字段就是_bytecodes,有部分函数会根据这个_bytecodes生成java实
例,这就达到fastjson通过字段传入一个类,再通过这个类被生成时执行构造函数
无回显怎么办
1.一种是直接将命令执行结果写入到静态资源文件里,如html、js等,然后通过http访问就可以直接看到结果
2.通过dnslog进行数据外带,但如果无法执行dns请求就无法验证了
3.直接将命令执行结果回显到请求Poc的HTTP响应中
06-判断目标是否使用st2框架
一般st2开发的应用,会以.do\.action为结尾后缀,但是spingweb同样可以这样结尾来定义相关接口,所以通过在相关接口追加actionErrors参数,st2应用会触发报错
而spring的话,类似user.do/的访问和user.do的结果一样
st2-045这就是看Content-Type,这部分是达到命令执行的部分
07-redis未授权与权限获取
Redis默认情况下,会绑定在0.0.0.0:6379,这样将会将Redis服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下可
以利用Redis的相关方法,可以成功在Redis服务器上写入公钥,进而可以使用对应私钥直接登录目标服务器
条件
a、redis 服务以 root 账户运行
b、redis 无密码或弱密码进行认证
c、redis 监听在 0.0.0.0 公网上
方法
a、通过Redis的INFO命令,可以查看服务器相关的参数和敏感信息,为攻击者的后续渗透做铺垫
b、上传SSH公钥获得SSH登录权限
c、通过crontab反弹shell
d、slave主从模式利用
修复
密码验证
降权运行
限制 ip/修改端口
1.redis写入webshell
服务端的redis链接存在未授权,在攻击机上面能用redis-cli直接登录链接,并未登录验证
2.利用redis写入ssh公钥
服务端的redis连接存在未授权,在攻击机上面能用redis-cli直接登录链接 并未登录验证,服务端存在ssh目录并且有写入的权限
3.redis写入计划任务
这个方法只能在Centos上使用,Ubuntu上是行不通的
原因如下: 因为默认redis写文件后是644的权限,但ubuntu要求执行定时任务文 件/var/spool/cron/crontabs/<username>权限必须是600也就是-rw———-才会执行,否则会报 错(root) INSECURE MODE (mode 0600 expected),而Centos的定时任务文 件/var/spool/cron/<username>权限644也能执行因为redis保存RDB会存在乱码,在Ubuntu上 会报错,而在Centos上不会报错 然后由于系统的不同,crontrab定时文件位置也会不同
08-Memcache未授权访问
Memcached 是一套常用的 key-value 缓存系统,由于它本身没有权限控制模块,所以对公网开放的 Memcache服务很容易被攻击者扫描发现,攻击者通过命令交互可直接读Memcached中的敏感信 息。
利用
1、登录机器执行 netstat -an |more 命令查看端口监听情况。回显 0.0.0.0:11211 表示在所有网卡进行监听,存在 memcached 未授权访问漏洞。
2、telnet 11211,或 nc -vv 11211,提示连接成功表示漏洞存在
漏洞加固
a、设置 memchached 只允许本地访问
b、禁止外网访问 Memcached 11211 端口
c、编译时加上 –enable-sasl,启用 SASL 认证FFMPEG 本地文件读取漏洞
09-MongoDB未授权访问
开启 MongoDB 服务时不添加任何参数时,默认是没有权限验证的,而且可以远程访问数据库,登录的 用户可以通过默认端口无需密码对数据库进行增、删、改、查等任意高危操作。
防护
1.为MongoDB添加认证:
1)MongoDB 启动时添加–auth参数
2)给 MongoDB 添加用户:use admin
#使用admin库db.addUser(“root”, “123456”) #添加用户名root密码 123456的用户db.auth(“root”,“123456”) #验证下是否添加成功,返回1说明成功
2.禁用HTTP和REST端口
MongoDB自身带有一个HTTP服务和并支持REST接口。在2.6以后这些接口默认是关闭的。mongoDB默认会使用默认端口监听web服务,一般不需要通过 web 方式进行远程管理,建议禁用。修改配置文件或在启动的时候选择-nohttpinterface 参数 nohttpinterface=false
3、限制绑定IP启动时加入参数–bind_ip 127.0.0.1或在/etc/mongodb.conf 文件中添加以下内容:bind_ip = 127.0.0.1
10-Jenkins未授权访问
攻击者通过未授权访问进入脚本命令执行界面执行攻击指令 println "ifconfig -a".execute().text 执行一些系统命令,利用 wget 下载webshell
11-Java反序列化原理
(1)Java 序列化指 Java 对象转换为字节序列的过程
(2)Java 反序列化指字节序列恢复为 Java 对象的过程
(3) Commons-collections 爆出第一个漏洞开始,Java 反序列化漏洞的事件就层出不穷
(4)在 Java 中,利用 ObjectInputStream 的 readObject 方法进行对象读取(5)可以深入了解 ysoserial有哪些 gadgets
12-Docker 远程API漏洞
1-docker swarm 是一个将docker集群变成单一虚拟的docker host 工具,使用标准的DockerAPI,能够方便docker集群的管理和扩展,该未授权访问,可以通过url操作,执行docker命令。
2-通过docker client执行目标服务器容器命令,docker是以root权限运行的
一、有运行 ssh 服务,/root/.ssh 目录挂载到 container 内,,然后修改/.ssh/authorized_keys 文件,把自己的 public key 写进去
二、没有运行 ssh 服务,利用挂载写 crontab 定时任务,反弹一个 shell
13-Jboss反序列化漏洞
jboss的反序列化漏洞出现在jboss\server\all\deploy\httpha-invoker.sar\invoker.war\WEB-INF\classes\org\jboss\invocation\http\servlet目录下的ReadOnlyAccessFilter.class文件中的doFilter中。
程序获取http数据保存到了httpRequest中,序列化后保存到了ois中,然后没有进行过滤操作,直接 使用了readObject()进行了反序列化操作保存到了mi变量中,这其实就是一个典型的java反序列化漏洞
14.Python反序列化
Python 的序列化和反序列化是将一个类对象向字节流转化从而进行存储和传输,然后使用的时候再将字节流转化回原始的对象的一个过程,Python反序列化后产生的对象会在结束时触发__reduce__()函数从而触发恶意代码。
防御
1、用更高级的接口__getnewargs()、getstate()、setstate()等代替reduce()魔术方法
2、进行反序列化操作之前,进行严格的过滤,若采用的是pickle库可采用装饰器实现
15.PHP反序列化
php反序列化漏洞,又叫php对象注入漏洞 是因为程序对输入数据处理不当导致的。
php中有两个函数serialize() 和unserialize()。
反序列常见魔术函数
__sleep
在使用 serialize() 函数时,程序会检查类中是否存在一个 __sleep() 魔术方法。如果存在,则该方法会先被调用,然后再执行序列化操作。
__wakeup
在使用 unserialize() 时,会检查是否存在一个 __wakeup() 魔术方法。如果存在,则该方法会先被调用,预先准备对象需要的资源。
__toString()
方法用于定义一个类被当成字符串时该如何处理。
__invoke
当尝试以调用函数的方式调用一个对象时, __invoke() 方法会被自动调用。(本特性只在 PHP 5.3.0 及以上版本有效。)
__construct
具有 __construct 函数的类会在每次创建新对象时先调用此方法,适合在使用对象之前做一些初始化工作。
利用方式
1.__wakeup( )绕过 (CVE-2016-7124)
反序列化时,如果表示对象属性个数的值大于真实的属性个数时就会跳过__wakeup( )的执行。
影响版本:
- PHP before 5.6.25
- 7.x before 7.0.10
2.注入对象构造方法
3.Session反序列化漏洞
4.PHAR利用
欢迎打赏