1. 程式人生 > >【44】WEB安全學習----JAVA基礎一

【44】WEB安全學習----JAVA基礎一

前言:

為什麼做滲透測試需要學習JAVA?自己的見解:

1、目前國內大中型企業專案多數採用JAVAEE開發,而在日常安全服務工作中,百分之八十的專案也是JAVA所開發,所以需要學習JAVA(達到會分析會寫,而不是之前學習PHP那樣會分析就行,因為PHP的特性,所以用來打CTF的挺多)。

2、JAVA相關安全工具也挺多(如burp、owasp組織開發的相關工具),可以用JAVA來編寫日常安全工具(當然後期也會學習Python,至於選擇誰?個人取決於環境及效率)。

3、能夠深入瞭解目前主流漏洞,如stuts2相關漏洞(相比較thinkphp框架應該很少人分析吧),同時也能接觸相關web環境如:tomcat、weblogic的安全漏洞。

4、也是為啥學習JAVA的重要原因之一,後期會接觸APP的逆向分析(安卓開發)。

所以短期目標主要以學習JAVA為主。

 

JAVA基礎:

java發展歷史省略......

目前JAVA發展方向:

1、JAVA標準開發(J2SE、JAVA SE):提供了系統底層的支援,實現了桌面程式開發;

2、JAVA嵌入式開發(J2ME、JAVA ME):目前主要是安卓的開發(谷歌自己也提供了安卓官方開發語言:kotlin);

3、JAVA企業開發(J2EE、JAVA EE):目前主要是網際網路開發;

JAVA特點:

1、是一個行業內通用的技術實現標準

2、是一門面向物件的程式語言

3、提供了自動垃圾回收機制

4、使用引用來代替指標處理

5、是為數不多的支援正真的多執行緒技術

6、跨平臺(和python類似)

JAVA是半編譯半解釋的語言:

編譯命令:javac.exe

解釋命令:java.exe

編譯及解釋過程:*.java =編譯> *.class(位元組碼) => JVM執行

JDK:即JAVA開發環境,目前JDK版本為1.10,但企業中用的較多的為1.8,傳統企業為1.6

JDK環境配置省略。

第一個JAVA程式:

注意:public 類名與檔名一致(類名首字母大寫),一個.java檔案裡只能有一個public class類,但可以有多個class類。

class A{}
class B{}
public class Text{
	public static void main(String[] args){
		System.out.println("hello word!");
	}
}

通過javac Text.java命令編譯後,一個類會生成一個.class檔案

通過java 類名命令執行.class檔案(這裡不需要帶檔案字尾)

jshell:在JDK1.9以後,JAVA也提供了互動式命令環境jshell,和python類似。

CLASSPATH屬性作用:是由JRE提供,用於定義JAVA程式解釋類時載入路徑,預設為.當前目前目錄載入。

Java的註釋:

單行註釋://

多行註釋:/*.......*/

文件註釋:/**......*/

識別符號和關鍵字:

和其它程式語言類似,識別符號由字母、數字、_、$組成。

因為JAVA使用的是unicode編碼,故識別符號可以為中文。

資料型別:

JAVA資料型別一共分為兩類:

1、基本資料型別:(整型:byte、short、int、long)(浮點:float、double) (布林:boolean) (字元:char)

2、引用資料型別:陣列、類(String字串也是類)、介面

資料型別預設值:整數預設為0,浮點為0.0,引用為null。

使用原則:整數使用int,浮點使用double,超過整數範圍使用long。(不必考慮節約記憶體)

public class Text{
	public static void main(String[] args){
		byte = 127;
		int i = 10;
		long l = 123123123L;  //若要為Long型,需要在數值後新增L,不然預設為int型。
		double d = 3.14;
		boolean b = true;
		char a = '中';  //字元型用單引號引起來,且只能為一個字元
		String s1 = "你好";  //字串型用雙引號引起來
	}
}

資料型別轉換:

範圍小的自動轉換到範圍大的資料型別;範圍大的需要強制轉換到範圍小的;

public class Text{
	public static void main(String[] args){
		int i = 10;
		long l = 123123123L;
		long l1 = i;  //自動轉換
		int i1 = (int)l;  //強制轉換
	}
}

運算子:

和其它程式語言一樣,提供了數學運算、關係運算、邏輯運算、位運算操作符。

三目運算:int max = x>y?x:y

邏輯結構-IF分支:

if(布林表示式){
    語句;
}else if(布林表示式){
    語句;
}else{
    語句;
}

邏輯結構-Switch分支:較少用

//switch只支援int、char、列舉、String
switch(資料){
    case 數值:{
        語句;
        [break;]}
    case 數值:{
        語句;
        [break;]}
    default:
        語句;
}

邏輯結構-while迴圈:

while(布林表示式){
    條件滿足時執行;
    修改迴圈條件;
}
//區別就是do-while至少執行一次
do{
    條件滿足時執行;
    修改迴圈條件;
}while(布林表示式)

邏輯結構-for迴圈:

for(初始化數值;迴圈判斷;修改迴圈資料){
    迴圈語句執行;
}

迴圈控制語句:break(跳出迴圈)、continue(跳出本次迴圈)

方法:和php中function函式一樣

方法的定義:

修飾符 返回值型別 方法名(引數值列表){
    [return返回]
}
//無參無返回:
public void fun1(){}
//有參無返回:
public void fun2(int i1, String s1){}
//有參有返回:
public String fun3(int i1, String s1){
    return "name" + s1;
}

方法的過載:

當方法名相同,引數的型別或個數不同時就叫做方法的過載,在進行呼叫時,程式會根據傳入的引數自動判斷呼叫哪個方法;(與方法的返回型別無關)

public class Text{
	public static void main(String[] args){
		System.out.println(fun1("11","22"));
	}
	public static String fun1(){  //在主類中使用方法,需要加入static關鍵字修飾方法,因為加入了static就不需要例項化就可呼叫方法
		return "無參方法";
	}
	public static String fun1(String s1){
		return "有一個引數方法" + s1;
	}
	public static int fun1(String s1,String s2){
		return 10;  //有兩個引數方法且返回資料型別不同
	}
}

方法的遞迴呼叫:

public class Text{
	public static void main(String[] args){
		System.out.println(fun1(8));
	}
	public static long fun1(int i){ 
		if(i == 1){
			return 1;
		}
		return i * fun1(i -1);
	}
}