练习题目网站地址:http://ctf.bugku.com。
1、了解一下宽字节注入原理
前提:
一、咱们都知道,在防护SQL注入的时候,大多说都是使用的过滤特殊字符,或者使用函数将特殊字符转化为实体,就是说在字符转义,添加‘\’。这里第一条就是有这个机制。
二、设置宽字节字符集,这里为GBK字符集,GBK字符集占用两个字节。关键就在于这个设置字符集。一般有不少方法能够设置,例如:
(1) mysql_query,如mysql_query("SET NAMES 'gbk'", $conn)、mysql_query("setcharacter_set_client = gbk", $conn)。php
(2) mysql_set_charset,如mysql_set_charset("gbk",$conn)。
实现过程:当咱们测试的时候,输入“%df‘”,这个时候若是php函数是使用的addslashes()的时候,会在冒号的前面加上’\’。也就变成了%df\’ 。对应的编码是%df%5c’.这时候网站字符集是GBK,MYSQL使用的编码也是GBK的话,就会认为%df\是一个汉“運’”,这样的话,单引号前面的\就不起做用了,从而转义失败,题目就会出现报错信息。
咱们就以网站的题目测试一下:mysql
一、查看网页源码
出现字符集gb2312,这时候就应该想到宽字节注入
二、报错测试可注入web
出现了报错信息,由于构成的语句中会多出一个单引号。例如查询语句为:sql
$name=addslashes($_POST[‘name’]) Select * from user where name=’$name’
将咱们的%df’传递进去就变成了:数据库
Select * from user where name=’%df\’’
这样咱们的单引号和前面的闭合,多出一个原来的单引号,报错。
三、查询字段数:ide
%df’ order by 2 %23
这里%23表示注释,意指去将后面的语句注释掉包括什么多出的单引号和limit限制只能查询一行的语句。
通过几回测试,肯定字段数为2.
四、判断数据库:函数
%df’ union select 1,database() %23
获得数据库的 名字。测试
五、接着根据题目提示,给出了表名和字段名,能够直接查询字段内容网站
%df’ union select 1,string from sql5.key where id=1 %23
我的看法编码