网盾网络安全培训学校育,只培训技术精英
全国免费咨询电话: 15827351614
Web安全防范知识基础讲解

SQL注入攻击

#!/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

xss攻击

#!/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)

csrf攻击

#!/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安全以及安全方面有什么好的方法或者看法,欢迎留言讨论!