SQL注入原理

SQL注入概述
SQL注入是什么呢?听名字就知道和数据库相关的啦!其实就是通过数据库查询语句来攻击,获取到SHELL.以及获取数据库中各种信息.
那么怎么会被造成攻击呢?其实就是程序员并没有严格把关程序的运行,就是在查询数据库里面的信息,的时候程序员并没有对我们(用户)输入的信息进行过滤(限制),然后通过一些SQL攻击会造成一个SQL注入的漏洞,SQL注入的漏洞危害比较大,因为公司里面拿到SHELL不可怕拿到数据库里面的信息才是可怕。我们把我们的输入的东西代入数据库查询,如果并没有限制字符的话,那么就可以造成SQL注入。这张图片是我从网上盗的。

SQL注入原理_第1张图片

SQL注入能干什么?那么我可以告诉你SQL注入危害很大
  • 信息泄漏
  • 获取管理员权限
  • 提权到shell
进行SQL注入一般需要那几步?
第一步的话,肯定是判断没有没有SQL注入的漏洞的,一种最简单的方法来判断到URL的后面加一个'(前提是我们传值了),报错的话,那么有可能会存在SQL注入,这里为什么说是有可能呢?因为怕有网站防火墙。安全狗这类的。一般有SQL注入的漏洞的话,会爆数据库的错误,(如果报错显示了绝对路径的话,那就更好了)
  • http://192.168.1.1/search?id=1'
  • http://192.168.1.1/search?id=1 and 1 = 1
  • http://192.168.1.1/search?id=1 and 1 = 2
这三个例子都可以判断SQL注入,第一个返回报错就是存在SQL注入,第二个不会报错,显示正常,第三个显示报错,就是存在SQL注入,这时候我想有些新手的话,就不会懂, 这三个列子是什么?
像第一个,本来代入数据库里面查询的是语句是这样的 SELECT 字段 FROM 表名 WHERE id= 1; 正常的话是这样的进入数据库查询的,那么我们在1后门在加上了'那么这时候后端代码并没有验证我们输入的东西,所以'也就直接代入了数据库查询,这里是数字型的搜索,所以'不是会被解析的,所以会报错。这时候就可以判断,我们的单引号是代入了数据库查询的,所以这样就可以判断有SQL注入。
第二个也就是SELECT 字段 FROM 表名 WHERE id= 1 and 1 = 1; 这时候肯定不会报错的,因为这是的SQL查询是成立的,所以不会存在报错,除非是在代码处做了限制,不允许有and这样的字符串,.
第三个代入数据库查询的语句就是SELECT 字段 FROM 表名 WHERE id= 1 and 1 = 2;这样的话,1=2是不成立的,那么就会报错。
这些就是数字型注入判断。
而字符型的注入
而字符串型的注入,其实可以用单引号来进行判断,因为那是代入数据库的语句是 SELECT 字段 FROM 表名 WHERE id= '1'';这样代入数据库的话也会进行报错,因为查询的东西在单引号里面。图解:我这里使用的是DVWA的环境来做的实验

可以看到的是这里是并不是使用的post传值,我传入的值是1'所以这里报错了%27就是单引号是url编码的,我们再来看下源码。
SQL注入原理_第2张图片
可以看到这里是字符型的传值,我们代入数据库的查询就是:SELECT first_name,last_name FROM users WHERE user_id = '$id';这里的$id就是我们传入的值我们传入了一个1'这时候的语句变成了,SELECT first_name,last_name FROM users WHERE user_id = '1'' 这样的话数据库是看不懂还有一个单引号是干嘛的,所以会报错的。我们可以使用or 1 = 1来进行简单的注入,把表的内容显示出来
SQL注入原理_第3张图片
这时候就把表中的所有的数据列举出来了。
这时候的代入数据库中的数据是SELECT first_name,last_name FROM users WHERE user_id = '1' or 1 =1 #' 这样的,这时候数据库并不会判断id是不是等于1,而是会直接看后面的or 1 = 1,这时候会选择表中的每一条信息,#就是注释--也是注释
而后我们可以来判断这个字段数量使用order by 来猜解数量
SQL注入原理_第4张图片
可以看到的是我猜解三个字段还是报错,那么我猜解两个字段
SQL注入原理_第5张图片
返回正常,那么这样的话,可以知道有两个字段。
这时候就可以是使用union联合注入了
SQL注入原理_第6张图片
这里代入数据库的其实就是 SELECT first_name,last_name FROM users WHERE user_id = '1'union select version(),user() #;(如果是在数据库里面运行的话可能在select哪里要拿括号起来),这样会查询后门的我们需要查询的东西。这样的话我们已经知道了数据库的版本和用户的账号密码。

就讲到这里了,想要继续进行注入的话,使用union就行了.自我感觉我原理讲的不好。
本人新手,请大佬多多指教



你可能感兴趣的:(安全)