【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);
}
}