pikachu php反序列化、XXE、SSRF

 

第九章 php反序列化、XXESSRF

 

 

1.php反序列化原理及演示

 

 

 

 

  写一个文件

 

 

  先把下面注释掉

 

 

  访问一下

 

   第一行字符串的值就是刚刚定义的那个对象序列化的结果。反序列化后可直接得到变量pikachu

 

 

   这个定义了一个对象,里面定义了一个变量,使用了一个魔法函数,当这个变量被销毁时,会自动执行下面这句话。后台定义了一个接口,这个接口通过一个GET请求获取一个数据,然后把这个数据进行反序列化。反序列化的内容是通过前端传进来的,这个时候就形成了安全问题。

  问题就是,如果在前端传入一个恶意的序列化内容,当后台接收到这个数据,会对这个内容进行反序列化。反序列化是会对对象进行创建进行销毁。这个过程中,就会去调用魔法方法。

 

  这个例子就是,我们定义一个变量,变量的值是JavaScript代码,被读取后会进行反序列化,反序列化的同时会对对象进行创建和销毁,销毁的同时会被调用魔法代码,从而导致输入的这个内容会echo到前端,这段代码就会在前端被执行。

 

  场景演示

 

 

  随意测试一下

 

 

 

 

  构造一下

  我们可以自己写一个类,然后在其中定义一个变量,把变量的名称写成一段恶意的JavaScript代码。

 

  测试一下

 

 

  这时再访问一下

 

 

 

   出现弹窗

 

  查看一下源代码

 

   这是序列化好的内容

 

  我们把这个内容在接口进行提交

 

 

 

   成功弹出

 

  其实就是序列化的内容通过一个反序列化的接口造成xss的执行。

 

  查看一下代码

 

   这里定义了一个construct魔法函数,当类被创建时自动执行。

 

  这种漏洞通常是使用代码审计来完成的(黑盒测试等)

 

  原理:

  在前面进行post请求,将这个请求进行反序列化,反序列化的时候会对对象进行创建,同时会调用这个魔法函数,就会把传进来的变量echo到前端。

 

 

 

2.XXE漏洞原理和演示

 

 

 

 

 

 

 

   把一个xml文档通过参数传给他,传给这个函数后,它可以把这个文档解析成php里面的一个对象。在后面的代码中可以通过对对象里面的内容进行读取从而获得xml里面的一些数据。

 

  场景演示

 

   数据可以通过前端传到后端

 

  查看一下后台代码

 

   通过post请求获取前端传过来的xml数据,数据进入这个函数后,函数就会对这个xml的外部实体内容进行解析。再把解析好的数据返回给前端。

 

  先发一个正常的试试看

 

 

 

 

 

   直接把DTD里面定义的hacker的值返回回来了。这是一个正常的提交

 

  在DTD里定义一个外部实体,通过SYSTEM来指定一个外部实体

 

 

 

 

 

   直接把外部实体里面传进来的file这个协议指定的一些目标文件的内容返回回来,把里面的敏感数据读取出来。

  后端在接受xml数据的时候,第一开启了外部实体解析,第二没有对传过来的数据做任何的过滤,导致了问题的出现。

 

 

 

3.SSRF漏洞原理及演示(可以用来打内网)

 

   这些函数的共同点就是通过一些网络协议,去远程访问目标服务器上的资源。

 

  场景演示

 

 

 

 

 

   可以发现它传了一个url到后台

 

  查看一下后台代码

 

   这边会直接获取前端传过来的url,直接通过curl_init()做了一个初始化,然后最终通过curl_exec()去对它进行请求,然后把请求返回来的数据又返回到前端。

 

  尝试传一个其他的地址

 

 

 

   直接把百度显示了出来

 

  这并不是浏览器直接去请求的百度,而是浏览器把这个参数传到了后端,后端的服务器通过curl_exec()这个方法去请求的百度,然后把百度返回的数据又返回到前端。

  意味着我们可以通过SSRF漏洞去对后端服务器同一个网络里的其他服务器进行相关的探测

 

 

 

 

   我们通过HTTP这样的一个访问去测一下1.15这台机器上的22号端口是否开着,直接把相关信息返回回来。

  通过这个漏洞对1.4同一个内网里面的服务器去进行扫描探测,以获取更多的内网资源,然后进行更进一步的攻击。

 

 

  另一个例子

 

 

 

 

 

   也是传了一个a标签,给了一个对应的地址

 

  查看一下后端代码

 

   这里使用的函数不同,是file_get_contents()函数。这个函数可以对本地的文件进行读取也可对远程的文件进行读取。

  也支持很多相关的网络协议。

 

  换一个网址试试

 

 

 

   同样也会通过http把百度的资源通过后端服务器请求返回到前端。

 

  这个地方也同样可以通过后端支持的某些协议对内网进行相关的探测。

 

  这个也支持通过php内置的方法,来去读取源码。(php是后端的)

  对于指定的目标路径下的文件进行读取,再转成base64-encode编码。

 

 

 

   直接把文件base64的编码返回到前端,直接把这段编码用base64解码就可以知道php文件所对应的源代码是什么。

 

posted @ 2020-04-08 15:04  zhaihuijie  阅读(214)  评论(0编辑  收藏  举报