SQL注入原理
一. 介绍sql注入
sql注入是指Web应用程序对用户输入数据的合法性判断,前端输入后端的参数是攻击者可控的,并且带入数据库查询,攻击者可以通过构造不同的SQL语句来实现对数据库的任意操作!
当开发人员在运行过程中需要根据不同的查询标准决定提取什么字段(如select语句),或者根据不同的条件下选择不同的查询表时,动态的构造SQL语句会非常有用。
下面的PHP语句为列子:
$query = "selet * from users where id = $_GET[id]";
由于这里的参数id可控,且带入数据库查询,所以非法用户可以任意拼接SQL语句进行查询
SQL语句也可以分为很多种 如 报错出入 盲注 Union注入
二.SQL注入原理
SQL注入漏洞需要满足以下两个条件:
1.参数用户可控:前端传入后端的参数内容是用户可以控制的。
2.参数带入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询
当出入的参数为1’(单引号)时,数据库执行如下代码:
select * from users where id =1'
这不符合数据库语法规范所以会报错,当传入id的参数为 and 1=1时,执行的SQL语句如下:
select * from users where id =1 and 1=1
因为1=1为真,且where语句中id=1为真,所以页面会返回与id=1相同的内容,当传入的id为 1=2时,由于 1=2不成立 ,会返回假,页面会返回与id=1不同的结果
由此可以初步判断id参数存在SQL注入漏洞,攻击者可以进一步拼接SQL语句进行攻击,致使数据库泄露,直到进一步获取服务器权限。
例子
比方说我们在某网站后台登录界面,有两条输入框,一条是帐号一条是密码。那么我们可以猜测数据库中有一个admin表,表里面有两个字段username和password 。这样我们输入用户(比如123)密码(比如456)并提交之后,数据库就会执行一段查询语句:
select id from users where username = '123 and password = '123'
并判断用户名123是错误的(为假)
之后返回帐号密码错误信息。
那么如果我们在用户名处输入’or 1=1-- 而密码随便输入个456呢? 我们来看看数据库中的查询语句:
select id from users where username = '' or 1=1-- and password = '456'
这里呢1=1永远为真,后面 and password = '456’被注释掉了。数据库不需要考虑,这里我们就跳过了验证。
这就是几年前的万能密码,这里只是说说逻辑。
部分出自sql注入