SQL注入攻击实战演示(附源码)

article/2025/10/3 10:45:42

SQL注入是一种非常常见的数据库攻击手段,SQL注入漏洞也是网络世界中最普遍的漏洞之一。大家也许都听过某某学长通过攻击学校数据库修改自己成绩的事情,这些学长们一般用的就是SQL注入方法。

文章目录:

  • 何谓SQL注入?

  • SQL数据库操作示例

  • SQL数据库注入示例

  • 如何防止SQL注入问题

  • SQL数据库反注入示例

一、什么SQL注入?

SQL注入其实就是恶意用户通过在表单中填写包含SQL关键字的数据来使数据库执行非常规代码的过程。简单来说,就是数据「越俎代庖」做了代码才能干的事情。这个问题的来源是,SQL数据库的操作是通过SQL语句来执行的,而无论是执行代码还是数据项都必须写在SQL语句之中,这就导致如果我们在数据项中加入了某些SQL语句关键字(比如说SELECT、DROP等等),这些关键字就很可能在数据库写入或读取数据时得到执行。

多言无益,我们拿真实的案例来说话。下面我们先使用SQLite建立一个学生档案表。

二、SQL数据库操作示例

import sqlite3# 连接数据库
conn = sqlite3.connect('test.db')# 建立新的数据表
conn.executescript('''DROP TABLE IF EXISTS students;CREATE TABLE students(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL);''')# 插入学生信息
students = ['Paul','Tom','Tracy','Lily']for name in students:query = "INSERT INTO students (name) VALUES ('%s')" % (name)conn.executescript(query);# 检视已有的学生信息
cursor = conn.execute("SELECT id, name from students")
print('IDName')
for row in cursor:print('{0}{1}'.format(row[0], row[1]))conn.close()

点击运行按钮将会打印目前表中的内容。上述程序中我们建立了一个test.db数据库以及一个students数据表,并向表中写入了四条学生信息。

那么SQL注入又是怎么一回事呢?我们尝试再插入一条恶意数据,数据内容就是漫画中的"Robert');DROP TABLE students;--",看看会发生什么情况。

三、SQL数据库注入示例

conn = sqlite3.connect('test.db')# 插入包含注入代码的信息
name = "Robert');DROP TABLE students;--"
query = "INSERT INTO students (name) VALUES ('%s')" % (name)conn.executescript(query)# 检视已有的学生信息
cursor = conn.execute("SELECT id, name from students")
print('IDName')
for row in cursor:print('{0}{1}'.format(row[0], row[1]))conn.close()

你将会发现,运行后,程序没有输出任何数据内容,而是返回一条错误信息:表单students无法找到!

这是为什么呢?问题就在于我们所插入的数据项中包含SQL关键字DROP TABLE,这两个关键字的意义是从数据库中清除一个表单。而关键字之前的Robert');使得SQL执行器认为上一命令已经结束,从而使得危险指令DROP TABLE得到执行。也就是说,这段包含DROP TABLE关键字的数据项使得原有的简单的插入姓名信息的SQL语句

"INSERT INTO students (name) VALUES ('Robert')"

变为了同时包含另外一条清除表单命令的语句

"INSERT INTO students (name) VALUES ('Robert');DROP TABLE students;--"

而SQL数据库执行上述操作后,students表单被清除,因而表单无法找到,所有数据项丢失。

四、如何防止SQL注入问题

那么,如何防止SQL注入问题呢?

大家也许都想到了,注入问题都是因为执行了数据项中的SQL关键字,那么,只要检查数据项中是否存在SQL关键字不就可以了么?的确是这样,很多数据库管理系统都是采取了这种看似『方便快捷』的过滤手法,但是这并不是一种根本上的解决办法,如果有个美国人真的就叫做『Drop Table』呢?你总不能逼人家改名字吧。

合理的防护办法有很多。首先,尽量避免使用常见的数据库名和数据库结构。在上面的案例中,如果表单名字并不是students,则注入代码将会在执行过程中报错,也就不会发生数据丢失的情况——SQL注入并不像大家想象得那么简单,它需要攻击者本身对于数据库的结构有足够的了解才能成功,因而在构建数据库时尽量使用较为复杂的结构和命名方式将会极大地减少被成功攻击的概率。

