常见的SQL注入总结

Sql字符注入与数字注入:

一.基本注入过程

  1. 查找注入点
  2. 确认数据行数:用 order by(数字)的方法进行确认
  3. 找显示位   

如果有显示位用联合注入的方法进行注入

  1. 爆库:命令如下?id=-1 union select 1,2,database() --+

查看使用账号:user()

查看数据库版本信息:vsersion()

  1. 爆表:命令如下?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=’数据库名’  --+
  2. 爆  列 :命令如下:?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name=’表名’ --+
  3. 爆数据:命令如下?id=-1 union select 1,group_concat(列名),3 from 表

如果没有显示位进行盲注

二.堆叠注入:

  1. 原理:在sql语句中;表示一个语句的结束,但是我们可以在后面继续写入其他的语句进行执行,比如说修改数据库数据,删除数据库数据等。
  2. 局限性:不是每一个环境都可已经注入,注入前需要知道一定的信息比如数据库名字,或者是表名。而且前端只能返回一个查询结果,我们后面构造的语句的结果我们看不到。
  • 宽字节注入:
  1. 前言:

字节:

一个字节八位。

Unicode:字符编码,两个字节表示一个文字。

UTF-8:针对Unicode的一种可以变长度的字符编码。

宽字节:GB2313,GBK,GB18030,BIG5,Shift_JIS等都是常用的宽字节。实际上只有两个字节,存在的主要安全问题时吃ASCII字符(一字节)的现象。

addslashes()函数:在预定义字符前添加反斜杠的字符串。比如说一个字符型的语句对其进行查询时传入的数据为?id=1’后面的这个’就可以把前面的单引号进行闭合。但是用addslashe()函数后就会在以GET和POST传入的数据的’前加上/就会使’失去其特殊的意义变成其原本的意思。这样就无法闭合单引号也就无法对后面进行sql注入。

MYSQL的字符集转换过程:

①MYSQL Server收到请求时将请求数据从character_set_clicent转换为character_set_connection

②进行内部操作前将请求数据从character转换为内部操作字符集,其确定过程为:

• 使用每个数据字段的CHARACTER SET设定值;

• 若上述值不存在,则使用对应数据表的DEFAULT CHARACTER SET设定值(MySQL扩展,非SQL标准);

• 若上述值不存在,则使用对应数据库的DEFAULT CHARACTER SET设定值;

• 若上述值不存在,则使用character_set_server设定值。

  1. 原理:

PHP中的编码为GBK,函数执行添加的是ASCII编码(addslashe函数添加的/也是一个ASCCII编码)

UTF-8编译汉语时一个汉语占3个字节,GBK占两个字节,MYSQL默认的字符集是GBK等宽字节字符集,所以MYSQL会认为两个字节是一个汉字,这时我们在前面加一个ASCII大于128的编码字,比如我们输入%df%27,(这个%27就是单引号,他前面会加上一个/也就是%5c)这样这个%df就会与后面的%5c相结合变成一个汉字,这样这个/转义就失去了意义。

2.实例:

如图所示对其传入1’闭合前面的单引号时,他自动调用addslashe函数对传入的单引号前面加入/,使其转义。导致无法闭合单引号。

但是当我们传入1%df%27时,页面报错

如图所属说明单引号变成了他的特殊意义,把前面的单引号进行闭合所以导致报错。这时我们就可以像之前那样进行暴库,暴表了。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>