越权
水平越权
水平越权指的是攻击者能够访问与他拥有相同权限用户的资源。
可以看到我们现在是lili的个人信息,但是我们尝试直接把username改成lucy然后发出:
可以看到后端直接按照传入的username返回了个人信息。那么我们在本来是lili账户的情况下访问到了lucy账户的个人信息,这就构成了越权。又因为lili和lucy都只拥有一样的普通账户权限,所以这是水平越权。
如果要保证其安全性,我们在校验是否登录了的同时,还应该加验一下和session的用户是否对应。
垂直越权
垂直越权就是低权限用户可以绕过一些授权限制,访问到更高权限用户的资源。
admin账户:
点击添加账户,填写信息添加一个way账户,bp抓到包后放入repeater中,然后回到Proxy中drop了包,这就模拟了攻击者拦截获取到了添加数据时的数据包。目的是获得添加数据的接口和提交的参数。
然后我们退出登录,重新登录上pikachu账户,可以拿到pikachu的cookie:
然后我们将pikachu账号的cookie替换到添加账号的数据包中,然后点击send发送allow 重定向:
最后我们能看到他跳转回了登录界面:
这是我们在重新刷新pikachu账户的查看用户页面,发现way账户已经被添加:
目录遍历
目录遍历是由于网站存在配置缺陷,所有的目录和文件都可以被浏览到。这可能包括应用程序代码和数据,后端系统的凭据以及敏感的操作系统文件。在某些情况下,攻击者可能能够在服务器上写入任意文件。
一般我们在不知道其目录时,会用扫描工具先进行尝试,或者我们可以使用一些已知的路径来尝试是否能够访问。
这个页面中可以分别访问两个路径,那么我们可以尝试访问其他目录或路径:
敏感信息泄露
敏感数据包括但不限于:口令、密钥、证书、会话标识、License、隐私数据(如短消息的内容)、授权凭据、个人数据(如姓名、住址、电话等)等。当开发者未能从公共内容中删除内部内容或者网站及相关技术配置并不安全时,就容易早成敏感数据的泄露。
1.在这个里面,我们打开源码,查看登录的这部分代码,我们可以发现,里面有注释里写了测试账号,这就造成了敏感信息泄露。
2.可以看到登录后跳转到了abc.php:
那我们可以尝试在未登录的状态时,直接访问此页面:
发现可以直接浏览,这就是代码的逻辑设计有问题,没有设置有效的校验,造成了信息泄露。
反序列化
反序列化,就得先了解一下序列化,php反序列化就是序列化说通俗点就是把一个对象变成可以传输的字符串。那么反序列化呢,就是将字符串形式的对象再变回正常的对象。
比如现在有一个类
<?php
Class A
{
public $test='123';
public $user='way'
public function Print()
{
echo $this->user;
echo $this->test;
}
}
$a=new A();
$a->Print();
echo serialize($a)
?>
它的对象序列化后的样子就是这样的:
serialize($a)
O:1:"A":2:{s:4:"test";s:3:"123";s:4:"user";s:3:"way";}
对象类型:长度:“类名”:变量数量:{类型:长度:“值”;类型:长度:“值”;...}
可以发现没有类,只有变量。而且其中的字符都代表着不同的意思:
反序列化
反序列化漏洞就是当反序列的对象可控时,不正当的利用一些魔法函数,将自己想要的命令得到执行。
魔法函数是什么函数呢?
魔法函数
__wakeup() //执行unserialize()时,先会调用这个函数
__sleep() //执行serialize()时,先会调用这个函数
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据或者不存在这个键都会调用此方法
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__toString() //把类当作字符串使用时触发
__invoke() //当尝试将对象调用为函数时触发
__construct() //对象初始化时会调用此方法
__toString9() //当对象被当做自付出对待时会调用此方法
一般情况下,要利用反序列化的话,都是需要得到源码的,那么我们先来看一下源码:
我们可以看到里面有__construct()这个魔法函数,也就是说当这个类的实例初始化时,就会调用这个函数。
我们可以看到33行,他是将反序列化后的$s的test放到<p>标签中,这样我们就可以设置一个弹窗类html代码的payload:
O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
这个在反序列化时并不会调用construct()函数,所以test的值并不会变,那么我们反序列化后,S的test值为:<script>alert('xss')</script>,于是当我们提交以后就可以看到有警示框弹出: