一、堆叠注入
优点:
可以同时执行多条语句,每个语句之间用“;”隔开,并且可以增删改查,和union查询不同,union查询只能查询没有增删改的能力。
缺点:
调用的接口必须使用mysql_multi_query()这个函数执行mysql语句,如果使用的是mysql_query语句则无效果。
用法:
和普通注入盲注一样使用。
二、宽字符注入
原理:
当传递一个参数id=1‘得时候,当我们输入这个单引号,会被认为是非法字符,会被过滤函数添加“\”给过滤掉,所以我们想要程序接受我们传递得参数中包含单引号,那么就需要把这个转义字符“\”干掉,当http协议传输得时候,是要经过url编码的,如果这个编码完成后,传递到服务器时,我们可以在单引号前加上一个%81这样得编码,最后这样解码得时候,这个%81就会和“/”对应得编码相结合按照gbk编码要求去解码,最后只剩下个单引号。
宽字符在线查询:
优点:
当一个网站限制了特殊字符的时候此时就可以尝试宽字符注入。宽字符把特殊字符进行转义。
缺点:
1、注入目标的数据库必须使用GBK编码格式。目前绝大多数网站用的是utf8编码,所以可用场景非常少。
2、或者使用了addslashes(),mysql_real_escape_string(),mysql_escape_string()之类的函数。
例子:
1、确定是否存在宽字节
?id=1%81'#
2、查找是否可以注入
?id=1%81' and 1=1 #
?id=1%81' and 1=2 #
3、确定字段个数
?id=1%81' order by N #
4、查找显示位
?id=1%81' union select 1,2,3 #
5、注入
id=-1%81' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema= database() and table_name = 0x7573657273
#如果限制的特殊字符' 如果需要查寻的时候可以改成16进制编码 例如0x7573657273 就是user
1、如果在sql中无法插入字符串 可以把字符串改成16进制代码。
2、如果在sql中无法插入字符串 可以使用嵌套查询,从某个表中查询出来的结果放到sql查询语句中。
三、二次注入
原理:
从正常的途径插入恶意语句,然后从正常途径执行恶意语句。例如创建账号插入sql语句,当登录时,去数据库查询的时候执行了插入的sql语句。
例子:
1、创建账号test,密码111111
2、创建账号test'#,密码222222
此时数据库里的值
3、 登录test’#账号
4、修改账号test’#,密码333333
此时数据库里值
这里改的是账号test’# 但是实际改的却是test的账号因为在查询的过程中使用的是test'#在执行的时候'#被当作了特殊字符没有参加执行所以修改的是test账号的密码。