注入之宽字节注入
本文内容:
~什么是GBK编码格式
~提一下二阶注入原理
~宽字节SQL注入原理
一、什么是GBK编码格式
1,转义符“\”
有些符号想让他当作单纯的字符,而不是当作符号的时候,一般可以用: \符号
比如:
\' \" //这种情况下,'与"将被当作正常的字符
另外说一下:
在数据库之中'与"几乎没有区别,在php之中 ' 包括的内容完全当作字符串,
而 " 包括的内容会进一步进行解析
例如:
$a='hello';
echo '$a'; //输出:a
echo "$a"; //输出:hello
2,为什么产生编码:
~为了处理英文字符,产生了ASCII码。
~为了处理中文字符,产生了GB2312。 GBK是微软对GB2312的扩展,是微软标准但不是国家标准。
~为了处理各国字符,产生了Unicode。 (万国码)
~为了提高Unicode存储和传输性能,产生了UTF-8,它是Unicode的一种实现形式
汉字编码有很多种,有三字节编码方式(utf-8)有二字节编码方式(GBK是二字节)
3,魔术引号
是一个自动将进入 PHP 脚本的数据进行转义的过程,简单地说一种网站防止注入的手段
可以自动在 ' 与 " 和 \ 前加一个 \,来防止注入。(有三个等级,默认等级一)
本章主要内容就是讲一下如何利用字节编码使输入的引号逃逸,进而实现注入。
扩展:为什么将\也转义?
select * from admin where username='a' and password='123'
//这是正常的语句
如果不对\转义,则:
select *from admin where username='a\' and password' or sleep(5)#'
==》这的 a\' and password 会被当成一个字符串,而 咱们再密码处输入的
or sleep(5)#就可以执行了
多提一下,魔术引号仅会影响get、post、cookie,所以可以进行head注入。
另外虽然高版本的php已经将其移除,但是有类似的函数发挥相同的作用,
即从默认开启变成了手动开启
4,二阶注入
简单的说,对输入处进行过滤,但是输出时没有过滤,导致问题。
比如:
注册的地方进行过滤:
insert into admin(name,wd) values('a\' or sleep(5)#','123');
执行的存入的时候,虽然有\过滤,但是读的时候就成了
select * from admin where username='a' or sleep(5)# and password='123'
注入成功
二、宽字节SQL注入原理
1,什么情况下使用宽字节注入
~存在魔术引号
~数据库非万国码 [常见的是GBK]
个人建议,上述两种情况遇到一种就可以使用宽字节注入
如何知道数据库的编码? 多尝试,渗透测试的本质就是多次尝试
2,原理
一般的英文符号都是1个字节,而汉字是两个字节(GBK编码情况下)
由上边知道,有的网站有魔术引号阻挠我们,而我们现在的核心就是如何逃逸出“\”
这个时候,最简单的方法 我们可以加个汉字,比如:
url id=1 汉' or sleep(5)# 就可以让网页沉睡5秒
因为 中文utf-8编码三个字节 GBK之中两个字节
在这utf-8的三字节 “汉”遇到魔术引号的单字节 “\” 组成4个字节转成GBK之中,就成了两个汉字
从而让\失去了作用,而我们就注入成功
公认的宽字节注入一般是%df,例如: //%df是一个url编码
url id=1 %df' or sleep(5)# 就可以让网页沉睡5秒
补充:
数据库默认支持16进制,