0
点赞
收藏
分享

微信扫一扫

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

想溜了的蜗牛 2022-01-12 阅读 85

如何判断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

同理 如果$id的值就是1 and 1=1, 真and真=真,页面返回正常

假如在1后面加上 or 1=2, $id的值就是1 or 1=2

同理 如果$id的值就是1 or 1=2, 真or假=真,页面返回正常

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

2、加单引号

假如在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

假如在1后面加上 or 1=1 $id的值就是1 or 1=1

不管是and或者or,执行结果都是一样的,都会返回id=1的页面,那么为什么会这样呢?

这是数据库的特性问题,后面的字符可以是任意的,不会影响查询,我们在1后面加上任意字符,比如1dogjoreg,最后都会被转换为1来进行语句执行。

所以,如果字段是字符型的,那么我们使用and或者or来测试时页面返回都是正常的,接上文,比较不同可以得出结论

2、加单引号

输入$id=1’

所以我们要闭合多余的单引号,使用注释符#或者–+

这里就和上文中数字型判定方式产生了不同了,数字型判定尽管加上注释符,执行的SQL语句是select * from table where id=1’ --+’ 因为单引号还是不匹配,语句还是错误的,页面还是返回错误。

综上,可以得出下表:

$id数字型(id=$id)字符型 (id=’$id’)
1 and 1=1id=1 and 1=1 返回正常id=‘1 and 1=1’ 返回正常
1 and 1=2id=1 and 1=2 返回错误id=‘1 and 1=2’ 返回正常
1 or 1=1id= 1 or 1=1 返回正常id= ‘1 or 1=1’ 返回正常
1 or 1=2id=1 or 1=2 返回正常id=‘1 or 1=2’ 返回正常
1’id=1’ 返回错误id=‘1’’ 返回错误
1’ --+id=1’ --+ 返回错误id=‘1’ --+’’ 返回正常
举报

相关推荐

0 条评论