BUUCTF: [SUCTF 2019]EasySQL

BUUCTF SUCTF 2019EasySQL

知识点:

  1. 使用下面的命令可以||这个符号转换为concat函数

    set sql_mode=PIPES_AS_CONCAT

  2. select后面接的内容都是表达式!!!(重要)

    • 比如 select 1 or name表示将1 or name作为列名,他的值是1或上name字段的值
  1. sql注入的时候,不仅可能发生在where后面的条件处,还有可能在select之后

    比如:

    • 注入发生在where之后, select * from table1 where id=$_POST'q', 这个时候注入就发生在where之后
    • 发生在select之后, select $_POST'q'||flag from Flag, 这个时候就是发生在select之后(本题就是)

题目描述

题目就是一个提交框,输入内容,然后post发送给服务器。

初步尝试

我通过下面的操作,依次在#后面添加我想使用的字符串,初步探测出下面的被过滤以及没被过滤的字符串,如下图:

  • 被过滤union、from、flag、handler、sleep、prepare、"

  • 没被过滤的select、*、#、show、tables、

用户是root,这个时候可以考虑使用load_file函数,但是这里不知道路径,所以没办法;

查看题解

题解说后端的sql语句可能是这个$sql = "select ".$post['query']."||flag from Flag";

方法一

还记得前面说得,select后面是表达式吗,如果我们提交的数据是*,1,那么查询语句就是select *,1||flag from Flag,这里的1||flag会被当作新的一列,他的值为1或上flag这一列的值。由于1或任何值都为真,所以返回真(这里输出1)!如下图所示:

但是我还是没理解,为什么当我输入*,'abc'不返回任何值,按照我的理解'abc'是字符串的字面量,它或上flag字段的值应该为'abc'。**希望懂的大佬解答下!!!**如下图:

****

方法二

使用set sql_mode=pipes_as_concat||运算符变为concat函数。

  • 依然将select后面的内容理解为表达式,就是出现一个新的字段,名称是concat(1,flag)。

​ 在线的例子如下:

  • 本体构造的表达式1;set sql_mode=pipes_as_concat;select 1, 也就是select concat(1,flag) from Flag, 其输出的内容如下:

相关推荐
AugustRed7 分钟前
Linux 运维常用命令大全(超全速查表)
运维·网络·php
IT_陈寒11 分钟前
Vite热更新失灵?你可能漏了这个配置
前端·人工智能·后端
丷丩12 分钟前
MapLibre GL JS第19课:实时更新要素
前端·javascript·gis·map·mapbox·maplibre gl js
Mr.Daozhi16 分钟前
RAG 进阶实战:跑通 Demo 后我连续翻了 6 次车,逐一修复才真正可用(含 Gradio Web 版)
前端·数据库·langchain·大模型·gradio·rag·科研工具
哆来A梦没有口袋27 分钟前
干货精讲 | 初级CSS面试高频考题
前端·css·面试
掘金011 小时前
EmbedPDF Vue 版 完整正文文档 全网首发
前端
OpenTiny社区1 小时前
操作ArkTS页面跳转及路由相关心得
前端·typescript·web·opentiny
xiaohua0708day1 小时前
Lodash库
前端·javascript·vue.js
huakoh1 小时前
Claude Code 从零到上手指南:国产工具链复现80% Agent能力,DeepSeek+LangChain实战
前端
Ankkaya1 小时前
浏览器插件接入 Google 登录
前端