安全测试之SQL注入

本文介绍了SQL注入的概念,通过创建用户表并展示Python代码示例,解释了如何利用SQL注入实现非法登录。在登录功能中,通过输入特定的用户名(如'"or1=1or"')和任意密码,可以绕过验证,达到无账号登录的效果,揭示了SQL注入的危害。
摘要由CSDN通过智能技术生成

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息,甚至实现无账号登录,篡改数据库等。

以下的例子是用的Mysql 和 Python,如果是其它的环境,自行修改,道理相同。

下面直接上例题:

(1)在数据库中创建用户表(t_user)

直接上SQL,看我爱不爱你们~

INSERT INTO `t_user`(`id`, `username`, `userphone`, `userbalance`, `password`, `trueName`, `token`, `city`, `age`) VALUES (1, 'Hami', '15088888888', '6999.67', '123456', '哈米', 'MTYyODA3NjE4NC4wMTAwMzU6ZWZkMTA0Y2RjYzA4YzI1MDEwNmZmMzgzNmY0M2RhNGYwY2EzMzcxOQ==', '上海', 18);
INSERT INTO `t_user`(`id`, `username`, `userphone`, `userbalance`, `password`, `trueName`, `token`, `city`, `age`) VALUES (2, 'Yulisa', '13666666666', '600.98', '456789', '云中蝶', 'MTYyNzExODU4Ny4zNjE5Mjg6YWM1MjUwMDRmN2ExYmFmZTc2OTNlZmQyNzI2ZmExNDRhYWQ0MWQ4NA==', '长沙', 20);
INSERT INTO `t_user`(`id`, `username`, `userphone`, `userbalance`, `password`, `trueName`, `token`, `city`, `age`) VALUES (9, 'sanmao', '15678887777', '0', '123456', '三毛', 'MTYyNzExODU4Ny45MzU1OTgxOmVjMjIzYjY3ZWQ2MjEyMDllMjMxNjJkMTY1YTYzMGY4MjQ2ZmE2NDI=', '长沙', 20);

 (2)然后在Python当中代码如下:

下面的代码只要确定对应的模块安装,并且修改db变量的数据为你自己的数据即可直接使用。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import pandas as pd
from sqlalchemy import create_engine


def ex_db(sql_query):
    # db = 'mysql+pymysql://[数据库登录用户名]:[密码]@主机IP:端口/数据库'
    db = 'mysql+pymysql://root:123456@localhost:3306/test'
    dbinfo = create_engine(db)
    # 使用pandas的read_sql_query函数执行SQL语句,并存入DataFrame
    sql_read = pd.read_sql_query(sql_query, dbinfo)
    sql_dict = sql_read.to_dict()
    return sql_dict

def get_all_data():
    print("---当前系统已存在账号密码---")
    sql_query = 'select * from t_user;'
    sql_data = ex_db(sql_query)
    for i in range(len(sql_data["id"])):
        print("账号:{0},密码:{1}".format(sql_data["username"][i], sql_data["password"][i]))

def log_fction():
    """
    登录功能
    :return:返回当前用户的用户名和密码
    """
    get_all_data()
    print("---欢迎来到登录页面---")
    username = input("请输入用户名:")   # username = '" or 1=1 or "'
    password = input("请输入密码:")    # password = "123456"
    print("---您的账号和密码是---")
    print("账号:{}".format(username))
    print("密码:{}".format(password))
    is_ok(username,password)

def is_ok(username,password):
    """
    判断当前的用户名和密码是否正确
    :param username: 输入的账号
    :param password: 输入的密码
    :return: 没有返回值
    """
    sql_query = 'select * from t_user WHERE username="{}" and password="{}"'.format(username, password)
    sql_data = ex_db(sql_query)
    if len(sql_data["id"]) > 0:
        print("登录成功")
    else:
        print("登录失败,请确认您的账号密码")
    print("当前SQL为:{}".format(sql_query))
    print("当前的用户数据:{}".format(sql_data))

if __name__ == '__main__':
    print("---欢迎来到SQL注入小课堂---")
    log_fction()

(3)show Time ~ 

成功登录示意图:

 失败登录示意图:

 通过以上你会发现已经基本实现登录的效果了,下面就来SQL注入的重点。

(4)SQL注入

操作步骤:在输入用户名和密码的时候分别输入:'" or 1=1 or "'   和 123456

看上面的截图,你会发现,为什么就登录成功了呢 ?对,这就是SQL注入,通过用户输入数据,实现无账号登录。那么为什么呢?

通过咱们打印出来的SQL,我们来看一下:

select * from t_user WHERE username="'" or 1=1 or "'" and password="123456"

 看上面的解释,明白了嘛? 还不明白 ?那就再看几遍。还不明白?那就留言吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值