美文网首页
Web安全-SQL注入 基本了解

Web安全-SQL注入 基本了解

作者: dawsonenjoy | 来源:发表于2019-09-28 22:37 被阅读0次

    介绍

    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

    相关文章

      网友评论

          本文标题:Web安全-SQL注入 基本了解

          本文链接:https://www.haomeiwen.com/subject/ujfjuctx.html