首先介绍一下本人在四年前刚刚接触网络安全行业目前是211本科在读之前一直在学习计网数据库C语言编程等基础知识在某国企公司的安全运维岗位实习之后感觉学到了很多东西近半年开始动手实操学习一些渗透内容文章写得很多地方的观点肯定是浅薄的请各位前辈多加指点。本篇文章主要是写给那些和我之前一样刚刚接触sql注入的新人帮助理解因为我觉得sql-labs是一个不错的训练靶场所以就把自己训练和搭建时候的一些心得写下来注文章可能会非常长而且因为考虑到会解释很多基本原理可能会显得比较冗余大家根据目录自行选择观看请大家耐心阅读^_^靶场搭建本地部署首先也是很多新手同学可能和我一样就是搭建靶场的时候会遇到一些小问题我首先尝试了在自己的主机上部署sql-labs源代码下载地址是在Audi-1/sqli-labs: SQLI labs to test error based, Blind boolean based, Time based. (github.com)选择下载zip即可然后下载一个小皮面板小皮面板(phpStudy) - 让天下没有难配的服务器环境把解压之后的文件夹放到小皮的WWW根目录中解压缩之后打开sqli-labs-master在里面中找到一个叫sqli-connections的文件并用记事本的方式打开这个db-creds.inc把里面有一个$dbpass ;在单引号中间写入小皮数据库的默认密码root改好之后启动小皮面板的apache和mysql然后浏览器打开http://127.0.0.1/sqli-labs-master/即可看到如下界面至此在本地部署sqllabs就算是大功告成了这里有些步骤不太清楚的可以看一下其他人的搭建过程讲解的都很详细本地部署中的网络原理首先要知道我们部署sqllabs是相当于在本地搭建了一个靶场来让我们更好地练习sql注入而不受限于授权网络等其他因素。在github上下载的压缩包就是这个靶场的核心代码也就是这些关卡背后的运行小皮面板就相当于是一个方便我们搭建网站的工具箱能一键安装apache服务器mysql数据库php解析器如果没有这个工具箱这些环境都是需要我们手动搭建的过程很复杂也很容易报错。其中mysql就是我们常说的数据库也就是sql注入的主要目标对象也是sqllabs的数据存储的地方我们进行sql注入的目的也就是要拿到数据库中的一些敏感信息从而进行进一步渗透。apache服务器则是负责web服务能是本地的浏览器和mysql和php连通相当于一个连接器把浏览器和后端的数据库和php代码连接让用户能在本地打开sqllabs。接收请求寻找文件调用php代码返回网页给浏览器。php代码则是sqllabs靶场的核心其中有前端的页面和与后端数据库的连接具体是怎么连接的后续会在代码中进行解释。有了这些条件我们用于在本地练习sql注入的sqllabs靶场就搭建好啦下面我给各位介绍第二种更简便的搭建方式靶场搭建docker部署个人推荐之前我们说过小皮面板帮我们把web服务器和php代码和mysql数据库都集成到一个地方方便我们启动那有没有一种工具能帮助我们把需要的环境一键打包全配置在一个类似于包装袋的容器里而我们只需要打开这个包装袋直接使用就好了呢答案是肯定的。在linux系统中有一款工具通过将应用与完整运行环境打包为镜像实现应用的一键部署、隔离运行、跨平台迁移为我们搭建一些复杂的环境提供了极大地便利就是docker。现在我们也同样能在windows操作系统中使用docker尤其是搭建sqllabs非常的便捷。首先我们找到docker官网并下载windows版本docker desktop安装好之后我们打开会看到如下的界面我们可以选择登录或者注册自己的docker账号这样我们以后如果开发了一些靶场或者工具可以直接打包到docker镜像源网站上上供别人下载。如果没有可以不用使用账号登录选择下方的跳过登录没有账号不会影响我们在本地的部署我们之前在docker上拉取过的一些镜像在我们第二天再打开电脑进入docker的时候还会存在。然后就是拉取镜像docker的内容操作都是在命令行中也就是我们常说的cmd按住四个小方块和R然后在输入框中输入cmd进入终端我们尝试输入命令docker pull acgpiano/sqli-labs拉取sqllabs镜像这时候我们可能会因为网络问题失败。因为我们执行这个命令之后会访问国外的网站节点进行拉取镜像。失败的话我们需要对docker进行换源就是把拉取镜像的地址换成我们访问速度较快的国内镜像源比如https://docker.xuanyuan.me我们进入之后打开上方的设置打开docker engine配置界面我们可以在这些国内镜像源的官方网站上找到更换镜像源的代码我们复制粘贴即可然后点击右下方的apply即可。此时我们很大概率就能成功拉取到镜像如果还是失败可以看一下镜像源是不是配置成功或者把网址复制一下看看在浏览器中能不能访问一般在浏览器中都打不开的镜像网站拉取镜像也会失败。成功之后我们会看到如下此时我们点击小三角启动镜像即可然后点击中间的8080端口就可以直接跳转到我们的sqllabs靶场中。采用docker搭建靶场的方法比较简便而且不会影响我们物理机上的一些配置之后我们搭建其他环境也能利用docker搭建非常适合搭建靶场这一类临时使用的环境。开始注入1-4关联合注入第一关经过前面简单的搭建过程我们就算是正式进入了sqllabs靶场首先第一个要掌握的SQL注入技能点就是联合注入核心原理前置联合注入的前提条件前后查询列数一致、数据类型兼容、页面有回显能看到查询结果。通用注入流程1-4 关完全遵循仅闭合方式不同① 定位注入点 → ② 判断闭合方式 → ③ 确定查询列数 → ④ 找到回显位 → ⑤ 脱库 / 表 / 列 / 数据首先我们来看第一关的php代码 在docker中打开终端然后cat查看这个目录顺序下的文件就能找到第一关的后端php代码绝对核心决定注入方式的 SQL 语句$sqlSELECT * FROM users WHERE id$id LIMIT 0,1;用单引号包裹用户输入的$id→ 明确是字符型注入必须用闭合再用--注释掉后面的 LIMIT 0,1直接把用户输入拼进 SQL无任何过滤 → 这就是 SQL 注入的本质用户可控输入直接进入 SQL 执行对比其他关卡1-4 关的唯一区别就是这一行的闭合符号单引号 / 无引号 / 单引号 括号 / 双引号 括号回显逻辑决定你能用联合注入的关键这部分解释了为什么前 4 关能用UNION SELECT直接拿数据页面会把 SQL 查询的结果用户名、密码直接回显到页面上这是「联合注入」的前提有回显位才能把我们构造的查询结果展示出来于是我们进行如下步骤我们看到我们输入id页面就能返回账号用户名和密码这是前几关给新手们的一个入门福利让我们不通过注入也能直观的看到账号密码属于是网站页面主动公开的内容而我们进行SQL注入就能越权获得数据库内的所有用户和密码接下来是注入过程操作用ORDER BY逐次测试ORDER BY N表示按第 N 列排序当 N 超过实际列数时SQL 会报错?id1 ORDER BY 1 --→ 正常返回?id1 ORDER BY 2 --→ 正常返回?id1 ORDER BY 3 --→ 正常返回?id1 ORDER BY 4 --→ 页面报错✅ 结论原查询共有3 个字段操作用UNION SELECT构造虚拟查询判断显示位用id-1让原查询失效数据库无 id-1 的用户原查询无结果仅显示我们构造的UNION查询结果访问http://localhost:8080/Less-1/?id-1 UNION SELECT 1,2,3 --预期结果页面显示Your Login name:2、Your Password:3✅ 结论第 2 列、第 3 列是页面回显位后续将数据放入这两列即可。使用 MySQL 内置函数database()获取当前数据库名访问http://localhost:8080/Less-1/?id-1 UNION SELECT 1,database(),3 --预期结果页面显示emails,referers,uagents,users✅ 得到目标表users存储账号密码的核心表原理group_concat()可将多行结果合并为一行避免分页问题一次性获取所有表名。limit 0,1控制返回结果行数可选你之前踩坑的关键作用只返回查询结果的第 1 行数据也就是Dumb的账号密码和你正常输入?id1拿到的结果一致。执行后页面会直接显示plaintextYour Login name:Dumb Your Password:Dumb✅ 成功拿到用户的账号密码完成 Less-1 的通关。第二~四关详细解释了第一关的注入原理之后相信同学们对联合注入有了一定的了解后面的2~4关和第一关有异曲同工之妙利用UNION SELECT都能直接注入和第一关唯一的区别就是闭合符号的不同。1 关2 关无3 关)4 关)接下来我们依次查看每个关卡的源代码第二关$sqlSELECT * FROM users WHERE id$id LIMIT 0,1;其中这条语句中的$id没有任何引号包裹直接拼接属于数字型注入我们在注入的时候去掉id1后面的单引号即可第三关相信聪明的你已经发现了我们只需要把注入语句这样改 ?id1) -- 再套用less1同样的步骤即可通关第四关同样的本质上和前 3 关一样都是有回显的联合注入只是闭合方式不同你输入的$id被包裹在双引号 括号里($id)所以必须用)来闭合前面的和)再用--注释掉后面的内容。标准闭合测试语句为 ?id1) --5-6关第五关第五关和前面的关卡有所区别主要在于页面不会返回查询结果只会显示两种状态You are in...或者 SQL 报错就像下面这样于是我们就利用到了新的攻击方式报错注入。其核心原理就是利用 MySQL 函数的语法错误 / 格式错误触发数据库报错将查询结果打印到报错信息中。在页面无显示位但是有报错信息的时候联合注入就失灵了此时我们采用报错注入。报错注入利用到的函数updatexml(1, 非法xpath路径, 1)如果第二个参数不是合法 xpath 语法MySQL 抛出报错会把里面拼接的字符串显示在报错信息于是我们利用这个思路构造如下语句来尝试得到数据库名?id1 and updatexml(1,concat(0x7e,(select database()),0x7e),1) --我们可以看到报错信息和我们想要的数据库名被一并打印到了页面上有了这个思路接下来的注入就顺水推舟了继续爆破所有表名接下来是列名然后就是我们经常说的sql注入的最终目的爆破出用户名和密码当然实战中数据库会存储很多敏感信息可能不止用户名和密码要根据厂商信息和测试范围选择sql注入在一些情况下也可以和其他漏洞结合来拿到webshell第六关第六关的思路和第五关几乎一模一样唯一的差别就是后端的闭合符号是双引号 不是单引号 ,可以看到语法上只有一个单双引号的变化其余思路都相同所以余下步骤就不过多赘述了?id1 and updatexml(1,concat(0x7e,(select database()),0x7e),1) --通过对比二者的后台代码即可观察出注入方式的不同7-8关第七关第七关和前面六关都不太一样首先我们来看第七关后台代码SELECT * FROM users WHERE id($id) LIMIT 0,1根据后台传参的形式我们可以构造如下测试语句?id1)) and 11 %23测试后发现同样没有显示位我们此时可以用到一个新的注入方式名为布尔盲注。这种注入方式相比于前面几种最大的区别就是没有回显通俗一点来说只有对与错这对于我们来说想要一步步得到数据库中的用户名密码就相当麻烦了就像谈恋爱一样问女朋友吃什么她会说你来定这时候就需要列举出你能想到的好吃的然后逐个说出来观察她的反应如果没反应说明她不想吃如果有反应就证明想吃确定了吃什么之后下一步就是饭后的娱乐活动去做什么以此类推。好了停止幻想了我们回到网络世界来。此时我们如果想要爆破出数据库名首先要构造判断语句如下http://localhost:8080/Less-7/?id1)) and ascii(substr(database(),1,1))115 --payload模板ascii(substr(database(),第几位,1))ASCII码库名securitys(115) e(101) c(99) u(117) r(114) i(105) t(116) y(121)聪明的你此时应该想到了如果在不知道对方数据库名的情况下是不是要根据英文字母的ASCII码一个个来试呢答案是对的。这里关于ASCII码就不过多赘述了可以看到当我们正确判断时页面会正常回显。此时我们调个皮比如你女朋友已经明确了要去吃火锅结果你说行啊那我们去吃烤肉吧这时候就会解锁你女朋友的第二形态第二张图中的ASCII码改成了125此时你便具象的知道自己的错误了库名的接下来几位也是同理包括表名啦字段名都要来一位位测试。你肯定会觉得很麻烦这时候就不得不提到我们sql注入界的扛把子--sqlmap关于sqlmap工具的使用下一章节敬请期待 后面的步骤主播就不给大家一一演示了大家感兴趣可以自己下去尝试第八关第八关就和第七关的亲兄弟一样第七关的闭合是1)) 第八关则是1‘后面的步骤相同主播这里同样也不多赘述了麻烦的手工盲注补药9-10关第九关既然已经提到了盲注那这两关也是不可避免的又开始了繁琐的盲注这两关的盲注更甚连对与错都没有提示这次你换了个更难猜的女朋友你这次更加小心了你问你女朋友吃不吃火锅她没有回应你尝试着收拾东西让她听到过了五秒她也开始收拾东西了这时候你才知道你又赌对了一次。这两关是时间盲注究其原理也不难就是在之前布尔盲注的基础上加了一个时间来判断对错我们来看靶场这次我们构造如下payloadhttp://localhost:8080/Less-9/?id1 and sleep(5) --这次我们输入之后可以看到网址那一块一直转圈我们默数五秒发现刚好不转圈了此时就说明测试时间盲注成功了。也可以改成十秒一秒无所谓就是快慢的问题这是因为只有当前面的语句判断成功之后才会执行时间函数sleep明白了原理接下来就又是我们的老朋友盲注了只不过这次他换了一种方式判断对错。第十关时间盲注就不逐个演示了第十关和第九关同样是兄弟关只不过第十关的闭合方式换成了双引号11-14关第十一关也是终于送走了盲注我们终于迎来了新的章节之前的章节在看后台代码时懂行的可能已经看出来了我们的参数都是在GET下进行传递的我们打开第十一关发现这里居然就有登录框等着我们插入我们当然要奉行网安界的宗旨见框就插于是我们尝试把sql注入语句插入到登陆框里发现没有显示位于是我们想起了老老朋友报错注入遇见了盲注之后突然觉得报错注入人也不错。于是我们在用户名插入报错注入的payload随便填写一个密码 and updatexml(1,concat(0x7e,database(),0x7e),1) --就得到了如下报错信息大喜遂循规蹈矩逐个获得库表字段名再获取敏感信息那为什么之前要提到GET传参这是一种网站前端传给后端的方式不了解的同学可以去搜一下呢因为在这里我们传参的方式从GET转为POST了要不然sqllabs也不会又把同样的东西重新教给我们一遍。我们打开后台代码发现哦传参方式好像真的不一样了之前使用GET传id现在则是用POST传用户名和密码而POST和GET这二者有什么区别呢✅ GET直接浏览器地址栏粘贴 payload回车就能测试不需要抓包工具抓包工具BP的使用敬请期待新章节✅ POST 方式 1直接在网页表单输入 payload比如登录用户名框Less11方式 2Burp 抓包修改 body 里的参数提交更通用不能直接在浏览器 URL 地址栏写 POST 参数第十二关十一关的兄弟关只有闭合方式变为了)第十三关同上闭合方式变为’第十四关同上闭合方式变为”如果看到这里你还不知道闭合方式的变化是社么意思那真要好好拷打了15-16关人们又回想起被盲注支配的恐惧没错盲注他又回来了第十五关可以说是时间盲注的POST版本也可以说是POST注入的时间盲注版本和之前的时间盲注相比只是注入的位置变成了登录框传参方式变成了POST.但是此时如果你还沿用之前的时间盲注模板采用sleep函数也许不会生效这是我们需要换一个函数benchmark同样是成功了就会延迟的设定) and benchmark(5000000,md5(abc))#接下来盲注的步骤就无需多言了吧第十六关和第十五关又是互为兄弟关只是闭合方式有所改变这里给大家留个小任务大家可以自己下去去后台代码看一看然后自己构造闭合17-22关各种不同的注入位置接下来的几关变化就主要在于注入位置的改变从POST到GET到ua头再到referer头等等我们的老朋友报错注入他又回来啦第十七关通过后台代码审计我们可以发现用户名 uname 做了过滤无法注入注入点在【新密码 passwd 输入框】我们随便输入用户名然后在密码框输入如下测试注入发现页面返回报错 and 11 --可以看到错误页面蓝色回显正确页面红色回显于是接下来盲注的流程相信大家到这已经很熟悉了接下来的几关我也不再一一赘述了第十八关这次的注入点放在了ua头中第十八关的原理登录成功之后网站把你的 User-Agent 请求头插入数据库日志注入点就在 User-Agent 头。所以我们首先要利用正确的账号密码登录这里我们用默认账号密码admin输入然后打开BP准备抓包关于BP的详细配置可以看其他博主的文章关于BP的使用后面我会单独出一篇文章我们点击提交并拦截请求如下这里注意BP的代理端口不要和docker中运行sqllabs的端口冲突我们找到ua头user-agent这一行把ua头的内容修改为我们的sql报错注入语句可以看到页面成功返回了数据库名那接下来的流程就是库表字段然后获取敏感信息老生常谈了第十九关第十九关和第十八关如出一辙甚至连闭合方式都没有发生改变我们还是先抓个包唯一变化的是这次的注入点换到了referer头我们找到referer头的这一行利用同样的报错注入语句可以看到库名被成功的爆了出来接下来的流程就不必多说了第二十关和前两关一样一样的这次又换了个位置换到了cookie唯一一点变化就是这次我们抓到登录的包要先放行等登陆成功回显给我们的那个包才是我们的目标我们依旧老一套新方法找到cookie替换注入看报错回显第二十一关注入点和第二十关相同但是这一关的cookie值做了base64的一个编码如下这个不懂得小伙伴可以理解为把 Cookie 里的内容做 Base64 编码Base64不是加密只是编码没有密钥任何人都可以解码后台拿到 Cookie 值后先执行 Base64 解码再拼入 SQL 语句所以我们的注入 payload 也需要先 Base64 编码再放到 Cookie 中所以对应的后台就会有一个解密我们这里就顺着他的思路走把我们的注入语句也用base编码一下再传进去依旧顺利的拿到了库名啊没毛病老铁第二十二关与二十一关无本质区别唯一区别在于闭合方式变成了双引号这里就放图大家自行感受吧结语那么如果你认认真真一字不差的看到了这里那么恭喜你成功入门了sql注入当然这只是入门对于sql注入还有很长一段路要走。大家可能会有很多疑惑你这后台代码都给我亮出来了我还能不会我想去挖个真实网站的也看不到人家的后台代码啊所以我们就需要用不同的闭合方式不同的注入方式来逐个测试sqllabs靶场的目的呢是让大家彻底明白SQL注入的原理以及利用带大家跨过了第一道门槛后续我还会继续出文章关于SQL注入的进阶实战工具篇教大家在黑盒层面下如何进行SQL注入漏洞的挖掘最后感谢大家的支持希望大家关注后续一定会持续跟进。声明本文所有内容仅用于本地靶场学习未经授权不得对互联网任何真实网站进行渗透测试
企业数字化 ERP 产品动态
相关推荐
2026.9.22:3台服务器安装kubernetes集群最新版 3台服务器安装kubernetes集群最新版
hostnamectl set-hostname k8s-n1
hostnamectl set-hostname k8s-n2
hostnamectl set-hostname k8s-n3对所有的三台服务器设置/etc/hosts:
sudo vim /etc/hosts这里由于是局域网,就使用局域网来进行k8s的互通!!!
4. 关闭 Swap
为什… · 2026/9/24 15:34:31
工业振动传感器选型12个生死问题:温度、冲击、EMI全解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 15:34:31
com0com虚拟串口在Win10/11安装排错:解决设备感叹号与驱动签名冲突 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 15:34:24
Sure 仓库的 AI 指令适配层:多 Harness 指令入口的统一维护实战 金融科技后端前端移动开发桌面应用AI 应用 【免费下载链接】sure The personal finance app for everyone (by everyone) 项目地址: https://gitcode.com/gh_mirrors/sure5/sure 点击查看 免费下载 本篇技术指南围绕 Sure(个人财务管理应用)… · 2026/9/24 16:33:20
CSP-S 2026 初赛试题解析(第二部分:阅读程序题(第一题))精讲 2026 CSP-S 第一轮真题第二部分阅读程序第 1 题:《二进制除法》答案是:16:对✅️,17:对✅️,18:错❌️;19:C,20:B,21:C。一… · 2026/9/24 16:33:20
Visual C++ 6.0 MFC 单文档工程的多语言实现方案 1. 引言
在 Visual C++ 6.0 时代,MFC(Microsoft Foundation Classes)是 Windows 桌面应用程序开发的主流框架。然而,其单文档工程(SDI)存在一个显著的限制:一个工程只能关联一个资源文件(.rc)。这意味着编译生成的可执行文件(.exe)默认只能包含一种语言的界面资源(… · 2026/9/24 16:33:14
四路can转4G在现场应用中有什么问题? 一、现场使用 SG‑CAN‑4G‑410 网关,电脑通过网口配置设备,配置软件搜索不到设备,需要从哪些方面排查处理。 首先确认设备供电正常,PWR 电源灯常亮,RUN 系统指示灯处于闪烁运行状态;电脑网线连接设备 LAN … · 2026/9/24 16:33:14
AI Agent酒店预订:为什么大多数Demo都停在“推荐”这一步? 开篇:AI Agent能聊会道,但90%的酒店预订Demo卡在"推荐"阶段
2026年,AI Agent的浪潮席卷企业服务市场。携程商旅与艾瑞咨询联合发布的《2025-2026商旅管理市场白皮书》显示,59%的企业有意向或正在尝试将AI能力与企业管理… · 2026/9/24 16:33:14
MappingSpace ALM到底接入了哪些AI大模型? 前段时间,我们拍了一支 7 分钟“爽片”,把汽车研发工程师的日常浓缩成几个高能瞬间:
1. 100 页客户需求 PDF,30 秒概括其核心要点,并一键导入到MappingSpace系统中,形成结构化、条目化的思维导图ÿ… · 2026/9/24 16:33:08
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44