使用正则表达式等字符串过滤手段限制数据项的格式、字符数目等也是一种很好的防护措施。理论上,只要避免数据项中存在引号、分号等特殊字符就能很大程度上避免SQL注入的发生。

另外,就是使用各类程序文档所推荐的数据库操作方式来执行数据项的查询与写入操作,比如在上述的案例中,如果我们稍加修改,首先使用execute()方法来保证每次执行仅能执行一条语句,然后将数据项以参数的方式与SQL执行语句分离开来,就可以完全避免SQL注入的问题,如下所示:

五、SQL数据库反注入示例

conn = sqlite3.connect('test.db')# 以安全方式插入包含注入代码的信息
name = "Robert');DROP TABLE students;--"
query = "INSERT INTO students (name) VALUES (?)"conn.execute(query, [name])# 检视已有的学生信息
cursor = conn.execute("SELECT id, name from students")
print('IDName')
for row in cursor:print('{0}{1}'.format(row[0], row[1]))conn.close()

而对于PHP而言,则可以通过mysql_real_escape_string等方法对SQL关键字进行转义,必要时审查数据项目是否安全来防治SQL注入。

当然,做好数据库的备份,同时对敏感内容进行加密永远是最重要的。某些安全性问题可能永远不会有完美的解决方案,只有我们做好最基本的防护措施,才能在发生问题的时候亡羊补牢,保证最小程度的损失。

六、网络安全零基础入门

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

 

同时每个成长路线对应的板块都有配套的视频提供:

 

因篇幅有限,仅展示部分资料,需要的小伙伴可以持续关注我~

2.视频教程

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩。

 

3.SRC漏洞挖掘&护网行动资料

其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!

 

4.网络安全工具包合集


http://chatgpt.dhexx.cn/article/ahHlBADv.shtml

相关文章

SQL注入攻击入门

目录 一、SQL注入的原理 SQL注入漏洞的条件 二、SQL注入的危害 三、SQL注入的分类 1、注入点数据类型分类 (1)数字型注入 (2)字符型注入 2、注入点位置分类 3、注入方法分类 (1)布尔型注入 &…

数学里上凹,下凹,上凸,下凸

https://zhidao.baidu.com/question/238541854.html 数学里上凹,下凹,上凸,下凸统称为曲线的凸知性,其是指在平面坐标系里的图形样式: 1、开口向上的曲线,称为上凹,或称为下凸,形状…

凸凹函数

凹凸函数的代数定义 若函数f(x)为凸函数,那么- f(x) 为凹函数。所以,清楚了凸函数,等价于清楚了凹函数 凸函数的定义 对于一元函数f(x),如果对于任意tϵ[0,1]均满足:f(tx1(1−t)x2)≤tf(x1)(1−t)f(x2),则称…

一元函数的凹性concavity以及二阶导数

凹性(concavity)与函数导数的变化率有关。一个函数f是上凹(即抛物线方向开口向上),其导数f是增函数,也意味着f的导数(即f)是正数;类似的一个函数f是下凹(即抛物线方向开口向下),其导…

转载--32个鲜为人知的自学网站

分享32个鲜为人知并且完全免费的高质量自学网站,每个都是堪称神器,让你相见恨晚。 1:Oeasy 是一个完全免费的综合视频教程网站,非常良心实用。 它提供的视频教程非常丰富并且质量很高,包括:PS 教程、手机摄…

分享32个高质量的自学网站

原文作者:木子淇 链接:有哪些高质量的自学网站? - 知乎 来源:知乎 1:Oeasy http://oeasy.org/Oeasy 是一个完全免费的综合视频教程网站,非常良心实用。 它提供的视频教程非常丰富并且质量很高&#xf…

Jack魏--个人介绍

Jack魏 1.名字由来2.兴趣爱好3.专业技能4.所获荣誉5.所获证书6.博主平台7.阅读书籍 1.名字由来 大二去韩国大邱永进专门大学短期学习的时候, 遇到了来自加拿大的Jack老师, 他无拘无束、有趣的教学方式感动了我, 所以我的英文名为了致敬他&am…

