sql注入-字符型、数字型判断

robinwu   ·   发表于 2022-11-27 13:38:51   ·   学习杂记

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

假设存在sql注入的url是:http://192.168.0.1/id=1

数字型判断

1、and或者or
假设数据库的执行语句是:select * from table where id=$id
当查询id=1的页面时返回正常页面,此时执行的语句是:select * from table where id=1

假如在1后面加上 and 1=2 , $id的值就是1 and 1=2
这时数据库执行的语句就是 select * from table where id=1 and 1=2 1=2为假,真and假=假
语句正确,逻辑错误,页面返回错误
同理 如果$id的值就是1 and 1=1, 真and真=真,页面返回正常

假如在1后面加上 or 1=2, $id的值就是1 or 1=2
这时数据库执行的语句就是 select * from table where id=1 or 1=2为假,真or假=真
语句正确,逻辑正确,页面返回正常
同理 如果$id的值就是1 or 1=1, 真or真=真,页面返回正常

所以,我们可以使用and或者or这两个逻辑运算符来判断字段是否是数字型,但因为字符型的and和or返回的结果都为正常页面,我们就不好通过or来进行比较,一般习惯于用and 1=2,如果是数字型,返回错误,但如果是字符型,返回正确,这样两者之间就有了不同,有了比较。

2、加单引号
假如在1后面加上单引号 , $id的值就是1’
这时数据库执行的语句就是select * from table where id=1’
单引号不匹配,语句正确,页面返回错误

3、运算符判断(+、-、*、/)
数字型传参,可以尝试-1(不用+1,因为+在url传输过程会被转译)
例如:
http://xxx.com/new.php?id=1 显示页面id=1的新闻
http://xxx.com/new.php?id=3-1 显示页面id=2的新闻
通过上面两个链接访问,可以判断此处为一个SQL注入点。

字符型判断

1、and或者or
假设数据库的执行语句是:select * from table where id='$id'
当查询id=1的页面时返回正常页面,此时执行的语句是:select * from table where id='1'

假如在1后面加上 and 1=2 $id的值就是1 and 1=2
这时数据库执行的语句就是 select * from table where id='1 and 1=2'
页面返回正常
假如在1后面加上 or 1=1 $id的值就是1 or 1=1
这时数据库执行的语句就是 select * from table where id='1 or 1=1'
页面返回正常

不管是and或者or,执行结果都是一样的,都会返回id=1的页面,那么为什么会这样呢?
因为数据库中id的类型是数值型,比如int型,而MySQL数据库在执行语句时是会自动进行类型转换的,输入的字符1 or 1=1会在执行时被自动转换成int型的1,所以最终的执行语句还是select * from table where id='1'

这是数据库的特性问题,后面的字符可以是任意的,不会影响查询,我们在1后面加上任意字符,比如1dogjoreg,最后都会被转换为1来进行语句执行。
如果id本身就是varchar类型的,那么数据库查询的时候就会进行精准的匹配,这样子'1dogjoreg'等类似的数据由于数据库里没有匹配项,查询结果为空。
所以,如果字段是字符型的,那么我们使用and或者or来测试时页面返回都是正常的。

2、加单引号
输入$id=1'
执行的SQL语句就是select * from table where id='1''
单引号不匹配,语句错误,页面错误

所以我们要闭合多余的单引号,使用注释符#或者–+
执行的SQL语句就是select * from table where id='1'--+'
语句正确,页面正常
这里就和上文中数字型判定方式产生了不同了,数字型判定尽管加上注释符,执行的SQL语句是select * from table where id=1'-- qwe 因为单引号还是不匹配,语句还是错误的,页面还是返回错误。

3、 同样可以使用 and ‘1’=’1 和 and ‘1’=’2来判断
Url 地址中输入 www.xxx.com/abc.php?id= x’ and ‘1’=’1
页面运行正常,继续进行下一步。
Url 地址中继续输入 www.xxx.com/abc.php?id= x’ and ‘1’=’2
页面运行错误,则说明此 Sql 注入为字符型注入。

总结

打赏我,让我更有动力~

0 条回复   |  直到 2022-11-27 | 835 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.