#!/usr/bin/env Python
# -*- coding: utf-8 -*-
from flask import Flask,request
import pyMySQL
App = Flask(__name__)
"""
SQL语句注入
在编写SQL语句时,如果直接将用户传入的数据作为参数使用字符串拼接的方式插入到SQL查询中,那么攻击者可以通过注入其他语句来执行攻击操作,这些攻击操作包括可以通过SQL语句做的任何事:获取敏感数据、修改数据、删除数据库表……
"""
app.route('/')
def index():
"""
示例
假设我们的程序是一个学生信息查询程序,其中的某个视图函数接收用户输入的密码,返回根据密码查询对应的数据。我们的数据库由一个db对象表示,SQL语句通过 execute()方法执行
url=/?pwd='or 1=1-- ==变成==> sql = select * from students where pwd='' or 1=1--;'
这时会把 students表中的所有记录全部査询并返回,也就意味着所有的记录都被攻击者窃取了。更可怕的是,如果攻击者将 pwd参数的值设为"';drop table users; --"那么查询语句就会变成
sql = select * from students where pwd=''; drop table users; --;'
执行这个语句会把 students表中的所有记录全部删除掉。
ps
; ==>用来结束一行语句
-- ==>用来注释后面的语句
防范方法:
1、orm可以一定程度上避免sql注入问题
2、验证输入类型==》一个视图函数直接收整型id查询,可以在url规则中限制url变量为整型
3、参数化查询,在构建sql语句时避免使用拼接字符串或者字符串格式化方式来构建sql,使用参数化查询方法
例:sqlite3库==》db.execute('select * from students where pwd=?',pwd)
4、转义特殊字符,例如引号,分号,横线 ==》 使用参数化查询时,各种接口库会为我们做转义工作
"""
conn = pymysql.connect(**base_data_text)
cursor = conn.cursor()
pwd = request.args.get('pwd')
cur = cursor.execute("select * from students where pwd='%s';" % pwd)
ret = cur.fetchall()
return ret
# 集体sql注入相关文档: https://www.owasp.org/index.php/SQL_Injection
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask, request
"""
xss攻击【跨站脚本】
XSS是注入攻击的一种,攻击者通过将代码注入被攻击者的网站中,用户一且访问网页便会执行被注入的恶意脚本。XSS攻击主要分为反射型XSS攻击( Reflected XSS Attack)和存储型XSS攻击( Stored XSSAttack)
"""
app = Flask(__name__)
@app.route('/he')
def index():
"""
示例
1、反射型XSS又称为非持久型XSS
反射型XSS又称为非持久型XSS(Non- Persistent XSS)。当某个站点存在XSS漏洞时,这种攻击会通过URL注入攻击脚本,只有当用户访问这个URL时才会执行攻击脚本
以下视图接收用户通过査询字符串传入的数据,未做任何处理就把它直接插入到返回的响应主体中,返回给客户端。如果某个用户输入了一段 JAVAscript代码作为查询参数name的值
请求
http://127.0.0.1:5000/he?name=<script>alert('lalalal);</script>
响应
<h1>hello <script>alert('lalalal);</script></h1>
前端展示
会谈出一个窗口内容为lalalal
产生的影响:
能支持js弹窗,那么就可用js代码来做任何事情,例如发起请求,重定向,发布广告【ps:html css也可以影响页面正常的输出,篡改页面样式,插入图片等】
2、存储型XSS也被称为持久型XSS( persistent XSS)
存储型XSS也被称为持久型XSS( persistent XSS),这种类型的XSS攻击更常见,危害也更大。它和反射型XSS类似,不过会把攻击代码储存到数据库中,任何用户访问包含攻击代码的页面都会被殃及。
比如,某个网站通过表单接收用户的留言,如果服务器接收数据后未经处理就存储到数据库中,那么用户可以在留言中插入任意JS代码
提交
加入重定向代码
<script>window.location.href="http://www.baidu.com";</script>
响应
任意用户访问留言板,都会执行js脚本
解决办法
1》对html进行转义,确保用户输入的内容仅做文本展示
2》验证用户输入
"""
name = request.args.get('name')
return "<h1>hello {}</h1>".format(name)
if __name__ == '__main__':
app.run()
# xss攻击相关 https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask, request,abort
"""
CSRF攻击【跨转请求伪造】
原理:
某用户登录了A网站,认证信息保存在cookie中。当用户访问攻击者创建的B网站时,攻击者通过在B网站发送个伪造的请求提交到A网站服务器上,
让A网站服务器误以为请求来自于自己的网站,于是执行相应的操作,该用户的信息便遭到了篡改。总结起来就是,攻击者利用用户在浏览器中保存
的认证信息,向对应的站点发送伪造请求。
"""
app = Flask(__name__)
@app.route('/he/delete')
def delete_index():
"""
示例:
假设我们网站是一个社交网站(127.0.0.1),简称网站A:攻击者的网站可以是任意类型的网站,简称网站B。在我们的网站中,删除账户的操作通过GET请求执行,由使用下面的 delete_index视图处理
当用户登录后,只要访问127.0.0.1/he/delete就会删除账户。那么在攻击者的网站上,只需要创建一个显示图片的img标签,其中的sc属性加入删除账户的URL
<img src="http://127.0.0.1/he/delete">
当用户访问B网站时,浏览器在解析网页时会自动向img标签的src属性中的地址发起请求。此时你在A网站的登录信息保存在 cookie中,因此,仅仅是访问B网站的页面就会让你的账户被删除掉。
虽然很少有网站使用get请求来处理包含数据更改的敏感操作,但是即使使用post请求,也可以内嵌隐藏表单使用js发起攻击
防范措施
1》正确使用http方法
2》csrf令牌校验
flask-seasurf:https://github.com/maxcountryman/flask-seasurf
flask-wtf:https://github.com/lepture/flask-wtf
"""
if not current_user.authenticated:
abort(401)
current_user.delete()
return 'Deleted'
if __name__ == '__main__':
app.run()
# csrf攻击相关 https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)
TOP25种攻击方式
https://cwe.mitre.org/top25/
漏洞检查工具webscarab
https://github.com/OWASP/OWASP-WebScarab
如果大家对web安全以及安全方面有什么好的方法或者看法,欢迎留言讨论!