目录
一、代码内容
二、MySQL内容
创建table1表并插入数据
sql
mysql> use security
mysql> create table table1(id int(10) primary key auto_increment,username varchar(50) not null,password varchar(50) not null);
mysql> desc table1;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| username | varchar(50) | NO | | NULL | |
| password | varchar(50) | NO | | NULL | |
+----------+-------------+------+-----+---------+----------------+
mysql> insert into table1(id,username,password) values(1,'admin','admin');
mysql> select * from table1;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | admin | admin |
+----+----------+----------+
三、代码遇到的问题
遭遇:
想要查询到admin就必须username=admin
但是访问username=admin 就会打印出Permission denied!从而停在这里
测试
解决思路:
在admin后加类似%%的字符 MySQL将%%进行删掉,放弃
这样程序进行 不是admin 而mysql执行的是admin
使用username=admin%c2尝试
四、出现问题1
断点调试,分析问题
发现问题点:
注意到了sql返回的执行语句 table1是带单引号的
在mysql尝试发现错误
去掉table1的单引号
问题解决
五、出现问题2
为什么是%c2呢 为什么%c1就不行
原因:
造成这个Trick的根本原因是,Mysql字段的字符集和php mysqli客户端设置的字符集不相同
整个操作就有如下字符串转换过程:
utf8 --> utf8 --> latin1
最后执行比较username='admin'的时候,'admin'是一个latin1字符串
utf-8---->utf-8---->gbk
基本原因是utf-8遇到了不完整的编码进而进行忽略
举例:
1、http://127.0.0.1/mysql_1.php?username=admin�
2、http://127.0.0.1/mysql_1.php?username=admin��
3、http://127.0.0.1/mysql_1.php?username=admin佬
举例总结:
我们查询username=admin%e4时,%e4被省略,最后查出了username=admin的结果。
举例的1和2 就是utf-8的编码不完整会忽略其部分 所有可以注入成功
而举例的3 就是完整的utf-8的编码 会解译为佬 所有可以注入失败