Sql字符注入与数字注入:
一.基本注入过程
- 查找注入点
- 确认数据行数:用 order by(数字)的方法进行确认
- 找显示位
如果有显示位用联合注入的方法进行注入
- 爆库:命令如下?id=-1 union select 1,2,database() --+
查看使用账号:user()
查看数据库版本信息:vsersion()
- 爆表:命令如下?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=’数据库名’ --+
- 爆 列 :命令如下:?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name=’表名’ --+
- 爆数据:命令如下?id=-1 union select 1,group_concat(列名),3 from 表
如果没有显示位进行盲注
二.堆叠注入:
- 原理:在sql语句中;表示一个语句的结束,但是我们可以在后面继续写入其他的语句进行执行,比如说修改数据库数据,删除数据库数据等。
- 局限性:不是每一个环境都可已经注入,注入前需要知道一定的信息比如数据库名字,或者是表名。而且前端只能返回一个查询结果,我们后面构造的语句的结果我们看不到。
- 宽字节注入:
- 前言:
字节:
一个字节八位。
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设定值。
- 原理:
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时,页面报错
如图所属说明单引号变成了他的特殊意义,把前面的单引号进行闭合所以导致报错。这时我们就可以像之前那样进行暴库,暴表了。