网安入门08-Sql注入(报错注入&宽字节)

宽字节注入

先了解一下什么是窄、宽字节

当某字符的大小为一个字节时,称其字符为窄字节.
当某字符的大小为两个字节时,称其字符为宽字节.

所有英文默认占一个字节,汉字占两个字节
常见的宽字节编码:GB2312,GBK,GB18030,BIG5,Shift_JIS等

为什么会产生宽字节注入,其中就涉及到编码格式的问题了,宽字节注入主要是源于程序员设置数据库编码与PHP编码设置为不同的两个编码格式从而导致产生宽字节注入

如果数据库使用的的是GBK编码而PHP编码为UTF8就可能出现注入问题,原因是程序员为了防止SQL注入,就会调用几种安全查询函数,将单引号或双引号进行转义操作,转义无非便是在单或双引号前加上斜杠(\)进行转义 ,但这样并非安全,因为数据库使用的是宽字节编码,两个连在一起的字符会被当做是一个汉字,而在PHP使用的UTF8编码则认为是两个独立的字符,如果我们在单或双引号前添加一个字符,使其和斜杠(\)组合被当作一个汉字,从而保留单或双引号,使其发挥应用的作用。但添加的字符的Ascii要大于128,两个字符才能组合成汉字 ,因为前一个ascii码要大于128,才到汉字的范围 ,这一点需要注意。

网安入门08-Sql注入(报错注入&宽字节)_第1张图片
网安入门08-Sql注入(报错注入&宽字节)_第2张图片
网安入门08-Sql注入(报错注入&宽字节)_第3张图片

报错注入

网安入门08-Sql注入(报错注入&宽字节)_第4张图片
以updatexml()为例
select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));
三种报错注入常用的语句:

通过floor报错

and (select 1 from (select count(*),concat(( payload),floor (rand(0)*2))x from information_schema.tables group by x)a)
其中payload为你要插入的SQL语句
需要注意的是该语句将 输出字符长度限制为64个字符

通过updatexml报错

and updatexml(1,concat('0x7e',payload,'0x7e),1)
同样该语句对输出的字符长度也做了限制,其最长输出32位
并且该语句对payload的反悔类型也做了限制,只有在payload返回的不是xml格式才会生效

通过ExtractValue报错

and extractvalue(1,concat('~',payload))
输出字符有长度限制,最长32位。
payload即我们要输入的sql查询语句
网安入门08-Sql注入(报错注入&宽字节)_第5张图片

你可能感兴趣的:(CISP-PTE备考之路,sql,数据库)