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,则会跟踪爬取重定向页面,否则,不会跟踪重定向页面