web漏洞靶场学习分享

发布于:2025-04-06 ⋅ 阅读:(20) ⋅ 点赞:(0)

靶场: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>";}

提交即可