pikachu靶场&RCE&文件包含&上传下载&越权(四)

RCE

概述

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

远程系统命令执行一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口,比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。

如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器,同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。

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

RCE-PING

在这里插入图片描述

  • 测试下
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 看下源代码,并没有对输入做限制
    在这里插入图片描述

RCE-EVEL

在这里插入图片描述

可以直接执行我们输入的代码
在这里插入图片描述
在这里插入图片描述

  • 关于eval()
    在这里插入图片描述

File Inclusion(文件包含漏洞)

概述

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

  • include(),include_once()
  • require(),require_once()

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

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

根据不同的配置环境,文件包含漏洞分为如下两种情况:
1.本地文件包含漏洞:仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击者更多的会包含一些固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。
2.远程文件包含漏洞:能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码,这种情况没啥好说的,准备挂彩。 因此,在web应用系统的功能设计上尽量不要让前端用户直接传变量给包含函数,如果非要这么做,也一定要做严格的白名单策略进行过滤。

include&require语法

  • 本地文件包含
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 远程文件包含
    参考

远程文件包含情况与本地文件包含是相似的,远程文件包含攻击者可以通过访问外部地址来加载远程的代码。 能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码。因此,在web应用系统的功能设计上尽量不要让前端用户直接传变量给包含函数,如果非要这么做,也一定要做严格的白名单策略进行过滤。

  • 这个漏洞还要搭建一个测试网站用来模拟远程链接
    在这里插入图片描述
  • 下面在搭建的网站根目录创建一个文档,供pikachu网站来连接
  • 下面通过pikachu来访问下吧
    在这里插入图片描述
    在这里插入图片描述
  • 代码执行成功,既然可以执行我们服务器上的文件,那我们写一个生成后门的文件来被他访问的话,就可以直接拿下网站了,危害还是很大的。
    在这里插入图片描述

文件下载漏洞

概念

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

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

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

抓包看下载链接

GET /vul/unsafedownload/execdownload.php?filename=kb.png HTTP/1.1
GET /vul/unsafedownload/execdownload.php?filename=ai.png HTTP/1.1
GET /vul/unsafedownload/execdownload.php?filename=bigben.png HTTP/1.1
  • 网站目录文件,下载个1.txt试试,构造payload: ../../../1.txt
    在这里插入图片描述
  • 下载成功,如果我们知道整个目录信息(这就看信息收集的了),再配合这个漏洞…就很舒服
    在这里插入图片描述

文件上传漏洞

概述

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

所以,在设计文件上传功能时,一定要对传进来的文件进行严格的安全考虑。比如:
–验证文件类型、后缀名、大小;
–验证文件的上传方式;
–对文件进行一定复杂的重命名;
–不要暴露文件上传后的路径;
–等等…

前端页面检查(client check)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 我们把info.php改成info.png绕过前端检查,然后抓包再给它改成info.php文件
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

MIME TYPE漏洞

什么是MIME?
参考

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

上传绕过原理:部分Web应用系统判定文件类型是通过content-type字段,黑客可以通过抓包,将content-type字段改为常见的图片类型,如image/gif,从而绕过校验。

常见的MIME类型

  • text/plain(纯文本)
  • text/html(HTML文档)
  • text/javascript(js代码)
  • application/xhtml+xml(XHTML文档)
  • image/gif(GIF图像)
  • image/jpeg(JPEG图像)
  • image/png(PNG图像)
  • video/mpeg(MPEG动画)
  • application/octet-stream(二进制数据)
  • application/pdf(PDF文档)

在这里插入图片描述

getimagesize

参考
在这里插入图片描述

  • 这函数会根据上传文档的文件头来判断上传是否是图片
  • 我们可以把测试语句写入到图片,以此来绕过getimagesize函数
  • 我们要准备一张图片,一个有测试脚本的文档
    在这里插入图片描述
  • 在此路径下打开cmd窗口,用copy把脚本写入到图片内
    在这里插入图片描述
    在这里插入图片描述
  • 文件可以上传,但没有执行,此时需要文件执行漏洞配合,以php的形式执行
    在这里插入图片描述
  • 配合文件包含的本地包含漏洞,../../unsafeupload/uploads/2021/08/04/931743610a8ddfbf58d141830784.png
  • http://pikachu-master:8890/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2021/08/04/931743610a8ddfbf58d141830784.png&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2
    在这里插入图片描述

over permission 概述

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

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

