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"
看上面的解释,明白了嘛? 还不明白 ?那就再看几遍。还不明白?那就留言吧。