sqli-labs靶场通关笔记
文章平均质量分 60
本专栏系统记录通关经典SQL注入靶场sqli-labs的全过程笔记。从基础报错注入到高阶盲注、堆叠注入、绕过WAF等技巧,逐一拆解关卡核心原理与Payload构造。内容包含详细步骤、代码分析、漏洞原理,适合Web安全初学者掌握基础知识。
骑猪走天涯i
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
关于sql盲注的补充
ascii表中,字母A-Z的范围是65-90,a-z范围是97-122。2.判断当前数据库的长度(假定需要的数据就在当前数据库中);(1)判断首位字符是大写字母还是小写字母(确定范围);5.判断该张表的首位字符,依次判断得到表名users;4.判断其中一张表的长度(假定需要的是第四张表);3.逐个字符判断当前数据库的名称;3.判断当前数据库中表的数量;1.首先判断数据库的数量;7.判断出三个字段的长度;8.判断出三个字段的名称;这样就拿到了字段中的数据。9.判断字段id中的值;6.判断表中字段数;原创 2025-10-27 12:06:41 · 203 阅读 · 0 评论 -
sqli-labs靶场通关笔记:第54-65关 寻找密钥
终于来到了靶场的第四大关,挑战环节。要求在规定次数内找到密钥并且提交(超过规定次数,密钥会重置)。这里会把前面所学到的知识进行应用。本关有10次注入机会,首先还是判断闭合方式,正常输入id=1看页面结果,再输入单引号或其他字符,看是否报错和是否有报错回显,这里判断是否可以报错注入。如果不行,继续尝试union注入,盲注等其他注入方式。原创 2025-07-22 11:48:09 · 369 阅读 · 0 评论 -
sqli-labs靶场通关笔记:第46-53关 order by注入
和上关的区别是使用了单引号包裹,要注意的是,这会导致 SQL 语句将$id当作一个字符串常量来处理,而不是列名或排序索引。由于字符串常量没有实际的排序意义,MySQL 会忽略这个排序条件,通常会按照表中数据的默认顺序返回结果,也就是插入数据时的顺序或者存储引擎决定的物理顺序。因为MySQL 优化了常量表达式:当 IF 的两个分支都是常量时,MySQL 可能认为无论条件如何,排序规则都不变,因此忽略条件判断。当sort=1时是根据第一列的字段id来排序,sort=2时根据username字段排序。原创 2025-07-21 21:03:17 · 527 阅读 · 0 评论 -
sqli-labs靶场通关笔记:第38-45关 堆叠注入
SELECT 1 --+,若页面正常显示,说明数据库支持多语句执行。本关和42关区别在于,42关在执行 SQL 查询时,如果 mysqli_multi_query 或 mysqli_store_result 失败,会输出 MySQL 错误信息。如果页面正常显示,说明 mysqli_multi_query 函数成功执行了这两条 SQL 语句。如果数据库不支持多语句执行,那么在执行 mysqli_multi_query 时会出错。本关和39关的区别在于,39关输出了报错信息,可以利用报错注入。原创 2025-07-21 12:39:08 · 833 阅读 · 0 评论 -
sqli-labs靶场通关笔记:第34-37关 宽字节注入的其他情况
本关设置的是mysql_real_escape_string函数转义,它和addslashes函数的转义功能相同,不同点在于会匹配数据库连接的字符集,更有效处理多字符字节。该函数已在PHP5.5.0被弃用,PHP7.0.0移除。本关依然使用addslashes函数对输入的id值进行过滤,但是id值并没有引号包裹,所以不用绕过引号,可以直接注入。这是一种无效的防御。本关是POST提交方式,对用户名和密码的输入都使用addslashes函数过滤,但是编码仍然是GBK,那么利用bp抓包来进行宽字节注入。原创 2025-07-20 20:53:55 · 425 阅读 · 0 评论 -
sqli-labs靶场通关笔记:第32-33关 宽字节注入
3. 然后这个字符串被拼接到SQL语句中,SQL语句在数据库里执行时,数据库使用的是GBK编码,它会将两个字节看作一个汉字。其中0xBF和0x5C(反斜杠)组合在一起,被当作一个GBK字符(这个字符是“縗”,读cuī)。%bf 是一个特定的字节(十六进制为0xBF),它属于GBK编码的第一个字节范围,所以当它后面跟着一个字节(比如0x5C,即反斜杠)时,它们会组合成一个GBK字符。利用多字节字符编码特性,构造特殊字符,使原本被转义的字符在编码转换过程中逃逸出来,从而产生了宽字节注入攻击。原创 2025-07-19 20:13:52 · 488 阅读 · 0 评论 -
sqli-labs靶场通关笔记:第29-31关 HTTP参数污染
构造测试语句:这里id=1返回的是用户Dumb,id=1&id=2返回的是用户Angelina,也就是说实际上第一个id被用于白名单检查,第二个id被用于sql查询。原创 2025-07-18 16:30:59 · 338 阅读 · 0 评论 -
sqli-labs靶场通关笔记:第27-28a关 union、select过滤
例如,28关代码无法防范单独使用 select 或 union 的注入,而第一段代码对这些情况有专门的过滤。查看源代码,相比27关对代码进行了优化精简,移除了单个关键字过滤,修改为union、select组合过滤,优化了正则表达式,使用了 /i(不区分大小写),\s(匹配任何空白字符)修饰符。%0a替换空格,代码会移除union select组合,这样前面的un和后面的ion select就会被拼接成union select语句而产生注入。又加上了对select、union的过滤,看下源代码。原创 2025-07-18 11:10:50 · 749 阅读 · 0 评论 -
sqli-labs靶场通关笔记:第25-26a关 and、or、空格和注释符多重过滤
写语法的时候,这两关出现报错太多了,空格过滤是最麻烦的地方,虽然可以用其他字符串代替,但是很多字符会出现不被解析的情况,而且有的字符被解析为空格,语法仍然会报错。在用union%0bselect尝试时就一直报错,猜测是空格过滤破坏了union联合注入的语法结构。加上注释符过滤,双写绕过,多种绕过同时使用可能会对语法结构造成一定影响。那么,多尝试其他办法,总是好的。可以利用其他编码的字符代替空格,如%C2%A0,但是有的不一定会被解析。本关页面给了提示,会对输入进行过滤,用语法测试发现过滤了。原创 2025-07-17 19:02:38 · 447 阅读 · 0 评论 -
sqli-labs靶场通关笔记:第24关 二次注入
mysql_escape_string() 是 PHP 语言里用于处理 SQL 查询的一个函数,其主要功能是对字符串中的特殊字符进行转义操作,不过在 PHP 5.5.0 版本之后已被弃用。但是在插入数据这行代码中,变量名$username使用了双引号包裹,而双引号会解析转义字符\',将它还原为单引号,导致最终存储到数据库中的用户名还是admin'#。攻击者第一次创建的admin'#用户名被存储到数据库中,当攻击者进行第二次操作,也就是修改密码时,会发生什么?再看一下修改密码的源代码中核心的一句。原创 2025-07-17 10:18:27 · 726 阅读 · 0 评论 -
sqli-labs靶场通关笔记:第23关 注释符过滤
这句话保持了语法完整,闭合了末尾单引号,用or构建了永真条件,'1'(字符串)比1(整数)更严谨。思考一下,单引号闭合,加了注释符还报错,说明注释符没有起到效果,推测注释符被过滤掉了。测试闭合方式,根据报错信息推测是单引号闭合,但是发现加了注释符后还是报错。处理不了,这样语法就是不正确的。尝试构建完整闭合语法来实现注入。看一下题目,乍一看和第一题很像,id传参试一试。我们利用注释符的目的是截断末尾,构造完整的闭合。这一关开始进入了靶场的第二阶段:进阶注入。现在的问题是,末尾的。3.爆字段,爆数据。原创 2025-07-16 18:35:51 · 189 阅读 · 0 评论 -
sqli-labs靶场通关笔记:第20-22关 Cookie注入
例如:如果Cookie是uname=admin,则$cookee = "admin"执行结果:返回users表中username='admin'的第一条记录,如果存在:显示用户信息;这里的cookie变成了字符串,那么用bp抓包看一下,发现是base64编码。登录一个正确的账号密码,发现cookie会显示在上面,推测可能存在注入点。这里很显然可以使用报错注入,但是知道了源代码,可以使用联合注入,更加简单。在admin后面加一个单引号报错,加上#恢复正常。编码后发送,根据报错猜测是')闭合。原创 2025-07-16 10:05:48 · 374 阅读 · 0 评论 -
sqli-labs靶场通关笔记:第18-19关 HTTP头部注入
登录正确的用户名密码,它会将User-Agent的信息回显到页面上。猜测UA头可能存在注入点。登录一个正确的账号,Referer的信息回显到页面上,和UA头注入的思路相同,利用报错注入。观察报错信息,显示near'xx','admin')',推测后面应该还有两个参数,构造语句。利用bp抓包,在UA头后面加一个单引号,发现报错了。进行报错注入,成功回显数据库名。试一试,结果没有报错。原创 2025-07-15 20:15:30 · 344 阅读 · 0 评论 -
sqli-labs靶场通关笔记:第17关 POST请求的密码重置
这里还需要注意一个问题,更新密码的操作是update,为数据操作语言(DML),而select是数据查询语言(DQL),两个不能在同一语句中执行,所以查询users表中字段数据会报错。也就是说,必须输入真实有效的用户名,才能进行密码修改的操作,但是密码输入框没有做过滤。解决的办法就是,创建一个独立的子查询,将结果集作为一张临时表,然后通过查询临时表获取数据。意思是执行一个独立的子查询作为临时表,别名为a,再将其整合到update语句中。这关显示是密码重置的界面。爆数据库名,爆表名,爆字段,爆数据。原创 2025-07-15 18:39:12 · 340 阅读 · 0 评论 -
sqli-labs靶场通关笔记:第11-16关 POST请求注入
这一关开始变成了登录框输入,也就是post请求的表单提交。前十关都是get请求方式,可以直接在url栏中注入,这里的注入点换成了登录框。假设在username框中输入1' or 1=1 #来尝试把后面的密码验证注释掉,看看是否能登录成功。这几关都是通过POST请求的方式注入,把前面的联合注入,报错注入,布尔盲注又复习了一遍。这里登录成功没有回显位,但是登录失败会有报错信息。可以使用之前学过的报错注入。可以看到这里绕过密码,登录成功,页面显示了用户名和密码。这里输入1'会显示报错,可以判断出是单引号闭合。原创 2025-07-14 20:52:52 · 494 阅读 · 0 评论 -
sqli-labs靶场通关笔记:第10关 DNSlog盲注
DNSlog注入需要依赖load_file() 函数,它的作用是读取文件内容,作为字符串返回。需要配置文件my.ini中secure_file_priv=(空),如果secure_file_priv=NULL,load_file() 函数会被禁用。DNSlog注入,又称DNS带外(DNS Out-of-Band,简称 DNS OOB)注入。通过语句测试发现,只有一种页面回显,为双引号闭合,可以使用时间盲注。这是一个 DNS 日志平台,可以捕获目标服务器发起的 DNS 查询请求。4.获取字段中数据,完成。原创 2025-07-14 12:54:12 · 606 阅读 · 0 评论 -
sqli-labs靶场通关笔记:第9关 时间盲注
这里不管输入什么参数,界面永远只有“you are in...”一种回显,不知道是对还是错,布尔盲注无法使用了。1=1这个条件是永真,加上前面的条件来判断网页响应时间,如果立刻响应,则说明前一个条件存在错误。sleep()函数的作用是响应延迟,比如sleep(5)就是时间响应延迟5秒。通过语句拼接,发现单引号会延迟响应,双引号则马上响应,可以判断是单引号闭合。既然可以通过响应延迟来判断条件对错,那么意味着可以盲注,这就是时间盲注。(3)逐个位判断字符,得到数据库名称。(4)进一步注入表,字段,数据。原创 2025-07-13 19:29:36 · 324 阅读 · 0 评论 -
sqli-labs靶场通关笔记:第7-8关 布尔盲注
虽然ascii码的值是从0-255,但字母A-Z的范围是65-90,a-z范围是97-122。substr()函数作用是截取指定位置的字符,ascii()函数作用是返回字符的ascii码值(0-255范围的整数)。那么通过逐步猜测,就可以拿到数据库的名称。再结合limit()函数去枚举数据库下的表名,字段,最后拿到想要的数据。这里判断出是'))闭合,但是页面只有正确和错误的回显状态,报错的回显也是固定的,没有显示报错具体信息。已经知道了数据库名的长,假设再去猜测每一位上的字符,是不是就可以得到数据库名称。原创 2025-07-12 10:50:29 · 794 阅读 · 0 评论 -
sqli-labs靶场通关笔记:第5-6关 报错注入
updatexml()用于修改,extractvalue()用于查询,两者都严重依赖第二个参数作为 XPath 表达式 来定位或操作 XML 中的特定部分。这正是关键点所在,如果在不合法的字符串中构造子查询语句,那么数据库在报错时,会将子查询的结果包含在内。解释:updatexml()函数需要有三个参数,1和3作为占位符,0x7e是“~”符号的16进制,作用是构造无效的XPath表达式(在XPath 1.0 规范中,表达式不能以操作符开头),concat()起拼接作用,将子查询语句连接到其中。原创 2025-07-11 15:54:02 · 500 阅读 · 0 评论 -
sqli-labs靶场通关笔记:第1-4关 联合注入
4.知道闭合方式后,利用order by 判断字段数。order by是数据库查询中的排序语句,它的作用是确定返回的字段数(列数),是联合查询注入的前提。这里输入 order by 3 回显正常,order by 4 回显错误,说明存在3个字段。5.利用union联合查询判断回显位。这里id=-1的作用是让原始查询结果返回一个空集,确保联合查询的结果能够显示到页面上。这里我们得出结论,第1列的数据显示不了,第2,3列会显示出来。6.构造语法进一步查询。这里我们查询出了当前的数据库名称。原创 2025-07-11 11:14:59 · 640 阅读 · 0 评论
分享