关于sql注入

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于sql注入相关的知识,希望对你有一定的参考价值。

小白求解释清楚
1.使用DVWA的low等级进行sql注入,在id框输入1’and1’=’2
请问这个上标号'为什么要这么标?在网址进行注入为什么不需要上标号?
2.sql注入和sql盲注都是猜解数据库可能的字段,有什么差别呢?

"select * from tb where col='"+value+"'";
一般可能就是这么拼接的,value="1’or '1'='1";那么拼接出来的就是
"select * from tb where col='1' or '1'='1'",这样拼接出来的前面不管值为什么都会因为后面的or '1'='1'恒等成立然后去查询全表。
SQL注入是你已经知道有哪些注入点,在已知的注入点上再去猜解未知的列,盲注是反复尝试不同数据请求根据服务器的响应来判断并逐渐分析字段。追问

再问一下

为什么1’and1’=’2 是数字型注入
1’or’1234’=’1234是字符型注入?

追答

还是因为那个数据边界符问题,字符串是有'作为边界符的比如select * from tb where col='colValue';这是一个完整的sql,col是字符串类型,后面的colValue就需要加',如果col是数值类型,那么select * from tb where col=colValue;的拼接语句是“select * from tb where col=”+colValue,这时候注入的值其实应该是1 or 1=1,这时候拼接出来的语句就是select * from tb where col=1 or 1=1;你那个写的还是有点问题。

参考技术A 第一个 :1’and1’=’2
因为后台 sql 一般是这么写的
where id = '$id'
而你把 $id 中的 id 写成 1’and1’=’2 结束了前边 哪个单引号 ,拼接了 and 1 = 2
第二个 : 注入是你知道哪里注入点 , 盲注是不知道哪里有注入点

SQL注入关于GORM的SQL注入问题

目录

1. 问题提出

大家觉得这样写的 sql 会发生sql 注入吗 ?

答案是肯定的。那么我们知道,一旦发生字符串的拼接,就会产生这个sql注入的问题。但有同学会疑惑,这个 sql 语句,难道gorm不会帮忙预检测的吗?

2. 例子

例子 1

那么我们可以来实践一下下面两种写法

  • 字符串拼接
id := "031904102" + " AND 1=1 "
where := "stu_number=" + id 
err := DB.Model(&User).Where(where).Find(&user).Error
if err != nil 
	fmt.Println(err)

  • 直接使用占位符
user2 := []User
err = DB.Model(&User).Where("stu_number=?", id).Find(&user2).Error
if err != nil 
	fmt.Println(err)

通过打印出执行地SQL语句,我们可以发现这个情况,其实第一种情况的写法这是不行的,因为这里SQL发生了注入,本来只查一条 stu_number 为 031904102的,但是由于后面注入了 1=1 所以把数据库里面的信息全部查出来了。

第一种的这里是有危险的。,那么我们如何将这个防止呢?其实我们只要按照上面第二种这种做法就好了。因为这样我们才能很好地通过占位符来进行判断。

例子2

那么我们再来看看如果注入了两条SQL语句会怎么样?
比如说这个


我们直接注入了drop table notice 。那么最终的SQL语句如下:

SELECT * FROM `user` WHERE stu_number=031904102; drop table notice;

这个在SQL里面肯定是可以执行的。但是在gorm这个框架中是不能执行的。

3. 总结

所以说我们要避免使用字符串直接拼接的形式来进行SQL的查询。

以上是关于关于sql注入的主要内容,如果未能解决你的问题,请参考以下文章

关于SQL注入。

关于sql手动注入

关于SQL注入与防注入

关于sql注入

SQL注入关于GORM的SQL注入问题

SQL注入关于GORM的SQL注入问题