saiku 连接 MySQL_Saiku连接mysql数据库(二)

Saiku连接Mysql数据库展示数据 参考链接:https://www.cnblogs.com/shirui/p/8573491.html 前提:Saiku已安装好,mysql已安装好 1.添加Saiku的数据库驱动: mysql-connect-java-5.1.17.jar 下载相应的数据库驱动放到 saiku-server\to…

解决生成的saiku文件读取中文乱码的问题

javax.ws.rs.WebApplicationException: org.saiku.service.util.exception.SaikuServiceException: org.saiku.service.util.exception.SaikuServiceException: Cannot get native cube for cube ( [pda].[pdaTest].[pdaTest].[鑽簵鍒嗘瀽] ) at org.saiku.web.rest.resource…

saiku集成CAS

最近一直在研究saiku如何集成公司的单点登录系统,通过google、百度搜集查阅了大量的相关资料,并和网友讨论最终在公司内部集成完成,最终测试上线;现将这一过程中的经验记录下来,分享给需要的朋友.... saiku集成CAS这一…

saiku连mysql 使用_Saiku的基本使用介绍(三)

Saiku的基本使用介绍(这里都是使用Admin用户登录系统) 1、启动安装好的Saiku ( ./start-saiku.sh ) ,浏览器使用访问系统 http://localhost:8080 ,然后使用 admin admin 登录系统 2、 登录系统后,首先点击 A ,进入管理控制平台(添加数据源信息) 2.1 根据…

使用Saiku角色权限控制Schema行级权限操作

描述:saiku加载schema模型,选择维度或度量,动态组合要展示数据进行分析操作的工具。 话不多说,直接操作 1、用admin登陆saiku,点击A按钮,添加用户sa 如图: 2、设置用户名,密码&…

saiku java_saiku 3.8 二次开发代码整理步骤(20160727更新)

创建新项目saiku3 在创建的项目中,分别创建resource目录:“src/main/saiku-web”,“src/main/saiku-service”,“src/main/saiku-olap-util”,并将saiku-core下的相应代码(java目录下和resources目录下的文件)分别copy…

saiku连mysql 使用_saiku应用的调试

ubuntu下解压saiku包后使用: 运行.sh命令(.bat是windows命令)。运行时注意权限。可以先chmod ax *.sh 提示,catali?.sh出错。 这是tomcat的一个文件,服务器不行,先查权限,当前用户。 一般是java配置的不对。…

saiku java_saiku3.8二次开发项目搭建(非maven)

参考文章:http://blog.csdn.net/gsying1474/article/details/51603535 本文大部分参考了上面的博文,这里只是做一个记录,由于本人maven能力有限,尝试失败后这里搭建的是普通web项目。 saiku3.8项目搭建步骤: 1.下载sai…

saiku 连接 MySQL_saiku迁移至mysql步骤

saiku数据库的表和用户默认创建是在启动项目的时候,通过初始化 saiku-beans.xml 中的 h2database 这个bean执行org.saiku.service.Database类的init方法来初始化数据表和默认用户的。 默认用户迁移mysql步骤: 1.修改web.xml文件,修改名为db.u…

saiku 使用笔记

OlapException :Unable to find a member with name …… 报表可以查看,但是不能使用过滤器(比如:keep only) 点击后出现错误 备注:saiku 3.15 数据库为mysql 5.5 解决方法:将mysql5.5 服务关闭&am…

saiku java_Saiku的下载与安装(一)

Saiku- 数据可视化的工具,连接数据源展示数据,并且可方便导出xls/csv/pdf等文件的工具 一、Saiku下载 二、 Saiku安装 (将下载好的Saiku包放在任意盘目录,不需要配置关于Saiku的环境变量,前提 安装好JDK,配置好JAVA_HO…

saiku安装

saiku安装使用 经过一天的查询资料摸索,记录一下笔记,方便以后使用。 1、http://community.meteorite.bi/ 下载; 2、解压运行对应系统脚本文件。 3、访问8080可以进入登录页面。 4、https://licensing.meteorite.bi/login 注册账号登录。…