zy.21
PHP(续)
PHP代码执行漏洞
1.PHP中代码漏洞的概念
代码执行漏洞就是在代码中若存在eval、assert等能将所接收的参数作为代码去执行,并且拼接的内容可被访问者控制,也就是把传入的参数给拼接进去了,造成了额外的代码执行,也就造成了代码执行漏洞。(大概原理:原本正常访问/?method=method1,eval接收到参数,拼接出来的代码是(newTestController())->method1();",正常调用method1。但如果传入的参数是method1();phpinfo,那么拼接出来的代码就是“(new TestController())->method1(); phpinfo();"运行的结果就很有意思了,除了method1被调用了以外ohpinfo也被调用执行了。)
2.PHP代码执行漏洞函数
(1)eval,(assert)
直接把输入的字符串作为PHP代码去执行。eval结尾需要用;号结束,assert不用,现在不用assert了,现在主要用于断言条件是否为真
(2)call_user_func
call_user_func ($_GET ['req'] ) ; // /?req[]=TestController&req[]=method1
这样输入,得到参数为['TestController','method1'],而如果只是单纯地访问/?req=phpinfo,调用的就是phpinfo。
(3)array_walk. array_map. array_filter
具体用法参考我的另一篇文章array_walk. array_map. array_filter -CSDN博客
array_walk对每个元素执行回调函数,直接改变原数组
array_map可以一次性处理多个数组返回一个新的数组,原数组不变
array_filter过滤数组元素
等效于
PHP反序列化漏洞
1.PHP的类与对象
类像是一个模板,对象是通过这个模板做出来的,属性和方法是模板规定的创建出来的对象所有的性质(这是我大概的理解应该没错吧,具体概念很晦涩就不写了)
2.PHP的序列化与反序列化
存储和与其他程序交换这些类所实例化出来的对象用的两个函数serialize(序列化)和unserialize(反序列化)
把一个对象转换成一段文本(可传输),而转换的这个过程就叫序列化还可以进行包裹,例子
反序列化并将对象放到变脸p中得到age
3.PHP中的反序列化漏洞
在构造一个对象时,如果想要给对象动态设置一些初始
属性,就需要在类的定义中添加一个叫构造方法的方法,在PHP中这个方法叫_construct。同样,在程序结束运行,对象被销毁时也可以定义一个在此时会被调用的方法,叫析构方法。在PHP中这个方法叫_destruct。destruct这个方法在程序运行结束,对象被销毁时被调用,对象被销毁的标志(1)unset()(2)在函数内部有new关键词创建对象
我还学习了其他魔术方法,具体知识内容写到了我的另一篇文章中PHP中的魔术方法-CSDN博客
对魔术方法进一步利用:反序列化出来一个对象,对象中的属性我们可控,那么就只要程序运行结束,对象被销毁,那么我们就可以操控这些函数的调用,让它执行我们想要执行的代码或者命令了
在目标上反序列化出这样一个对象有两种方式:
(1)直接控制unserialize函数的参数值,很少见,但只要能控制,就可以随心所欲反序列化出我们想要的对象
(2)通过文件操作函数来进行反序列化的操作,如file_get_contents、file_exist等函数。倘若它们的参数可控,不仅可以读取到任意文件的内容,同时也可以进一步扩展,达到RCE等目的 例如
unserialize($_GET['a']); echo file_get_contents($_GET['a']);
关于PHAR压缩文件(由PHP文件构成的压缩文件):可控的对象+可以利用的魔术方法就构成了我们对于反序列化漏洞的利用 ,简单来说,就是可以在这个压缩文件中存储一个对象,当这个压缩文件被PHP读取时,就会反序列化这个对象,那么如果这个对象有析构函数或者是其他的魔术方法定义,则在特定的时机(如程序运行结束时)就会被调用,进行一些删除文件等恶意操作
相关例题强网杯 2019 Upload(代码审计、反序列化、thinkphp5,附代码审计详解)_[强网杯 2019]upload-CSDN博客