注意:这篇文章是我的学习总结,仅供大家学习。
需要了解mysql知识链接:mysql知识点总结链接
1、SQL注入漏洞定义:
SQL是发生于应用程序与数据库层的安全漏洞,网站内部直接发送的SQL请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造SQL语句,如果用户输入的数据构造成恶意SQL代码,web应用又未对动态构造的SQL语句使用的参数进行过滤,则会带来意想不到的危害。
前置知识补充:
mysql中重要的数据库:
information_schema数据库------其中保存着关于mysql服务器所维护的所有其他数据库的信息,比如数据库名,数据库表,表字段的数据类型与访问权限等,web渗透中用途很大。
SCHEMDATA表:**提供了当前mysql实例中所有的数据库信息,show databases结果来自这个表。
TABLES表 :提供了关于数据库中所有表的信息。字段table_schema是数据库名。字段table_name是表名。
COLUMNS表 :纪录了全部数据库的字段。字段column_name是列名,表示当前表中的字段名。
mysql数据库------mysql这个数据库中表user,存储量数据库中的用户名、密码
2、GET型SQL注入漏洞定义
我们在提交网页内容时候,主要分为GET方法,post方法。GET方法提交的内容会显示在网页url上,通过对url连接进行构造,可以获得超出权限的信息内容。
3.检查get型sql注入漏洞的一般步骤(没有过滤)
(1)判断是否存在注入点(如果拼接到sql语句中被当做代码执行,则存在注入点)
and 1=1
and 0
'
/
当添加这个数字后,页面不能正常显示,则存在注入点。
(2)判断字段数
order by数字(排序,判断字段数。oder by 1 表示对第一个字段进行排序,order by 2就是对第二个字段进行排序。)
详细解释:
根据数据库相关知识,数据库中可以有多张表,一个表里面有多个字段(比如:学生表中的字段包括------学号、姓名、性别等),**oder by不仅可以对查询结果进行排序,而且当在oder by后面指定数字(x)的时候,表示根据第x字段对查询数据进行排序。如果x的数值大于,表中字段数真实值,就会报错。此时我们就可以通过调整x的值,确定表中的字段数。**确定字段数很重要,因为当确定好当前表中的字段数后,我们就可以通过union查询获取到更多数据库相关知识。
(3)判断显错位
根据第二步操作,我们已经确定了字段数,接下来,我们使用union联合查询语句,就可以拼接一个构造sql语句的结果,从而达到信息获取的目的。
联合查询解释:就是将多次查询的结果合并起来,形成一个新的查询结果。
比如:前提条件:a表:id int;name varchar(20)
b表:age int;address varchar(20)
select * from a union select *from b;这个查询语句就会将表a和表b的结果合并成一张表。
注意事项:使用联合查询的多张表,多张表的列数必须保持一致,字段类型也需要保持一致,并且返回字段数必须一致。
在web安全中union的使用:
首先让网页报错,其次要使用union查询,获取相应的信息。
常见的构造语句:正常sql语句 and 1=2(让联合语句的前半句失效,从而执行我们构造的sql语句) union select 1,2,..,x (x表示当前表的字段数)
语句解释:联合查询后半句中,我们发现select 语句后面跟的是数字,而不是字段名。表示从表的第几(i)个字段(如:第一个字段对应的字段名是name,则相当于是select name,2..x)获取数据。同时我们发现后半句没有指定表名,这并不会报错,而是将select后面的数字依次添加到前半句查询的结果中。
(4)判断数据库名
根据联合查询union的报错列表,用database()替换回显位或显错位,执行了select database()查询当前使用的数据库信息。
(5)判断表名
根据文章开头补充的知识,我们可以知道information_schema数据库中的tables表和columns表很重要。因为可以通过这两张表确定管理员信息所在的表,从而获取敏感信息。
接下来是利用tables表和columns表的实例:
and 0 union select 1,table_name from information_schema.tables where table_schema="web回显得到的数据库名称" limit 0,1;
解释:首先and 0 是为了制造一个错误回显,目的是为了执行后面的union语句,table_name位置是错误回显的位置,该字段表示"表名",从information_schema数据库中的tables表中获取,并且获取的表名是来自"web回显的数据库",语句最后结合limit语句是为了获取数据库中的多张表的表名。
limit用法解释:limit 0,1------0表示从第一行开始显示,1表示只显示一行。
最后当我们获取得到数据库中的所有表后,根据实际的经验对表进行筛选,最终确定管理员所在表名。
(6)判断字段名
当目前为止我们已经知道了管理员所在表名,接下来我们就需要根据表名,检查表中的字段,然后判断筛选出管理员的用户名和密码。
在这个过程中我们就需要使用到information_schema数据库中的columns表,并且根据column_name字段进行查询。同时也需要划定范围是"数据库名是web回显的数据库"和"表名是经过分析筛选出的表名"。
接下来是判断字段名的实例:
and 0 union select 1,column_name from information_schema.columns wher table_schema=database()(或者是错误回显的数据库名)and table_name="管理表名" limit 0,1
解释:and 0 制造一个错误回显,为了执行后面我们构造的sql语句,column_name是错误回显的位置,从information_schema数据库中的columns表中获取数据,条件判断为:"数据库是错误回显的数据库"和"表是管理者表"。
这条语句中使用limit的作用是:获取出管理员表中的多个字段。
(7)查询值
经过以上六步,我们得到了管理员所在的表以及表中字段名,接下来就可以获取到管理员的用户名和密码。
实例如下:
and 0 union select 1,获取到的字段名 from 管理员表
解释:and 0 制造错误回显,为了执行后面的union语句,通过基本的查询语句,可以获取到管理员的账户信息。
通过获取到的密码是经过加密的,所以还需要对得到的密码使用在线解码器进行解码。