1. 程式人生 > 實用技巧 >Apache Dubbo反序列化漏洞(CVE-2019-17564)復現分析

Apache Dubbo反序列化漏洞(CVE-2019-17564)復現分析

1、有理數類的設計

package number;

public class Rational {

	public int num;
	public int denom;

	public Rational(int num, int denom) {// 對有理數物件進行初始化
		
		this.num = num;
		this.denom = denom;
		
		if(num==0&&denom==-1) {//若分子為零則直接返回
			this.num=0;
			this.denom=-1;
			return;
		}

		if (denom == 0) {
			System.err.println("分母不得為零");
			return;
		}

		if (denom < 0) {// 將正負號設定到分子上
			this.num = -num;
			this.denom = -denom;
		}

		if (denom != 1) {// 若分母不為1則將分數化簡
			int a = Math.abs(num);
			int b = Math.abs(denom);
			int temp;
			if (a < b) { // 保證被除數大於除數
				temp = a;
				a = b;
				b = temp;
			}
			if (a % b != 0) {
				while (a % b != 0) { // 在餘數不為0時,進行迴圈
					temp = a % b;
					a = b;
					b = temp;
				}
			}
			this.num /= b;
			this.denom /= b;
		}
	}

	public void out() {// 輸出有理數物件
		System.out.println("(" + this.num + "," + this.denom + ")");
	}
	public Rational back() {
		return new Rational(0,1);
	}

	public Rational plus(Rational number) {// 加法運算
		int num = this.num * number.denom + number.num * this.denom;
		int denom = this.denom * number.denom;
		if(num==0)back();
		return new Rational(num, denom);
	}

	public Rational subtract(Rational number) {// 減法運算
		int num = this.num * number.denom - number.num * this.denom;
		int denom = this.denom * number.denom;
		if(num==0)back();
		return new Rational(num, denom);
	}

	public Rational multiply(Rational number) {// 乘法運算
		int num = this.num * number.num;
		int denom = this.denom * number.denom;
		if(num==0)back();
		return new Rational(num, denom);
	}

	public Rational divide(Rational number) {// 除法運算
		int num = this.num * number.denom;
		int denom = this.denom * number.num;
		if(num==0)back();
		return new Rational(num, denom);
	}
}

2、測試程式碼:

package test;

import number.Rational;

public class Test {
	public static void main(String[] args) {
		// 建立有理數物件
		Rational sc = new Rational(2, -8);
		Rational st = new Rational(-4, 8);
		sc.out();
		st.out();
		// 有理數的運算
		Rational sv = sc.plus(st);
		sv.out();
		sv = sc.subtract(st);
		sv.out();
		sv = sc.multiply(st);
		sv.out();
		sv = sc.divide(st);
		sv.out();
	}
}

4、嘗試描述怎麼與c語言的有理數程式碼相比較,為什麼你設計的類更加面向物件?

在函式的編寫、呼叫、類的例項化方面可以明顯看出java是通過物件這一概念來完成各種呼叫、生成和計算的。

5a、別人如何複用你的程式碼?

package包的匯入

5b、別人的程式碼是否依賴你的有理數類的屬性?當你的有理數類的屬性修改時,是否會影響他人呼叫你有理數類的程式碼?

依賴、有影響,包中類的屬性經確立後,使用該類的其他類就只能使用該類有且僅有的屬性和方法,不能對其修改。如屬性修改後,別人呼叫時可能要根據修改的內容增加或刪減引數才能實現呼叫

5c、有理數類的public方法是否設定合適?為什麼有的方法設定為private?

根據訪問許可權和修改許可權而定