因此,在在权限管理中应该遵守:
1.使用最小权限原则对用户进行赋权;
2.使用合理(严格)的权限校验规则;
3.使用后台登录态作为条件进行权限判断,别动不动就瞎用前端传进来的条件;

水平越权

  • 水平越权就是指,相同权限或相同层级的一个用户可以非法使用或得到另一个客户的权限。
  • 登陆三个账户,查看网站个链接发现只有username不同,直接修改username可以得到其他用户的信息
http://pikachu-master:8890/vul/overpermission/op1/op1_mem.php?username=lucy&submit=
http://pikachu-master:8890/vul/overpermission/op1/op1_mem.php?username=lili&submit=
http://pikachu-master:8890/vul/overpermission/op1/op1_mem.php?username=kobe&submit=

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

垂直越权

转载

垂直越权:低权限用户操作非法执行高权限行为,账户什么的无所谓,只要能执行高权限行为就是垂直越权

  • 高权限用户admin/123456,可以创建删除账户
    在这里插入图片描述
  • 低权限用户pikachu/000000,只有查看权限
    在这里插入图片描述
  • admin添加数据时抓包,可以看到PHPSESSID
    在这里插入图片描述
  • 复制admin链接的时候要保证cookie:PHPSESSID不会过期(身份凭证),这样提权才能成功
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • op2_login.php中通过判断账户密码来判断要进入哪个页面
if(isset($_POST['submit'])){
    if($_POST['username']!=null && $_POST['password']!=null){
        $username=escape($link, $_POST['username']);
        $password=escape($link, $_POST['password']);//转义,防注入
        $query="select * from users where username='$username' and password=md5('$password')";
        $result=execute($link, $query);
        if(mysqli_num_rows($result)==1){
            $data=mysqli_fetch_assoc($result);
            if($data['level']==1){//如果级别是1,进入admin.php
                $_SESSION['op2']['username']=$username;
                $_SESSION['op2']['password']=sha1(md5($password));
                $_SESSION['op2']['level']=1;
                header("location:op2_admin.php");
            }
            if($data['level']==2){//如果级别是2,进入user.php
                $_SESSION['op2']['username']=$username;
                $_SESSION['op2']['password']=sha1(md5($password));
                $_SESSION['op2']['level']=2;
                header("location:op2_user.php");
            }

        }else{
            //查询不到,登录失败
            $html.="<p>登录失败,请重新登录</p>";

        }

    }

}
  • op2_user.php只简单判断了是否登陆
// 判断是否登录,没有登录不能访问
if(!check_op2_login($link)){
    header("location:op2_login.php");
}

if(isset($_GET['logout']) && $_GET['logout'] == 1){
    session_unset();
    session_destroy();
    setcookie(session_name(),'',time()-3600,'/');
    header("location:op2_login.php");

}
  • op2_admin_edit.php(创建用户界面),只判断了是否登陆没有判断账户,所以存在越权
$link=connect();
// 判断是否登录,没有登录不能访问
//这里只是验证了登录状态,并没有验证级别,所以存在越权问题。
if(!check_op2_login($link)){
    header("location:op2_login.php");
    exit();
}
if(isset($_POST['submit'])){
    if($_POST['username']!=null && $_POST['password']!=null){//用户名密码必填
        $getdata=escape($link, $_POST);//转义
        $query="insert into member(username,pw,sex,phonenum,email,address) values('{$getdata['username']}',md5('{$getdata['password']}'),'{$getdata['sex']}','{$getdata['phonenum']}','{$getdata['email']}','{$getdata['address']}')";
        $result=execute($link, $query);
        if(mysqli_affected_rows($link)==1){//判断是否插入
            header("location:op2_admin.php");
        }else {
            $html.="<p>修改失败,请检查下数据库是不是还是活着的</p>";

        }
    }
}
  • op2_admin.php(admin登陆后的页面),这里会判断账户是否登录和用户级别,因为用户创建成功会进行回显,pikachu用户并不具备admin全新,再加上op2_admin.php会判断当前用户,所以会返回登陆界面。
$link=connect();
// 判断是否登录,没有登录不能访问
//如果没登录,或者level不等于1,都就干掉
if(!check_op2_login($link) || $_SESSION['op2']['level']!=1){
    header("location:op2_login.php");
    exit();
}

//删除
if(isset($_GET['id'])){
    $id=escape($link, $_GET['id']);//转义
    $query="delete from member where id={$id}";
    execute($link, $query);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值