Web安全-SQL注入 基本了解

介绍

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映射操作数据库
  • 对字符进行预编译
  • 注意各种操作数据库的地方是否有这类危险
更多关于SQL注入的内容可以看我以前写过的这方面专题(最早写的,都没怎么整理,可能写的会比较乱)

https://www.jianshu.com/nb/27869366

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • [SQL注入攻击] SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式...
    James黄杰阅读 2,974评论 0 30
  • 什么是SQL注入攻击?引用百度百科的解释: sql注入_百度百科: 所谓SQL注入,就是通过把SQL命令插入到We...
    leftshine阅读 5,107评论 0 24
  • 注入攻击的分类 1.没有正确过滤转义字符 在用户的输入没有为转义字符过滤时,就会发生这种形式的注入式攻击,它会被传...
    查无此人asdasd阅读 1,864评论 0 5
  • 姓名:于川皓 学号:16140210089 转载自:https://baike.baidu.com/item/sq...
    道无涯_cc76阅读 2,076评论 0 2
  • 恒久远的年代。。。。。在无边的大草原上。。。。一条蜿蜒流淌的大河从中经过。。。河的两岸生活着许多动物。。...
    金莲阅读者阅读 399评论 0 0

友情链接更多精彩内容