1.反序列化漏洞 实例化是指:当通过在内存中创建类的一个实例时,一个类的具体化就变成了一个对象。所以,当你真正调用newclass()时,class()就成为了一个实例化的对象。当你反序列化一个字符串时,而这正是PHP所做的(对象实例化),就会将一个字符串的数组转换成对象。反序列化对象允许控制所有属性:public、protected和private。 我们先不看对象,先复习一下序列化。。。 serialize()#这个函数是将这个实例转化为一个序列化的字符串 特别提示:S代表字符串O代表对象 unserialize()#还原已经序列化的对象,也就是说将序列化后的转换成字符串或者对象等 特别提示:S代表还原字符串O代表还原对象比如s:3:"asd";第一个开头的S代表字符串所以就还原成字符串 复习完这两个函数干嘛的下面就好理解了。。。 创建一个对象然后利用反序列化漏洞进行调用魔术方法 结果: 我他妈叫心东 O:7:"myClass":1:{s:4:"name";s:6:"心东";} O表示:对象 7表示myClass是7个字节 1表示是有一个值 s:4表示有name是字符串并且有4个字节 s:6表示有心东是字符串并且有6个字节(中文的算2个字节或者3字节) 下面的图是介绍__toString方法的。。。 序列化与反序列化已经复习完,接下来就看漏洞咯。。。。。。。。。。。 打下预防针:利用漏洞前必须要有魔术方法。。 啊好奇怪啊。。。为什么没走没__construct?我明明已经O:7:"myClass":1:{s:4:"name";s:6:"心东";}反序列就变成了对象了啊。 答:至于为什么不走__construct那是因为__construct不是魔术方法,而是构造方法。。。 PS:当你真正调用newclass()时,class()就成为了一个实例化的对象。换个说法就是O:7:"myClass"O就告诉了程序这是个对象 传参: 特别注意:利用反序列化漏洞必须要有魔术方法。 2.文件包含之读文件 PHP输入和输出流是通过php://来访问的,它允许访问PHP的输入输出流、标准输入输出和错误描述符,内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。 php://stdin,php://stdout和php://stderr php://stdin,php://stdout和php://stderr允许访问PHP进程相应的输入或者输出流。 php://input php://input是个可以访问请求的原始数据的只读流。POST请求的情况下,最好使用php://input来代替$HTTP_RAW_POST_DATA(原生的post数据),因为它不依赖于特定的php.ini指令,内存消耗更少。 php://output php://output是一个只写的数据流,允许你以print和echo一样的方式写入到输出缓冲区。 php://fd php://fd允许直接访问指定的文件描述符。例如php://fd/3引用了文件描述符3。 php://memory和php://temp php://memory和php://temp是一个类似文件包装器的数据流,允许读写临时数据。两者的唯一区别是php://memory总是把数据储存在内存中,而php://temp会在内存量达到预定义的限制后(默认是2MB)存入临时文件中。临时文件位置的决定和sys_get_temp_dir()的方式一致。 php://filter php://filter是一种元封装器,设计用于数据流打开时的筛选过滤应用。这对于一体式(all-in-one)的文件函数非常有用,类似readfile()、file()和file_get_contents(),在数据流内容读取之前没有机会应用其他过滤器。参数如下: 读文件 输出base64编码 URL: 白癜风软膏能不能治白癜风白癜风哪个医院治疗得好
|