前言:
为什么做渗透测试需要学习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);
}
}