一般我们点击下载链接,会向后台发送一个下载请求
一般来说这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码
将该文件名对应的文件response给浏览器,从而完成下载
如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话
则可能会引发不安全的文件下载漏洞
如果攻击者提交的不是一个程序预期的的文件名
而是一个精心构造的路径(比如../../../etc/passwd)
则很有可能会直接将该指定的文件下载下来
从而导致后台敏感信息(密码文件、源代码等)被下载
你点一下它就直接下载了
你放在图片上右键这个时候你就可以得到一个下载它的链接
先点一下下载burp抓包看一看
![](https://i-blog.csdnimg.cn/direct/0c79b63cedcc4207807ceec358c3bcf3.png)
把kb.png改为../../../test.txt
![](https://i-blog.csdnimg.cn/direct/fec8aab5c1764f5c9d81d0fc680c705b.png)
然后send
看一下
![](https://i-blog.csdnimg.cn/direct/795f112266b449439df4b687456f1a4b.png)
说明确实存在不安全下载
此时如果 攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。
所以,在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。
目录遍历
因为
比喻解释
想象你有一个大楼,里面有很多房间,每个房间都有一扇门。这个大楼的某些房间是公开的,比如会议室、休息室等,任何人都可以进去。而其他房间,比如经理办公室、财务室等,则是私密的,只有授权的人才能进去。
现在,你在大楼的入口放置了一个机器人,任何人来到入口都可以告诉机器人他们想去哪个房间,机器人就会带他们去指定的房间。假设这个机器人有一个问题,就是他不检查你是否有权限进入某些房间,只要你告诉他房间的名字,他就会带你去。
所以说
敏感信息泄露
敏感信息泄露是指未经授权的情况下,敏感信息被公开访问或泄露。这种信息包括但不限于个人数据(如身份证号、地址、电话号码)、登录凭据(如用户名和密码)、商业机密(如财务数据、客户列表)等。敏感信息泄露可能会导致隐私泄露、财务损失、商业竞争力下降等严重后果。
比喻解释
想象你有一个装满重要文件的文件柜,这些文件柜中的文件包括你的个人日记、银行对账单、密码本等等。这些文件柜应该只对你自己或授权的人开放。然而,如果你不小心将文件柜的钥匙放在公共场所,任何人都可以拿到钥匙并打开文件柜,看到里面的所有重要文件。这就是敏感信息泄露。
敏感信息泄露的常见原因
-
不安全的配置:例如,将数据库备份文件存储在公共服务器上。
-
代码缺陷:例如,错误地将敏感信息输出到日志文件中,并且这些日志文件可被公开访问。
-
人为错误:例如,员工将含有敏感信息的文件通过未加密的邮件发送出去。
-
社会工程学攻击:攻击者通过伪装成信任的个人或实体,从受害者那里获取敏感信息。
-
未授权的文件列出:例如,通过URL直接访问某个目录,列出了该目录下所有的文件。
试一下能不能登录
可以登录
php序列化
序列化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{
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>";}
输入 O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}