过滤in,or字符的sql注入学习

在sql注入中,有时候会遇见一些过滤,将in或者or之类的匹配出来,这样传统的通过information_schema是得不出来列名的。

这里引入一个sys的一个表

image

可以看到这里有很多表名。

image

这里有很多$符号的表名,这些表单里面就存在很多信息。

image

image

这里就出现了我创建的一个表。

这里还可以用

1
select table_name from sys.x$schema_table_statistics where table_schema=database();

来获得表名。

image

接下来”sys.x$statement_analysis”这个表记录了一些操作日志

image

在sql注入中,或者在ctf中,可以通过这个看看别人是怎么操作的。

1
SELECT query FROM sys.x$statement_analysis

image

当我们不知道列名那该怎么办呢?

这里有这么一个trick

1
select (select 1,'da13')=(select * from for_test);

这里对大小写不敏感,如果等式左右那边的列数相等,并且结果想同就会返回1.当然这里的等号也可以换成 <,>符号

image

但是当我们要数据的时候得大小写分明,那么怎么办呢?

原本是binary函数即可,但是里面有”in”所以得换个方法。

在mysql中json是binary类,利用cast方法可以转换过来

image

image

这里的concat函数因为后面的0是二进制的类,所以整个拼接后就是二进制的,所以就能进行大小写辨别了。

TetCTF中一个ctf题目就是用这个方法做的,这里就只拿payload说说。

1
((SELECT 1,CONCAT({flag}, CAST("0" as JSON))) <= (SELECT * FROM `Th1z_Fack1n_Fl4444g_Tabl3`))+1

这里我们对flag进行一个一个尝试,后面接上0,让整个爆破的字符串可以和后面的(真实的flag)进行大小写比较。

以上就是个人所做的一个小总结,有不足的地方还望各位大佬斧正!