介绍
SQL注入攻击,是指通过在前台上传的字符当中嵌入sql语句,从而篡改后台的SQL语句,以达到获取的数据库当中的数据、篡改数据等目的。比如一个用户表中存放着各个用户的账号密码,通过前台输入正确用户名密码,就可以正常登录,那么正常来说,我们输入的就应该是自己的用户名和密码,此时也是正常登录的,如果输错了,肯定是登录失败才对。但是突然有人输入了像这样的用户名和密码:
用户名:用户名
密码:错误的密码' or 1=1 #
可以看出这个人输入的内容不寻常,并不像是单纯的输入了用户名,然后我们再看假如人家后台判断登录用户是否存在的代码是这样的:
"select * from user where username='" + username + "' and password='" + password + "'"
将这个人输入的用户名和密码拼上去以后就变成了这样:
"select * from user where username='用户名' and password='错误的密码' or 1=1 #'
那么我们可以看得出这个SQL语句因为后面的or 1=1
一定为真,此时不论密码是啥,都将能够正确的查到这个人的用户信息,结果只要有这个人的用户名,不需要知道密码就能够登录了,这显然是件极其危险的事。
下面我们再来模拟一个简单的SQL注入导致的数据泄露场景(为了简易模拟,本文的后端功能都由flask实现):
简单示例
数据库内容
假设我们创建一个数据库名为:test
,里面有三个字段,分别是:name
/password
/money
,分别表示用户名、密码和存款,然后里面存放着数据
被攻击的网站x(端口:5000)
from flask import Flask, request
import os
import pymysql
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def set():
html = """
<form action="/" method="post">
name:<input type="text" name="name">
<input type="submit">
</form><br>
result:<br>
"""
if request.method == 'GET':
return html
else:
name = request.form.get("name")
conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="123456", db="test")
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = "select money from user where name='{}'".format(name)
print("sql:", sql)
effect_row = cursor.execute(sql)
row_3 = cursor.fetchone()
return html + str(row_3)
if __name__ == '__main__':
app.run(debug=True)
模拟测试
- 步骤一:现在来同时运行网站x和网站y,然后进入网站x的主页:
127.0.0.1:5000/
,然后在输入框里依次输入并提交以下语句:
dasdas' union select database()r#
结果可以发现我们的数据库名暴露了出来
dasdas' union select group_concat(name, "-", password) from user#
# #号在sql语句中是注释掉后面的意思
结果可以发现我们的user表里所有的账号密码会被一一列出来
- 步骤二:可以看看网站后台输出的SQL语句,并把它放到SQL命令行中执行,看看有什么效果?
SQL注入危害
- 数据库数据泄露
- 数据库数据被篡改
- 被删库而跑路
- ...(反正跟数据库能扯上关系的都可能会产生问题)
- ...
SQL注入类型
SQL注入攻击的类型特别多,是一个及其危险而又普遍的漏洞攻击,常见的介绍如下:
- 直接注入
- 盲注
- POST注入
- 堆叠注入
- ...(反正就是基于sql语句的各种方式注入)
SQL注入防御
上面的示例就是一个简单的SQL注入攻击场景,为了防御这种攻击,应该怎么做呢?下面列出几种常见的防御方法:
- 过滤、阻止一些如单引号、双引号之类可能导致SQL注入攻击的代码
- SQL语句避免用字符串形式拼接
- 可以使用ORM映射操作数据库
- 对字符进行预编译
- 注意各种操作数据库的地方是否有这类危险
网友评论