文件上传漏洞-解析、验证、伪造1

文件上传漏洞:

文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,部分文件上传漏洞的利用技术门槛非常的低,对于攻击者来说很容易实施。

文件上传漏洞本身就是一个危害巨大的漏洞,WebShell更是将这种漏洞的利用无限扩大。大多数的上传漏洞被利用后攻击者都会留下WebShell以方便后续进入系统。攻击者在受影响系统放置或者插入WebShell后,可通过该WebShell更轻松,更隐蔽的在服务中为所欲为。

这里需要特别说明的是上传漏洞的利用经常会使用WebShell,而WebShell的植入远不止文件上传这一种方式。

webshell:

WebShell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称之为一种网页后门。攻击者在入侵了一个网站后,通常会将这些asp或php后门文件与网站服务器web目录下正常的网页文件混在一起,然后使用浏览器来访问这些后门,得到一个命令执行环境,以达到控制网站服务器的目的(可以上传下载或者修改文件,操作数据库,执行任意命令等)。

文件上传漏洞的原因:

  • 文件上传时检查不严。没有进行文件格式检查。
  • 文件上传后修改文件名时处理不当。一些应用在服务器端进行了完整的黑名单和白名单过滤,在修改已上传文件文件名时却百密一疏,允许用户修改文件后缀。如应用只能上传.doc文件时攻击者可以先将.php文件后缀修改为.doc,成功上传后在修改文件名时将后缀改回.php。

文件上传常见检测:

1.客户端检测
一般都是在网页上写一段js脚本,通过js去检测上传文件的后缀名,有白名单形式也有黑名单形式。

判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包。前端验证非常不可靠,通过修改数据包后缀名就可以绕过,甚至关闭js都可以尝试绕过。

2.服务端检测
检查content-type(内容类型)
检查后缀(多为检查后缀)
检查文件头

靶场实战

我们通过upload-labs这个靶场实践来进一步认识文件上传漏洞:

1.前端验证绕过

发现有一个上传点:在这里插入图片描述

我们试着上传一个带一句话的php上去,并开启burp抓包:
在这里插入图片描述
在这里插入图片描述
发现被拦截下来,提示只能上传图片类型,而在burp上并无抓取到任何数据,这证明就是一个典型的客户端前端检测

我们通过将php文件改成jpg文件使其符合检测要求,再在抓取数据包时将文件后缀改回php,从而完成绕过:
在这里插入图片描述

发现成功上传
在这里插入图片描述

通过菜刀连接即可。
在这里插入图片描述

2.Content-Type方式绕过

分析源码,知道了是对Content-Type(内容类型)和文件头的检测,

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']            
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '文件类型不正确,请重新上传!';
        }
    } else {
        $msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
    }
}

