官方一点的解释:
攻击者利用web应用程序对用户输入验证上的疏忽,在输入的数据中包含对某些数据库系统有特殊意义的符号或命令,让攻击者有机会直接对后台数据系统下达指令,,进而实现对后台数据库乃至整个应用系统的入侵。
简单解释
由于代码的不完全或者是存在一些不安全的过滤,导致用户在输入的时候带入了不安全的数据(非法数据);比如说单引号、双引号、联合查询、盲注、闭合等等,然后在输入的时候就可以输入非法的数据
服务端没有过滤用户输入的恶意数据,直接把用户输入的数据当作SQL语句来执行,从而影响了数据库安全和平台的安全。
存在两个条件
1.用户能够控制输入
2.原本程序要执行的sql语句,拼接了用户输入的恶意数据

1.攻击者访问有SQL注入漏洞的网站寻找注入点
2.攻击者构造注入语句,注入语句和程序中的sql语句结合生成新的sql语句
3.新的sql语句被提交到数据库中进行处理
4.数据库执行了新的sql语句,引发sql注入攻击
经典:and 1=1|and2>1|'or 1=1 |or 1<1
数据库函数:sleep(4)=1 | length(user())>3—通过时间的盲注
特殊符号:单引号、双引号----可以使用这两个来进行闭合
商用的扫描器
刚刚提到的’or 1=1其实可以算的上是一个万能米啊登录,它的用法可以写成
select username,password from users where username ='texvalue'or 1=1 -- ' and pasword = 'texvalue2'
–注释符号后面是有一个空格的,不可以忽略
这里的or它遵循的是如果第一个是对的,那么就不会执行后面的那个,如果第一个是错的,那么就是执行后面正确的。而1=1就是恒为真值的,所以不论是错的,空的,,后面都是保证是真的,所以都是可以执行的。
它俩最简单的区分方式就是查看时否有单引号进行包裹,有的话就是字符型,没有的就是数字型
没有修改默认账户的名称,比如说
SQL Server默认的数据库系统管理员账户是-sa
MySQL中默认使用的账户名称是-root和anonymous
Oracle在创建数据库的时候通常默认会创建SYS,SYSTEMS DBSNMP和OUTLN账户
get方法是一种请求服务器的http方法,使用这种方法的时候,信息包含在URL中;比如说,在点击链接的时候会使用这种方法。
get请求方法的格式
?text=value 1&cat= value2&num=value3...
修改的方式
post是一种用于向web服务器发送信息的http方法
数据信息无法在URL中看到,所以一般可以发送字节大的数据。