常见web攻击及防范

sql注入攻击
sql注入的危害
非法读取、篡改、删除数据库中数据
盗取用户的各类敏感信息,获取利益
通过修改数据库来修改网页上的内容
注入木马等

下面的例子告诉你,sql实现注入的原理

def post(self,request):
    user_name = request.POST.get("username", "")
    pass_word = request.POST.get("password", "")
    
    import pyMySQL
    conn = pyMySQL.connect(
        'NAME': "mxonline",
        'USER':'root',
        'PASSWORD':'',
        'HOST':'127.0.0.1'
    )
    cursor = conn.cursor()
    sql_select = "select * from users where username='{0}' and password='{1}'".format(username,password)
    result = cursor.execute(sql_select)
    
    for row in cursor.fetchall():  # 检查数据库是否有该用户
        # 查询到用户
        pass
    print("没有查询到用户")
    

前端输入:
用户名:' or 1=1#
密码随便输入:1234
前端没有做任何处理就会原原本本的传给后端,
后端收到用户名和密码,没有做任何处理,传进sql后就会是下面这样子:
sql_select = "select * from users
where username=\'\' or 1=1#\' and password=\'1234'\"

username='' or 1=1 用户名=空 或者 1=1一定会成立,sql_select语句执行一定会,然后绕过,后面的因为被注释了不会执行
该sql一定会执行通过,然后登录到系统

预防的措施很简单,
1.前端对输入的用户名和密码做有效检查,比如不能出现单引号等特殊符号
2.后端同样对前端传过来的数据做有效性识别,对无效的数据直接抛弃

xss跨站脚本攻击 cross site scripting

xss攻击流程

上面这个流程是常见的一个客户端向服务器发起请求url,服务器响应数据给客户端的过程
下面黑客可以通过url的key=value
(key=)

场景描述:
黑客控制了受害者(受害者成为了肉鸡),将url伪装成上面括号的样子,发送到服务器,服务器执行脚本后返回cookie给受害者,受害者把cookie中的sessionid发送给黑客,黑客拿到用户的sessionid就可以伪装成用户直接请求服务器中的数据,比如黑客已经窃取了后台管理员账号的cookie,那么就可以进入用户中心,拿到用户中心的所有用户数据。

xss预防措施:
1.代码里对用户输入的地方和变量都需要仔细检查长度和对" < "," > "," ; "," ' "等字符做过滤或者转义,把他encode掉。
2.避免直接在cookie中泄露用户隐私,例如email、密码等,通过使用cookie和系统ip绑定来降低cookie泄露后的危险
3.尽量采用post而非get请求表单

csrf 跨站点请求伪造 cross-site request forgery

csrf危害
以你的名义发送邮件
盗取你的账号
购买商品
虚拟货币转账

csrf攻击原理

场景:
在浏览器打开一个信任的网站,(session有效)然后在该浏览器新打开一个标签页(危险网站)。

<img src=http://www.mybank.com/Transfer/toBankId=11*&money=1000>

既是使用post请求,也一样会被攻击,以下面这段代码为例(实际就是哦攻击网站的源码):
自定义一个form,在用户浏览器加载完html后,自动执行该段代码发起post请求,实现csrf攻击

<!DOCTYPE html>
<html>
<head>
  <script type="text/javascript">
    function steal()
    {
        iframe = document.frames["steal"];
        iframe.document.Submit("transfer");
    }
  </script>
</head>
<body onl oad="steal()">
  <iframe name="steal" display="none">
    <form method="POST" name="transfer" action="http://www.myBank.com/Transfer">
      <input type="hidden" name="toBankId" value="622909123456">
      <input type="hidden" name="money" value="1000">
    </form>
  </iframe>
</body>
</html>>

预防措施:
django在前端页面表单提交里面,每次表单提交都一定要带上{% csrf_token %},才能完成表单提交,以此来防护csrf攻击,攻击网站是无法生成 csrf_token的,即使生成了,他也无法完成后台验证

上一篇:web安全


下一篇:Web_CSRF_ex