那我们想到的是就是图片马,图片马是可以很好的绕过内容类型和文件头检测的,在这里我准备好了一个写了一句话的txt文件和一张小图片来合成一张图片马:
在这里插入图片描述
在这里插入图片描述
生成图片马后,然后我们将图片马上传并抓包将后缀改为php,因为web容器是根据后缀去解析不同的文件的,所以我们将他改成php
在这里插入图片描述
最后成功上传,并调用一句话
在这里插入图片描述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GhKvSrvD-1584423082488)(https://m.qpic.cn/psb?/V133mrMy3dol57/ZO3Z5LqU7MPUKOuIRhqiYTwnCmkpNEaHxm1U*T3d1.o!/b/dDQBAAAAAAAA&bo=dAfXA3QH1wMRCT4!&rf=viewer_4)]

3.黑名单绕过

查看源码

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array('.asp','.aspx','.php','.jsp');
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //收尾去空

        if(!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;            
            if (move_uploaded_file($temp_file,$img_path)) {
                 $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

发现是一个黑名单绕过,它拦截了.asp,.aspx,.php,.jsp后缀的文件,但他拦截了php,是不是就意味着我们就不能上传php文件了呢?其实不是的,在默认状态下php,php3,php4,php5,phtml是会被解析成php的,请看下图
在这里插入图片描述
我们将图片马后缀改成php3,成功将上传,调用一句话,最后成功调用,证明是可以php3是可以被php解析的;

4. .htaccess文件绕过

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //收尾去空

        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

.htaccess是什么?.htaccess文件也被称为分布式配置文件,提供了针对目录改变配置的方法,在一个特定的文档目录中放置一个包含一个或者多个指令的文件,以作用于此目录及其所有子目录。
.htaccess功能:
文件密码保护,用户自定义重定向,自定义404页面,扩展名伪静态化,禁止特定ip地址的用户,但这个功能默认是不开启的。

.htaccess中有一条指令:

AddType application/x-httpd-php .jpg

这个指令代表着.jpg文件会当做php来解析。

只要我们把带有这条指令的.htaccess配置文件上传上去到有黑名单拦截的上传点,那就意味着我们就能将图片马直接上传上去了!

图形化界面是不允许我们将文件命名为空文件名 .htaccess,所以这里通过cmd命令来进行重命名:

重命名后,我们接下来,只需要先将.htaccess配置文件先传上去,在将图片马传上去即可;

5.后缀大小写绕过

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空

        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

在这里,虽然使用了很多过滤,过滤了很多文件类型,但却没将文件后缀统一转化为小写,所以我们是能通过后缀大小写来绕过上传的:

我们将做成图片马直接将后缀改成Php,进行上传

6.文件后缀(空)绕过

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = $_FILES['upload_file']['name'];
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file,$img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件不允许上传';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

这里相对于前面关卡的代码是少了一个消除两旁空格的函数trim();所以我们我们可以通过在后缀加个空格尝试绕过,黑名单机制中,是不允许上传什么,但如果我们传上去的文件与所限制的稍有不一样,那是不是就可以直接绕过黑名单了

我们进行将带有一句话的php文件上传并抓包
在这里插入图片描述

在后缀加个空格,上传
在这里插入图片描述

7.文件后缀(点)绕过

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

这里是少了一个删除末尾的点的函数

我们还是进行将带有一句话的php文件上传并抓包
在这里插入图片描述
在后缀加个点,上传,在上传到服务器后,服务器会自动将点去掉,只读取前面有用的后缀;
在这里插入图片描述

8.::$DATA(Windows文件流绕过)

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = trim($file_ext); //首尾去空
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

::$DATA(Windows文件流绕过)(这里利用到了NTFS交换数据流(ADS),ADS是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都存在许多个数据流。通俗理解,就是其他文件可以“寄宿”在某个文件身上,而在资源管理器中却只能看到宿主文件,找不到寄宿问文件。)

例如在cmd命令下运行:echo abcd>>a.txt:b.txt 很明显生成一个a.txt,但是会是空值,因为系统将值写到寄宿文件上去了;

然后再运行 echo 123>>a.txt:: D A T A , 是 会 在 a . t x t 中 输 出 123 的 , 因 为 : : DATA,是会在a.txt中输出123的,因为 :: DATAa.txt123::DATA相当是个空值,不是一个寄宿文件,所以还是会将文件写入到a.txt中去,不修改文件存储过程;

在利用Windows特性,可在后缀加上“ ::$DATA ”绕过。
跟之前一样的思路,抓包改包绕过。
在这里插入图片描述在这里插入图片描述

9.构造文件后缀绕过

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

第九关好像用了我们前面关卡的所有过滤,那我们可不可以构造一个文件名后缀111.php. . 过滤参数在发现.时会将.去掉,在将空格去掉,最后只剩下111.php. 这样还是可以绕过黑名单机制的,因为111.php.不等于111.php,所以还是能绕过上传;

10双写文件后缀绕过

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");

        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = str_ireplace($deny_ext,"", $file_name);
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = UPLOAD_PATH.'/'.$file_name;        
        if (move_uploaded_file($temp_file, $img_path)) {
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

会将符合条件的文件后缀删除,我们只需要将文件后缀进行双写,令他删除后合并就能成功绕过!


会将符合条件的文件后缀删除,我们只需要将文件后缀进行双写,令他删除后合并就能成功绕过!

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 《Web漏洞解析与攻防实战》是一本介绍Web安全的书籍,通过深入分析和解读常见的Web漏洞,帮助读者更好地理解和防范Web应用程序的攻击。 在该书的电子版中,作者首先介绍了Web应用程序的基本原理和相关技术,包括HTTP协议、HTML、CSS、JavaScript等。之后,逐一分析了Web安全的重要性和流程,引导读者了解Web漏洞的各种类型和危害。 该书的重点之一是对常见的Web漏洞进行深入解析。其中,SQL注入、跨站脚本攻击(XSS)、跨站请求伪造(CSRF)、文件包含、文件上传漏洞等被详细讲解,涵盖了漏洞的原理、攻击方式以及防御方法等。书中通过实例和案例,帮助读者更直观地理解和应用这些知识。 此外,该书还提供了一些攻防实战的案例,分析了一些真实的Web应用程序漏洞和攻击事件,引导读者进行实践和测试。通过这些实战经验,读者可以更好地理解Web漏洞的实际应用及其对系统和用户的威胁。 值得一提的是,电子版的优势在于可以随时随地进行学习和查询,书中内容可以通过电子设备进行搜索和标注。此外,电子版还可以与其他工具和资源进行链接,方便读者深入学习和提高技能。 总的来说,《Web漏洞解析与攻防实战》是一本对于Web安全感兴趣或者从事相关工作的人士非常有价值的书籍。它通过系统的讲解和实战提升读者的技能和知识水平,并帮助他们更好地保护Web应用程序的安全。 ### 回答2: 《Web漏洞解析与攻防实战》是一本关于Web安全的电子书,本书旨在帮助读者深入了解Web漏洞和攻防实战的相关知识。 首先,本书详细介绍了Web应用程序的基本架构和工作原理,让读者对Web应用程序有一个整体的认识。随后,书中重点解析了常见的Web漏洞类型,如跨站脚本攻击(XSS)、跨站请求伪造(CSRF)、SQL注入、文件上传漏洞等。对于每种漏洞,书中都给出了详细的解释和示例代码,帮助读者理解漏洞的原理和利用方式。 为了帮助读者更好地理解漏洞的攻击和防御方法,本书还提供了大量的实战案例。这些案例涵盖了不同类型的漏洞,通过具体的场景和示例代码,引导读者进行漏洞的发现和修复。同时,书中还介绍了一些常用的漏洞扫描工具和漏洞修复技巧,帮助读者提高Web应用程序的安全性。 此外,本书还强调了Web安全的思维方式和方法论。作者提供了一些实用的安全设计原则和开发规范,让读者在Web应用程序的设计和开发过程中就能考虑安全问题,减少漏洞的产生。同时,书中还介绍了一些常见的安全防护策略,如输入验证、输出编码、会话管理等,帮助读者建立起一套完善的Web安全体系。 综上所述,《Web漏洞解析与攻防实战》是一本全面介绍Web漏洞和攻防实战的电子书。通过学习本书,读者可以提高自己对Web安全的认识和理解,掌握常见Web漏洞的检测和修复技术,构建安全可靠的Web应用程序。这对于所有从事Web开发和安全工作的技术人员来说都是一本不可多得的学习资料。 ### 回答3: 《Web漏洞解析与攻防实战》是一本关于网络安全的书籍,主要讲解了Web应用程序中常见的漏洞类型以及相应的解析和防御方法。这本书适合对网络安全有一定基础和兴趣的读者阅读。 书中首先介绍了Web应用程序中的一些常见漏洞类型,例如跨站脚本攻击(XSS)、SQL注入、跨站请求伪造(CSRF)、文件上传漏洞等。对于每种漏洞类型,书中详细解析了其原理和攻击方式,并给出了相应的实例和代码分析。读者通过学习这些漏洞原理和攻击方式,可以更好地理解Web应用程序中潜在的安全风险。 接着,书中介绍了如何进行Web漏洞的防御。通过学习这些防御方法,读者可以了解如何通过编码规范、安全策略和安全工具等手段来提高Web应用程序的安全性。书中详细解析了一些常用的防御措施,例如输入验证、参数化查询、安全的会话管理等,读者可以根据自己的需要和实际情况来选择适合的防御方法。 此外,书中还介绍了一些实战场景,让读者能够将所学的知识应用到实际的漏洞攻防场景中。通过这些实战案例,读者可以更深入地理解漏洞的利用和防御过程,加深对网络安全的理解和实践能力。 总之,《Web漏洞解析与攻防实战》是一本综合性的网络安全书籍,涵盖了常见的Web漏洞类型、攻击技术和防御措施。通过阅读这本书,读者可以提高自己对Web应用程序安全的认识和技能,从而更好地保护自己的网络安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值