博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
9Python全站之路系列之MySQL SL注入
阅读量:5921 次
发布时间:2019-06-19

本文共 2817 字,大约阅读时间需要 9 分钟。

Python全栈之路系列之MySQL SQL注入


SQL注入是一种代码注入技术,过去常常用于攻击数据驱动性的应用,比如将恶意的SQL代码注入到特定字段用于实施拖库攻击等。

SQL注入的成功必须借助应用程序的安全漏洞,例如用户输入没有经过正确地过滤(针对某些特定字符串)或者没有特别强调类型的时候,都容易造成异常地执行SQL语句。

SQL注入是网站渗透中最常用的攻击技术,但是其实SQL注入可以用来攻击所有的SQL数据库。


SQL注入的实现

创建SQLdb数据库

CREATE DATABASE SQLdb;

创建user_info

1
2
3
4
5
6
CREATE TABLE `user_info` (
  
`
id
int
(
11
) NOT NULL AUTO_INCREMENT,
  
`username` varchar(
32
) DEFAULT NULL,
  
`password` varchar(
32
) DEFAULT NULL,
  
PRIMARY KEY (`
id
`)
) ENGINE
=
InnoDB DEFAULT CHARSET
=
utf8;

插入一条用户数据

测试的用户名是ansheng,密码as

1
insert into user_info(username,password) values(
"ansheng"
,
"as"
);

Python代码

app.py文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import 
tornado.ioloop
import 
tornado.web
import 
pymysql
 
class 
LoginHandler(tornado.web.RequestHandler):
    
def 
get(
self
*
args, 
*
*
kwargs):
        
self
.render(
'login.html'
)
    
def 
post(
self
*
args, 
*
*
kwargs):
        
username 
= 
self
.get_argument(
'username'
None
)
        
pwd 
= 
self
.get_argument(
'pwd'
None
)
        
conn 
= 
pymysql.connect(host
=
'127.0.0.1'
, port
=
3306
, user
=
'root'
, passwd
=
'as'
, db
=
'sqldb'
)
        
cursor 
= 
conn.cursor()
        
temp 
= 
"select username from user_info where username='%s' and password = '%s'" 
%
(username, pwd,)
        
effect_row 
= 
cursor.execute(temp)
        
result 
= 
cursor.fetchone()
        
conn.commit()
        
cursor.close()
        
conn.close()
        
if 
result:
            
self
.write(
'登录成功'
)
        
else
:
            
self
.write(
'登录失败'
)
             
application 
= 
tornado.web.Application([
    
(r
"/login"
, LoginHandler),
])
 
 
if 
__name__ 
=
= 
"__main__"
:
    
application.listen(
8888
)
    
tornado.ioloop.IOLoop.instance().start()

HTML代码

login.htmlapp.py文件在同级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html lang
=
"en"
>
<head>
    
<meta charset
=
"UTF-8"
>
    
<title>Title<
/
title>
<
/
head>
<body>
<form action
=
"/login" 
method
=
"post"
>
    
<
input 
type
=
"text" 
name
=
"username" 
placeholder
=
"用户名" 
/
>
    
<
input 
type
=
"text" 
name
=
"pwd" 
placeholder
=
"密码" 
/
>
    
<
input 
type
=
"submit" 
/
>
<
/
form>
<
/
body>
<
/
html>

演示效果

打开浏览器,输入地址http://127.0.0.1:8888/login

填写内容如下:

用户名:asas ' or 1 = 1-- asd

密码:随便填写一串字母

如图:

sql-injection-01

当点击提交的时候是否会跳转到登陆成功页面?如果你的代码和我一样,那么就会跳转到登陆成页面

为什么出现这种问题?

出现这个问题的主要原因就是因为我们使用了字符串拼接的方式来进行SQL指令的拼接。

SQL指令拼接代码

1
temp 
= 
"select username from user_info where username='%s' and password = '%s'" 
%
(username, pwd,)

这是一个正常的SQL拼接出来的结果

1
select username 
from 
user_info where username
=
'ansheng' 
and 
password 
= 
'as'

这是一个非正常的SQL拼接出来的结果

select username from user_info where username='asas' or 1 = 1  -- asd' and password = 's'

聪明的你是否已经看到其中的玄机了呢?--

如何防止?

通过Pythonpymysql模块来进行SQL的执行,在pymysql模块内部会自动把”'“(单引号做一个特殊的处理,来预防上述的错误

1
2
3
......
effect_row 
= 
cursor.execute(
"select username from user_info where username='%s' and password = '%s'"
, (username, pwd))
......

 

本文转自 Edenwy  51CTO博客,原文链接:http://blog.51cto.com/edeny/1925919,如需转载请自行联系原作者
你可能感兴趣的文章
6425C-Lab5 管理计算机帐户
查看>>
一个通用的档案信息系统的设计与实现
查看>>
《VMware vSphere 6.5企业运维实战》已经出版
查看>>
微软MCITP系列课程(十九)搭建PKI證書服務器
查看>>
SEOer未来之路到底在哪里?
查看>>
PaaS平台走开放、开源之路
查看>>
搞大流量很难,但搞精准流量很容易
查看>>
EBS维护常识
查看>>
vs 附加到进程
查看>>
《Microsoft SQL Server 2008 Analysis Services Step by Step》学习笔记六:创建高级度量和计算(下)...
查看>>
【原】windows 7 安装 PetShop 4.0 问题小结
查看>>
0 bytes after compression出现的情况
查看>>
60佳精美的绿色风格网页设计欣赏(上篇)
查看>>
如何使用本地账户"完整"安装 SharePoint Server
查看>>
十分钟掌握diff&patch用法(转)
查看>>
怎么在ASP.NET WebForm中使用Razor视图引擎(转载)
查看>>
图片自动随div大小改变
查看>>
(译)在Objective-c里面使用property教程
查看>>
Android --- 图片的特效处理
查看>>
PL SQL 9 安装 并连接 64位 Oracle 11G
查看>>