本文章主要涉及sql宽字节注入注入的原理讲解,如有错误,望指出。(附有目录,如需查看请点右下角)
一、下图为本次文章所使用到 user表,该表所在的数据库为 test。
二、首先介绍一下本篇文章所用到的知识点:
常用到的url编码:
- 空格:%20
- 单引号:%27
- 在sql注入中,单(双)引号的应用十分重要,他决定着你能否从原有的一对引号之间逃逸出
- 井号(#):%23
- 在sql注入中,#号常被用来注释,即在使用单引号与原有一对单引号的第一个单引号进行闭合之后,用#将原有的一对单引号的第二个单引号注释掉,否则会出现语法错误。
- 反斜杠():%5C
- 在sql注入中,\号常用来进行反编译。
addslashes函数(php4,php5,php7):
格式:string addslashes(string $str)
作用:返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线(\)。这些字符是单引号(‘)、双引号(")、反斜杠(\)与 NULL(NULL字符)
为什么使用该函数:
在单(双)引号,反斜线,NULL前加上反斜线会起到转义的作用:以单引号为例,再加上反斜线之后,单引号就会被转义,就是说,此时的单引号仅仅是一个单引号,但已经不具备单引号原有的语法功能了(相当于单引号就仅仅是一个字符串了)这样就可以在一定程度上对sql注入进行一定的预防。
那么我们应该如何从addslashes函数中逃逸出来呢?
存在两种解决方法:
- "" 的前面再加一个 ""(或单数个),变成 "\‘",这样""就被转义了,"‘"逃出了限制。
- 使 "" 消失掉。
以上两种方法中,本节课讲述的是第二种,即利用宽字节注入把反斜杠弄没。
宽字节注入的原理:
原理:宽字节注入是利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个asci码要大于128,才到汉字的范围)
eg:
在用hackbar进行汉字输入的时候你会发现,那段汉字就会变成一段百分号编码,这样我们就可以利用这个原理从而把反斜杠干掉。就如上图,在进行转义之后,原本是两个百分号变成了三个,又因为汉字是由两个百分号组成,所以系统就会识别前两个百分号成一个汉字,从而将“\”干掉。%5c就是“\”