在sql注入中,有时候会遇见一些过滤,将in或者or之类的匹配出来,这样传统的通过information_schema是得不出来列名的。
这里引入一个sys的一个表
可以看到这里有很多表名。
这里有很多$符号的表名,这些表单里面就存在很多信息。
这里就出现了我创建的一个表。
这里还可以用
select table_name from sys.x$schema_table_statistics where table_schema=database();
来获得表名。
接下来"sys.x$statement_analysis"这个表记录了一些操作日志
在sql注入中,或者在ctf中,可以通过这个看看别人是怎么操作的。
SELECT query FROM sys.x$statement_analysis
当我们不知道列名那该怎么办呢?
这里有这么一个trick
select (select 1,'da13')=(select * from for_test);
这里对大小写不敏感,如果等式左右那边的列数相等,并且结果想同就会返回1.当然这里的等号也可以换成 <,>符号
但是当我们要数据的时候得大小写分明,那么怎么办呢?
原本是binary函数即可,但是里面有"in"所以得换个方法。
在mysql中json是binary类,利用cast方法可以转换过来
这里的concat函数因为后面的0是二进制的类,所以整个拼接后就是二进制的,所以就能进行大小写辨别了。
TetCTF中一个ctf题目就是用这个方法做的,这里就只拿payload说说。
((SELECT 1,CONCAT({flag}, CAST("0" as JSON))) <= (SELECT * FROM `Th1z_Fack1n_Fl4444g_Tabl3`))+1
这里我们对flag进行一个一个尝试,后面接上0,让整个爆破的字符串可以和后面的(真实的flag)进行大小写比较。
以上就是个人所做的一个小总结,有不足的地方还望各位大佬斧正!
本文作者:星盟安全团队
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/123956.html