• 堆叠注入


    堆叠注入

    摘要

    从强网杯看堆叠注入

    Demo
    Demo
    强往杯这道题过滤了sql很多查询语句,所以会去想到堆叠注入。

    在SQL中,分号(;)是用来表示一条sql语句的结束,我们在 ; 结束一个sql语句后继续构造下一条语句,会一起执行,这就是堆叠注入。
    而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?
    区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。
    例如:

    用户输入:1; DELETE FROM products
    服务器端生成的sql语句为: Select * from products where productid=1;DELETE FROM products
    当执行查询后,第一条显示查询信息,第二条则将整个表进行删除
    

    进入正题:
    Demo

    1';show databases;#
    

    也就是说我们执行完第一句满足条件的语句之后,还能再执行一条语句(没有条件限制),依此来查看数据库、表名

    1';show tables from supersqli;#
    

    如果查看的表名是字符串,就需要加上反引号(`)英文输入法下按esc下面那个键即可

    1';show columns from __;#(内容替换下划线)
    

    Demo
    Demo
    我们找到了flag在哪里,无法继续用语句查看内容
    根据两个表的情况结合实际查询出结果,判断出words是默认查询的表,因为查询出的结果是一个数字加一个字符串,words表结构也是id(数字)和data(字符串),查询传入参数也就是赋值给了id

    rename和alert

    先介绍rename和alert的用法:
    rename:修改一个或多个表的名称

    RENAME TABLE old_table_name TO new_table_name;
    

    alert:向表中添加字段

    Alter table [表名] add [列名] 类型
    

    保留old和new列名

    列名:a ---->b 列类型
       ALTER TABLE t1 CHANGE a b INTEGER;
    

    由于这道题没有禁用rename和alert,所以我们可以采用修改表结构的方法来得到flag 将words表名改为words1,再将数字名表(1919810931114514)改为words,这样数字名表就是默认查询的表了,但是它少了一个id列,可以将flag字段改为id,或者添加id字段

    payload:

    1';rename tables `words` to `words1`;rename tables `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(100);#
    

    然后使用1' or 1=1#显示表中所有内容,即可查询出flag
    Demo

    Reference

    [Sign]做不出ctf题的时候很痛苦,你只能眼睁睁看着其他人领先你
  • 相关阅读:
    BZOJ 3529 数表
    BZOJ 3832 Rally
    BZOJ 1086 王室联邦
    BZOJ 2738 矩阵乘法
    2656565
    小L的区间求和
    小L的直线
    Co-prime 杭电4135
    POJ 跳蚤
    B
  • 原文地址:https://www.cnblogs.com/echoDetected/p/12553580.html
Copyright © 2020-2023  润新知