接口概念 官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
接口的特点 就像一个类一样,一个接口也能够拥有方法和属性,但是在接口中声明的方法默认是抽象的。(即只有方法标识符,而没有方法体)。
接口指明了一个类必须要做什么和不能做什么,相当于类的蓝图。 一个接口就是描述一种能力,比如“运动员”也可以作为一个接口,并且任何实现“运动员”接口的类都必须有能力实现奔跑这个动作(或者implement move()方法),所以接口的作用就是告诉类,你要实现我这种接口代表的功能,你就必须实现某些方法,我才能承认你确实拥有该接口代表的某种能力。 如果一个类实现了一个接口中要求的所有的方法,然而没有提供方法体而仅仅只有方法标识,那么这个类一定是一个抽象类。(必须记住:抽象方法只能存在于抽象类或者接口中,但抽象类中却能存在非抽象方法,即有方法体的方法。接口是百分之百的抽象类) 一个JAVA库中接口的例子是:Comparator 接口,这个接口代表了“能够进行比较”这种能力,任何类只要实现了这个Comparator接口的话,这个类也具备了“比较”这种能力,那么就可以用来进行排序操作了。 为什么要用接口 接口被用来描述一种抽象。 因为Java不像C++一样支持多继承,所以Java可以通过实现接口来弥补这个局限。 接口也被用来实现解耦。 接口被用来实现抽象,而抽象类也被用来实现抽象,为什么一定要用接口呢?接口和抽象类之间又有什么区别呢?原因是抽象类内部可能包含非final的变量,但是在接口中存在的变量一定是final,public,static的。 接口的语法实现 为了声明一个接口,我们使用interface这个关键字,在接口中的所有方法都必须只声明方法标识,而不要去声明具体的方法体,因为具体的方法体的实现是由继承该接口的类来去实现的,因此,接口并不用管具体的实现。接口中的属性默认为Public Static Final.一个类实现这个接口必须实现这个接口中定义的所有的抽象方法。
示例:
JS文件可以查找到准确的响应码
注:
在正确设置后端检验的情况下,即使修改响应码后,仍然会跳回登录界面。而可以通过修改状态码进行登录的,一般分为以下两种类型:
第一种:后端未作验证,修改状态码就可以直接绕过权限检查,。
第二种:后端做了验证,修改状态码后仍然会显示后台页面,或是泄露后台部分的功能接口,但是没有数据和操作权限,可定级为低中危。
修复方式:
修改验证逻辑,如是否登录成功服务器端返回一个参数,但是到此就是最终验证,不需要再对返回的参数进行使用并作为登录是否成功的最终判断依据。
1.2 URL的直接访问
一般通过目录扫描、FUZZ、猜解等方式获取到后台路径从而达到直接访问后台功能的目的或者是使用JSFinder搜索源代码中调用的地址(成功率很高,强烈推荐)
Tips:
- 目录扫描工具推荐使用Dirmap、Dirsearch,个人比较推荐使用Dirmap加字典的方式。
- JSFinder:推荐使用Tampermonkey下的脚本。
- 若甲方提供测试账户,可以先行登录获取部分链接,然后待退出登录消除凭证后,查看是否能重新访问这部分链接。
示例:
直接访问JSFinder爬取到链接,查看是否存在未授权的情况
注:
扫描目录的时候除了未授权的后台页面,也需要同时关注以下几种:目录遍历、任意文件上传下载、API接口泄露。
修复方式:
禁止目录扫描,并提前做好自我检查,使用递归的方式检查自己的目录以及检查网页中的站点是否存在未授权的路径。