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

宽字节注入

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

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

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

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

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



报错注入


以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查询语句

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-31 07:54:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-31 07:54:03       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-31 07:54:03       82 阅读
  4. Python语言-面向对象

    2023-12-31 07:54:03       91 阅读

热门阅读

  1. LeetCode 1185. 一周中的第几天

    2023-12-31 07:54:03       54 阅读
  2. python------Pymysql模块

    2023-12-31 07:54:03       48 阅读
  3. 16. Mysql 自定义函数

    2023-12-31 07:54:03       55 阅读
  4. mysql压力测试原因与mysql压力测试的方法

    2023-12-31 07:54:03       60 阅读