网络安全从入门到精通(第五章-5)宽字节注入

					注入之宽字节注入
本文内容:
		~什么是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进制,

发布了24 篇原创文章 · 获赞 3 · 访问量 1741

猜你喜欢

转载自blog.csdn.net/weixin_43970718/article/details/104133946
今日推荐