
反序列化/php伪协议/白名单越权
反序列化
__wakeup的绕过: 声明的字段为私有字段,私有字段才可用) *
将需要进行反序列化的对象的序列化字符串中的成员数改为大于实际成员数即可。原理是:如果存在__wakeup方法,调用 unserilize() 方法前则先调用__wakeup方法,但是序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行
序列化中私有字段不加前缀时,会变成公有,可以被传递
两种序列化,反序列化后的差别
题:
php:filter伪协议
想知道服务器中某个文件的具体代码是什么?
就可以用filter伪协议来读取具体的代码
php://filter/[read/write=]/resource=
?page=php://filter/read=convert.base64-encode/resource=file1.php(以base64编码读取 文件.php)
?page=php://filter/convert.iconv.utf8.utf16/resource=file1.php(第二种方式,可用于绕过)
题:
data伪协议
?page=data:text/plain,
ile_get_contents是将文件中数据提取为字符串的函数,它与inclue()一样参数为文件名,所以直接file2=hello%20ctf行不通,要用data://协议构造数据流,使它当作php文件。
?file2=data://text,plain,hello ctf
可将传输的数据当作文件
题:
filter设计缺陷导致的权限绕过
当权限过滤器获取当前request中的URI/URL使用request.getRequestURL()和request.getRequestURI()这两个方法时,可以考虑以下三种⽅式进行权限绕过:
-
1.3.1 非标准化绕过
-
相关场景:
例如/system/login开头的接口是白名单,不需要进行访问控制(登陆页面所有人都可以访问),其他接⼝都需要
相关效果如下: *
当未登录直接访问UserInfoSearch.do接口时,显示未授权访问:
- 相关原理:
中间件在进⾏解析时,会对我们URI中的../进行相关处理从⽽得到相关的servlet。也就是说尝试对我们访问的URL引入../,中间件是可以正常解析并完成正常业务的,以tomcat中的examples目录中的案例servlet访问为例,尝试访问一个不存在的目录login,然后通过../回到正常目录下,正常解析:
- 绕过分析:
使用request.getRequestURL()和request.getRequestURI()这两个方法进⾏访问接口的获取时,是不会对类似../等进⾏规范化处理的,也就是说刚刚我们访问的/system/login/../UserInfoSearch.do际获取到的URI为:
同样是前⾯的例子,那么我们可以通过在URI中写⼊/login/../,使得权限过滤器认为我们当前访问的接⼝为白名单接口,从而绕过权限控制,使得系统认为我们当前访问的接⼝是登陆login,不需要进行权限校验:
- 绕过方法:
在URI引⼊入类似/login(白名单接口,可以通过测试得出,一般登陆都是不需要权限校验的)/../的样式,伪造⽩名单接口。
题: