sql注入产生的原因:
由于程序过滤不严谨,导致用户有一些异常输入,最终触发数据库的查询。所以会出现sql注入这个问题。有些恶意的人就会利用这些信息导致数据库泄露。
注意:一般我们存在注入点我们会查询管理员的账号和密码;但是我们现在是在前端页面下的,我们并不知道管理员的数据在哪个数据库哪张表下的。(我们需要知道在哪个数据库,哪张表,哪个字段下;这个是前提)当我们发现一个注入点是首先将前置条件查询出来:1.mysql的版本号 select version();2.mysql的权限(用户),如果当前为root那么入侵成功率就很高。 select user();3.当前所在的数据库问题1:你现在有普通用户的权限,查到了管理员的账号和密码:1.管理员的后台找不到 2.管理员的密码破解不了此时该怎么办?回答:挖掘存储型XSS
第一关实际操作:
1:前端输入
在这里我们搭建了一个sql注入的靶场,如下图所示,在web的前端页面中使用id来接受用户传递进来的值。将值传递给后端进行处理。
后端处理代码:如下图可知前端web页面输入的值由id传递给后端的sql代码中处理。
2:逃逸单引号
我们这里就可以思考如何控制用户的输入触发数据的额外查询。要是传递进来的sql语句能够被执行就好了。但是传递进来的所有值都被单引号包裹,全部被变成了字符串,这是我们就要思考如何逃出单引号的包围。
当我们传递进来的不是1,而是1’ 时:就会报错,报错的原因就是多了一个单引号,如下图:
这里提示我们有语法错误,那么就意味着我们已经逃逸出了单引号,但是后面还有一个单引号所以会报错。此时我们需要闭合单引号。我们可以使用注释将后面的单引号注释掉:
我们这里的注入点为 1' ,但是后面还有一个单引号,我们需要将后面的另一个单引号注释掉;
mysql中的三种注释方法:“-- ”:注意后面的空格在web的url中我们需要写为“+”,“--+”#/* */
如下图:并没有报错,说明我们找到了注入点并可以成功的闭合,我们就可以在此处插入sql注入。
我们查看后端页面:
3.使用联合查询进注入
爆破列数:
使用联合查询需要有一个前置条件,两个表的列相同。我们怎么能够知道这个表有几列?
解决方法:
此时我们就需要一个函数 order by:
order by 是排序的意思,通常来说我们是通过字段来排序的,但是order by后面也可以以跟数字;
order by 1 :表示根据第一列来排序
order by 2 :表示根据第二列来排序
如下图,如果order by后面的数字大于真实的列数时就会报错:我们就可以查出列数:
在sql靶场中进行操作:
当order by 3时页面正常显示,当order by 4时页面报错,说明我们当前所处的表有3列:
联合查询
我们前面已经知道这张表的列数了,所以这里写三个参数。
如上图,联合查询后还是没有任何变化,原因:
- 原因:联合查询的条件是前面的条件为假,后面的联合查询才能为真,就意味着前面的已经查到了所以后面的就不执行了。此时我们需要使前面的条件为假,我们有两种方案:
1:查一个不存在的id
2:第二种使使用负号
如下图:当传递进来的id为负数,前面的为假,联合查询后面的为真。在name和password字段上就显示2,3。
这里我们发现,前端页面显示的是2,3字段,说明数据就出在这两个字段上。“1”也可以出数据但是没法在前端页面上显示。
此时可以就可以控制2,3字段的内容:
查数据库名,版本号,用户:
将2,3字段替换:查数据库和版本
此时我们就查出了数据库和数据库的版本:
查用户:
爆破表名:
既然已经知道注入点在2,3字段,我们从该字段下手。
之前我们知道自己的数据库名,叫做: security。那么现在我们需要知道本数据库下有哪些表。
此外我们知道数据库存在一个系统自带的数据库: information_schema ;其中包含表的信息。
我们就可以通过查询这个数据库中的信息吧当前数据库下的表全查出来:
注意:基本上mysql中都会存在information_schema这个系统自带的数据库。但是这个数据库只有root用户才能访问,由于我们上面已经查询到了当前的用户为root,所以我们就直接利用它。如果不是root用户还有其他的数据库可以替代它。
我们去查看information_schema数据库具体信息:其中叫tables表中有我们想要的信息,我们可以使用这张表查询我们想要的信息:
开始爆破表名:如下图就爆破出了当前数据库下的所有表名。
在下面几张表中最可能储存用户和密码信息的为users表。但是我们不知道该表的字段名,所以我们继续利用information_schema来爆破字段名。
id=-1%27%20union select 1,group_concat(table_name),3 from information_schema.tables where table_schema="security" --+
爆破列名:
在information_schema中,列名在:columns这张表中。
开始爆破表名:如下图就吧列名爆破出来了。
id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema="security" and table_name="columns"--+
爆破具体值:
因为我们现在知道表名以及字段名,我们就可以直接查询(users这张表在本数据库下面):
d=-1' union select 1,group_concat(username,0x3a,password),3 from users--+
到此,我们成功的完成了一次注入!