ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

DVWA靶场文件上传漏洞全解析:从Low到High的攻防实战

DVWA靶场文件上传漏洞全解析:从Low到High的攻防实战 DVWA靶场我一直觉得是Web安全入门最值得花时间的那个“老朋友”尤其是文件上传这个模块三个等级从裸奔到带锁基本把文件上传漏洞的攻防套路演了一遍。你把这个模块彻底打通再去碰真实项目里的上传点心里会踏实很多。这篇文章我就从搭建靶场开始把Low、Medium、High三个等级逐个拆开讲清楚它们的校验逻辑、绕过思路和防御手段。不管你是刚碰安全的学生还是已经工作几年的开发只要想系统搞懂文件上传漏洞这篇都值得你泡杯茶慢慢看。1. 文件上传漏洞为什么值得死磕再不理解就亏了1.1 “一个上传点”能捅出多少篓子很多朋友第一次接触文件上传漏洞时觉得它不过是“传个文件”而已能有什么大事。实际上文件上传漏洞长期霸榜OWASP Top 10里的“高风险漏洞”队列核心原因在于它常常直接通向服务器权限。你想想一个Web应用只要开放了上传功能用户就往服务器上丢文件如果服务端没有严格限制文件类型、文件内容、文件存储路径那攻击者就能把一个“可执行文件”丢到服务器上。这里的可执行文件最常见的就是PHP一句话木马比如经典的?php eval($_POST[cmd]); ?。上传成功后攻击者只需要用一个客户端工具连接上去就能以Web容器的权限执行系统命令。要是站点本身以root或system权限运行那整台服务器基本就交代了。就算权限不高通过内网横向渗透影响范围也会迅速扩大。更隐蔽的是文件上传漏洞经常和XSS、文件包含、目录穿越、命令执行等漏洞结合。比如攻击者上传一个带恶意脚本的图片配合存储型XSS打到管理员浏览器或者上传一个图片马再配合文件包含漏洞把它解析执行。我在实际测试中见到过不少案例业务方只修“上传类型校验”却忽略了后续的文件存储和解析环境结果被封堵的思路换个姿势又进来了。所以文件上传不只是“上传”那一步的问题而是一条完整链路的问题理解这一点你才会真正重视它。1.2 DVWA这个靶场为什么适合练习文件上传DVWADamn Vulnerable Web Application是一套开源的PHPMySQL靶场应用内置了SQL注入、XSS、命令执行、文件上传等常见漏洞。它的设计思路特别对新手友好同一个漏洞提供低、中、高三个安全等级让你直观感受“校验强度不同攻击成本就不同”。文件上传模块在DVWA里是一个独立的页面可以直接上传文件然后去hackable/uploads/目录确认是否上传成功。三个等级的代码逻辑从几乎不设防到加MIME校验再到文件头校验随机文件名刚好覆盖了Web应用中最常见、也最容易被开发者写错的三类防护方案。你把这些代码读懂了再去理解真实站点的上传防护基本上就举一反三了。还有一点很加分DVWA的源码托管在公开的代码托管平台上下载和部署都不费劲整个环境可以完全跑在本地不会对任何真实站点造成影响。这也是我一直强调的学Web安全一定要有自己的实验环境靶场就是最好的练手对象。把DVWA里的文件上传三个等级过完你对“黑名单校验为什么不可靠”“文件头校验怎么绕过”“内容检测和随机文件名如何配合”这些问题就会有真真切切的手感。2. 环境准备手把手把DVWA靶场跑起来2.1 最简单的部署方式本地集成环境DVWA本身是PHP写的所以第一步需要有一个能跑PHP和MySQL的环境。很多新手会纠结用哪种组合我的建议是从简单出发Windows下用phpstudymacOS下用MAMPLinux下直接用LAMP或者Docker。这里我用phpstudy举例因为它在国内用的人多踩坑资料也好找。拿到phpstudy之后把Apache和MySQL启动起来然后在网站根目录默认是WWW目录下把DVWA源码放进去。下载方式很直接去DVWA的GitHub仓库克隆或者直接下载ZIP包。下载完成后解压把文件夹重命名成dvwa这样访问地址就是http://127.0.0.1/dvwa干净清爽。接下来最关键的一步是改配置文件。DVWA提供了一个配置文件模板叫config/config.inc.php.dist你需要把它复制一份重命名为config.inc.php。打开这个文件把数据库账号密码改成你本地MySQL的实际账号密码。phpstudy的MySQL默认账号一般是root密码默认是root如果你自己设过密码就用自己的。这一步看着简单但大部分人第一次部署失败都栽在这里。改完配置浏览器输入http://127.0.0.1/dvwa/setup.php进入安装页面。页面里会检查PHP扩展、MySQL连接状态等最好逐项确认都是绿色“可用”。往下拉会看到“Create / Reset Database”按钮点击后它会帮你初始化好数据库然后自动跳到登录页。默认用户名是admin密码是password进去之后就把默认密码改了免得之后做实验时Session串味。2.2 部署中的高频坑和排错经验我帮人排查DVWA部署问题时遇到过最多的几类情况第一页面打开是404。这个大概率是源码放的位置不对或者Apache的站点根目录没指向你放DVWA的目录。你在phpstudy的“网站”设置里看一眼确保WWW目录路径和实际一致就行。第二数据库初始化失败。表现为setup页面点了“Create / Reset Database”后页面卡住或者直接报错。这种情况先检查config/config.inc.php里的数据库账号有没有权限创建库另外确认MySQL服务已经正常启动。如果还是不行手动在MySQL里创建一个名为dvwa的库再回来点重置数据库。第三PHP版本过高导致兼容问题。DVWA毕竟是老项目高版本PHP比如PHP 8.2以上偶尔会触发一些废弃函数警告甚至直接白屏。建议用PHP 7.4或PHP 8.0的版本phpstudy里可以一键切换PHP版本非常方便。第四登录后页面乱码或功能异常。这个多半是配置里$_DVWA[ recaptcha_public_key ]和$_DVWA[ recaptcha_private_key ]没填。不影响文件上传功能但页面上会有Google的验证码控件报错直接忽略或者临时填个假key都可以。攻克这几个坑以后你的DVWA靶场就活了。登录进去找到“File Upload”模块就可以开始三个等级的通关之旅。2.3 准备好Burp Suite和AntSword等工具光有DVWA还不够攻防练习还需要几把趁手的工具。Burp Suite是必须有的它用来拦截和修改HTTP请求。文件上传的Medium等级就是要靠Burp拦截后把Content-Type改掉从而骗过服务端的MIME校验。社区版就够用不用急着上专业版。蚁剑AntSword是连接一句话木马的工具用来验证上传的PHP文件能否真正执行。作为安全学习者请务必清楚一件事以上所有工具和一句话木马只能用于本地靶场和合法授权的测试环境绝对不能拿去打真实网站这个底线不能破。3. Low等级实战连防线都没有的“裸奔”靶子3.1 先看Low等级源码再说怎么打Low等级是整个DVWA文件上传模块的最基础关卡也是我个人教学中必讲的一课。点击页面右上角的“View Source”你可以直接看到处理上传请求的PHP代码。Low等级的逻辑简单到令人怀疑人生?php if( isset( $_POST[ Upload ] ) ) { $target_path DVWA_WEB_PAGE_TO_ROOT . hackable/uploads/; $target_path . basename( $_FILES[ uploaded ][ name ] ); if( !move_uploaded_file( $_FILES[ uploaded ][ tmp_name ], $target_path ) ) { echo Your image was not uploaded.; } else { echo {$target_path} succesfully uploaded!; } } ?这段代码做了什么它直接把用户上传的原始文件名用basename()处理了一下然后拼接到服务器目录hackable/uploads/后面再调用move_uploaded_file()把临时文件挪过去。仅此而已。整个过程里既没有检查文件扩展名没有检查文件内容没有检查MIME类型没有限制文件大小也没用随机文件名。换句话说用户传什么它就收什么妥妥的“裸奔”状态。3.2 用一句话木马打通Low等级理解了代码逻辑攻击思路就非常清晰了。我直接创建一个文本文件名字叫shell.php里面的内容就是最常见的一句话木马?php eval($_POST[pass]); ?这里解释一下eval($_POST[pass])的含义eval()是PHP中可以把字符串当代码执行的函数$_POST[pass]是从POST请求里读取参数pass的值。组合起来就是“我传什么代码服务器就执行什么代码”相当于给服务器放了一个后门。注意符号是用来抑制错误信息回显的避免执行错误时暴露服务器内部路径。然后在DVWA的File Upload页面点击“浏览”选择这个shell.php点击“Upload”上传。页面回显的路径会类似http://127.0.0.1/dvwa/hackable/uploads/shell.php这代表文件已经成功落在服务器上了。到这里Low等级就算打通了接下来是验证环节。打开AntSword在“数据管理”里右键添加数据URL填写http://127.0.0.1/dvwa/hackable/uploads/shell.php连接密码填写pass编码器和连接类型保持默认即可添加完成后双击连接如果一切正常你会进入蚁剑的文件管理界面能看到服务器上的文件列表还能执行命令。这就意味着你通过文件上传漏洞拿到了服务器权限。整个流程从上传到连接前后用不了两分钟Low等级的核心就是“无校验直接上传可执行文件”。我这里必须加一句黑体提示以上操作只可能在DVWA靶场里做现实中未经授权对任何系统做此类测试都是违法的。4. Medium等级实战MIME检查形同虚设4.1 读懂Medium等级的校验逻辑Medium等级相比Low等级终于有了一点防护意识。先看源码里的关键部分?php if( isset( $_POST[ Upload ] ) ) { $target_path DVWA_WEB_PAGE_TO_ROOT . hackable/uploads/; $target_path . basename( $_FILES[ uploaded ][ name ] ); $uploaded_name $_FILES[ uploaded ][ name ]; $uploaded_type $_FILES[ uploaded ][ type ]; $uploaded_size $_FILES[ uploaded ][ size ]; if( ( $uploaded_type image/jpeg || $uploaded_type image/png ) ( $uploaded_size 100000 ) ) { if( !move_uploaded_file( $_FILES[ uploaded ][ tmp_name ], $target_path ) ) { echo Your image was not uploaded.; } else { echo {$target_path} succesfully uploaded!; } } else { echo Your image was not uploaded.; } } ?Medium等级新增了两道校验第一是检查上传文件的MIME类型必须是image/jpeg或image/png第二是限制文件大小不能超过100000字节约97KB。看起来有模有样但它犯了一个很经典的错误它检查的是客户端提交的$_FILES[uploaded][type]而这个值来源于HTTP请求头里的Content-Type字段完全是由客户端控制的。服务端代码里压根没有校验文件名后缀也没有校验文件真实内容这就导致原本Low等级的shell.php只要把请求里的Content-Type改成image/jpeg就能继续畅通无阻。4.2 用Burp改包绕过Medium等级实操时有两种方式可以过Medium。第一种是直接构造一个合法的图片扩展名上传但这样没法执行PHP代码。第二种就是我们真正要用的思路让服务端以为它是图片。具体操作是这样的在DVWA页面里选择之前的shell.php正常点击上传。同时打开Burp Suite的Proxy拦截功能确保请求被抓到。Burp的默认监听地址是127.0.0.1:8080需要把你的浏览器代理指向它。拦截到的POST请求里你会看到类似这样的片段POST /dvwa/vulnerabilities/upload/ HTTP/1.1 Host: 127.0.0.1 ... -----------------------------7e0d7e2d2c Content-Disposition: form-data; nameuploaded; filenameshell.php Content-Type: application/x-php关键是第二行Content-Type: application/x-php这就是服务端读取到的$_FILES[uploaded][type]。我把它改成image/jpegContent-Disposition: form-data; nameuploaded; filenameshell.php Content-Type: image/jpeg注意这里filename保持shell.php不变因为Medium等级不检查扩展名。改完之后点击Burp的“Forward”把请求发出去。回到DVWA页面会看到上传成功的提示。再到AntSword里用原来的URL和密码连接依然是顺畅进入。我实测过很多次Medium等级看似比Low多了一道关卡实际上只是多了“用Burp改一个字段”的操作。很多开发者以为设置了Content-Type校验就万事大吉却不知道这个参数是客户端随便改的。这个案例也是面试时很喜欢问的考点你能把原理讲清楚面试官一般都会点头。5. High等级实战文件头校验和随机名也拦不住5.1 High等级源码里藏着哪些心眼High等级明显比前两个级别费心思。继续看源码的关键逻辑?php if( isset( $_POST[ Upload ] ) ) { $target_path DVWA_WEB_PAGE_TO_ROOT . hackable/uploads/; $uploaded_name $_FILES[ uploaded ][ name ]; $uploaded_ext substr( $uploaded_name, strrpos( $uploaded_name, . ) 1); $uploaded_size $_FILES[ uploaded ][ size ]; $uploaded_tmp $_FILES[ uploaded ][ tmp_name ]; if( ( strtolower( $uploaded_ext ) jpg || strtolower( $uploaded_ext ) jpeg || strtolower( $uploaded_ext ) png ) ( $uploaded_size 100000 ) getimagesize( $uploaded_tmp ) ) { if( file_exists( $target_path . $new_name ) ) { $new_name md5( rand() . $uploaded_name ); } else { $new_name md5( rand() . $uploaded_name ); } move_uploaded_file( $uploaded_tmp, $target_path . $new_name ); echo {$target_path} succesfully uploaded!; } } ?这段代码里出现了三个关键变化第一个变化是检查文件扩展名并且用strtolower()把后缀转成小写白名单只允许jpg、jpeg、png。这意味着你不能直接传shell.php了至少名字上得“像”图片。第二个变化是调用getimagesize()函数。这个函数会尝试读取文件头信息验证它是不是一张真实图片。如果是伪造的图片马这一关也能让服务器确认它“确实”含有图片数据。第三个变化最有意思上传成功后文件名被改了变成md5(rand() . $uploaded_name)的哈希值。这意味着即使你上传了一张图片马也几乎无法预料它最终的存储文件名。如果把文件改名换成不可预测的哈希攻击者就不知道怎么去访问它也就没办法执行里面的恶意代码。综合来看High等级的防护思路从“拦截非法文件”升级成了“验证改名的组合拳”已经接近很多真实Web应用的防护策略。但DVWA既然设置了这一关自然就留有破解思路。5.2 用图片马配合文件包含漏洞完成High等级High等级的核心难点有两个一是让上传文件“看起来”是图片二是拿到被改名后的文件路径。对应解法分别是图片马和文件包含漏洞。第一步制作图片马。以最简单的PNG图片马为例找一个正常的shell.png在Linux下用命令echo ?php eval($_POST[pass]); ? shell.pngWindows用户可以用Copy命令copy 1.png /b shell.php /a shell.png这条命令的思路是把普通图片和PHP代码拼接到一个文件里。因为PNG的头部已经通过getimagesize()的检查而文件的末尾又追加了PHP代码只要服务器用PHP解析这个文件末尾的代码就会执行。第二步在DVWA的File Upload页面把这个图片马上传上去。由于扩展名是png文件头也是正常的PNG图片结构大小也没超标服务端会接受并把它重命名成一个随机哈希文件。看到上传成功的提示后你需要打开DVWA的“File Inclusion”模块。文件包含漏洞是同一个靶场里的另一个经典漏洞。你可以通过URL参数去包含服务器上的文件比如访问http://127.0.0.1/dvwa/vulnerabilities/fi/?page../../hackable/uploads/xxxx.png这里的xxxx.png就是你上传后那个随机文件名。如果你不知道怎么知道那个随机名可以在DVWA上传成功页面的源码里找响应内容中会返回存储路径。拿到路径后再用文件包含的方式去访问服务器的PHP引擎就会执行图片末尾的PHP代码。用AntSword连接URL填写http://127.0.0.1/dvwa/vulnerabilities/fi/?page../../hackable/uploads/xxxx.png密码pass连接成功后你就再次拿到了Shell权限。这个方法的核心逻辑是“不直接访问文件而是借助其他漏洞把图片马解析成PHP执行”也是真实环境中非常经典的组合攻击手法。5.3 High等级还有什么细节需要注意我实际操作High等级时踩过几个坑写出来给大家避雷。第一个坑是图片马的文件大小。如果追加的PHP代码过长会让整个文件超过100000字节的限制上传直接失败。所以代码尽量精简有时候一句?php eval($_POST[pass]); ?就够了实在不行用短标签? eval($_POST[pass]); ?配合short_open_tag开启也能生效。第二个坑是文件包含的路径计算。DVWA的目录结构里fi模块的当前目录离hackable/uploads/有几层你需要用../../正确地回到上级目录。路径少一层或者多一层包含就会失败页面会报错或者直接空白。第三个坑是某些PHP环境会压缩图片或重编码上传图片导致你在文件末尾追加的代码被吃掉。这种情况在高版本PHP配合部分图片处理库时会出现。如果遇到了可以换一张结构更简单的图片或者调整追加方式再或者直接用PHP原生环境关闭图片重写功能。把这些细节处理好High等级才算真正拿下。打到这一步你应该能明显感受到攻击者和防御者之间的“拉锯战”防御方每加一层校验攻击方就多一条绕过路径而真正的安全永远是把几套方案组合起来而不是依赖单点防护。6. 防御视角这份修复清单建议直接抄走6.1 服务端校验到底该做哪几件事每次在DVWA里通关一个等级我都会提醒自己把攻击打明白是为了在写代码时知道怎么防。下面这几条防御措施是在DVWA源码基础上结合真实项目经验总结出来的可以说是“反套路”压箱底清单。第一条也是最重要的一条用白名单校验文件扩展名而且必须结合服务端真实路径来处理。很多代码用$_FILES[uploaded][name]直接拿扩展名做校验但文件名是用户可控的不能全信。应该同时考虑pathinfo()函数得到的真实扩展名并且把允许的扩展名明确列入白名单比如只允许jpg、jpeg、png、gif。同时拒绝一切带“可执行”特征的后缀比如php、phtml、php3、php5、pht、shtml、cgi、asp、aspx、jsp。黑名单思路不推荐因为绕过的后缀种类太多大概率堵不完。第二条严格校验文件内容而不只是后缀。DVWA的High等级已经用了getimagesize()去验证图片头这算及格。但更稳妥的做法是使用图像处理库对上传文件重新编码比如用PHP的imagecreatefromjpeg()等函数重新生成图片这样图片本身的恶意代码会被破坏相当于从源头把“图片马”掐死。第三条对存储文件名做随机化处理。像DVWA High等级那样用md5(rand())改名从安全角度是明智的。即使文件成功上传攻击者也猜不到访问路径。再进一步可以把上传文件放到Web根目录之外的目录通过专门的下载脚本去读取文件这样就算有人上传了恶意文件也无法直接通过URL访问到它。第四条控制执行权限。服务器配置上上传目录不应该有执行PHP的权限。比如在Nginx或Apache配置里对hackable/uploads/目录全部设置为“禁用PHP解析”。这是挡死后门的关键手段即便攻击者上传了包含PHP代码的文件放在这个目录里它也只会被当作纯文本输出不会被执行。6.2 上传点常见的XSS风险也要一起修文件上传除了直接让你执行代码还经常成为存储型XSS的入口。DVWA里没有专门展示这种风险但你在真实网站的参数上传功能中很常见用户传一个SVG文件里面包含script标签其他用户打开该图片时脚本就会执行。这类问题的修复方式是在上面扩展名白名单和图片重编码的基础上再加上一个关键动作上传文件时对文件名、文件类型、文件大小做全面校验同时在展示用户上传内容时给响应头加上Content-Disposition: attachment之类的强制下载标识防止SVG、HTML这类文件在浏览器中直接渲染。另外存储型XSS的修复可以结合输出编码来做。很多框架内置的模板引擎自带HTML实体编码确保script不会被当作标签执行。不要把用户原始上传的文件名直接反射到页面里而是先做一层HTML编码再输出。这一步虽然看起来不起眼但能堵掉不少坑。6.3 从DVWA等级看真实防御的进化路线把DVWA的三个等级连起来看其实就是一个Web应用安全防御的进阶路线图。Low等级对应的是完全没有任何安全意识的年代“能跑就行”是很多老代码的写照。Medium等级代表很多团队意识到要校验但只做了“表面功夫”的阶段校验用户给的内容而不是服务端内容很容易被绕过。High等级就已经逐渐接近攻防平衡的现实状态多项校验叠加、随机文件名、最小权限执行这些思路在真实站点里都是加分项。但现实里永远不存在“绝对安全”。DVWA的High等级依然能被图片马文件包含的组合拳打穿恰恰说明一个道理安全防护必须是分层、立体、互相制约的。上传校验、目录权限、解析规则、整体架构任何一环缺失都可能让前面的努力白费。7. 常见问题速查与通关心得7.1 文件上传练习中的高频报错汇总这三个等级练下来加上平时帮朋友们解决各种卡壳问题我把高频报错整理成一张速查表你们遇到问题可以对照着排现象可能原因解决办法上传PHP文件后提示成功但访问URL返回404存放目录或路径写错或者文件名被随机改名以页面回显的完整路径为准或查看源码里的上传目标路径Medium等级改了Content-Type仍失败改错字段改成了请求头里的公共Content-Type要改的是Content-Disposition后面filenameshell.php下方的Content-Type字段High等级上传图片马返回“not uploaded”图片马文件太大超过100000字节精简PHP代码或使用更小的图片文件文件包含图片马后返回空白页路径深度不对或者图片马代码没有生效多试几次../../和../组合确认图片文件中PHP代码格式正确AntSword连接失败上传的文件没有被解析为PHP或密码和代码里的变量名不一致确认上传目录没有禁用PHP执行确认一句话木马里的$_POST[pass]和AntSword密码一致浏览器访问DVWA页面白屏PHP版本过高兼容性问题切换到PHP 7.4或8.0版本开启对应扩展如果你卡在某个环节先别急着怀疑工具回到源码确认一遍校验逻辑往往会比自己瞎猜快得多。排查问题的时候DVWA的“View Source”页面就是你最好的帮手它把所有服务端逻辑摊开给你看比任何文档都清楚。7.2 三个等级打完之后我学到什么文件上传这个模块练完我有几点很深的体会分享给后面要练的朋友。第一点不要止步于“能绕过”要养成看源码的习惯。很多人打DVWA就是拿工具一通操作Low上传成功、Medium改包成功、High图片马成功就觉得完事了。但真正值钱的是每一步背后的原理这个等级为什么能绕服务端哪一行代码有疏漏换一个场景我还能不能绕这些问题想明白了你才算真正把这关吸收掉。第二点工具用得再熟也要会手动构造请求。比如Medium等级用Burp改一个HTTP头确实很轻松但有时候你需要在没有Burp的临时环境下快速复现问题那就得能手动拼POST请求。我建议你在命令行里用curl把Medium等级的绕过流程手动走一遍这对理解HTTP协议和文件上传机制帮助很大。试想一下你在安全测试中遇到的站点往往比DVWA复杂得多纯靠自动化工具很容易漏掉关键细节手动构造请求的方式会帮你更深入地理解系统的反应。第三点安全测试的边界感非常重要。DVWA这类靶场之所以存在就是为了让大家在合法、可控的环境里练手。你在这里学到的手法、思路、工具只能用于授权范围内的安全测试和防御建设绝不能拿去做任何未经许可的攻击。守住这条底线你才能在安全这条路上走得更远。我在实际工作中就遇到过不止一次这样的情况有人把靶场里学到的手段直接拿到公司内网或客户环境里去“试”结果引发生产事故轻则被通报批评重则要承担法律责任。安全的第一课不是技术而是边界意识。7.3 后续还能往哪几个方向扩展DVWA文件上传通关只是起点。如果你想继续深挖这个方向我建议按下面的路线走每一层都是让你“进阶”的跳板。第一层升级你的“武器库”。比如学习如何制作更加隐蔽的Webshell了解各种编码绕过流量检测的思路。这里要强调研究的目的在于更好地防御比如分析恶意文件特征、加密流量识别这些能力对防守方同样重要。第二层把文件上传漏洞和其他漏洞组合起来看。比如尝试用文件上传配合目录遍历把文件写到预期之外的目录或者配合解析漏洞利用Nginx、Apache的特定配置绕过限制。我上面提到过图片马文件包含的组合这只是一个引子真实攻击链通常更复杂。你可以试着在DVWA里把SQL注入、文件包含、文件上传串成一条攻击链看看能不能一步步完整地控制服务器这会非常考验你的整体思路。第三层从“攻击”转向“防御”尝试自己修复DVWA的源码。把Low等级的代码改造成带有完整校验的版本再以High等级的思路去攻击检验你的修复是否有效。能防住自己攻击的修复才是真正靠谱的修复。这种“自己动手补洞”的思路对我后来的开发工作帮助非常大。文件上传漏洞看似是个小点但它牵连着Web安全的很多核心概念。你如果能把DVWA这个模块从原理、绕过、防御到组合利用都理清楚以后不管是做渗透测试、安全开发还是代码审计都会比别人多一分底气和从容。
返回列表