0%

web安全基础

SQL注入漏洞

在设计程序时,忽略了对输入字符串中夹带的SQL指令的检查,被数据库误认为是正常的SQL指令而运行,从而使数据库受到攻击,可能导致数据被窃取、更改、删除,以及进一步导致网站被嵌入恶意代码、被植入后门程序等危害。SQL注入攻击通过构造巧妙的SQL语句,同网页提交的内容结合起来进行注入攻击。比较常用的手段有使用注释符号、恒等式(如1=1)、使用union语句进行联合查询、使用insert或update语句插入或修改数据等,此外还可以利用一些内置函数辅助攻击。被广泛用于非法获取网站控制权,是发生在应用程序的数据库层上的安全漏洞。

  • SQL注入的位置包括:
    • 表单提交,主要是POST请求,也包括GET请求;
    • URL参数提交,主要为GET请求参数;
    • Cookie参数提交;
    • HTTP请求头部的一些可修改的值,比如Referer、User_Agent等;
    • 一些边缘的输入点,比如.mp3文件的一些文件信息等。
  • 防范措施:
    • 所有的查询语句都使用数据库提供的参数化查询接口
    • 对进入数据库的特殊字符(’”<>&*;等)进行转义处理,或编码转换
    • 确认每种数据的类型
    • 数据长度应该严格规定
    • 网站每个数据层的编码统一,建议全部使用UTF-8编码,上下层编码不一致有可能导致一些过滤模型被绕过
    • 严格限制网站用户的数据库的操作权限
    • 避免网站显示SQL错误信息,比如类型错误、字段不匹配等

XSS漏洞

跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

XSS漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以XSS漏洞关键就是寻找参数未过滤的输出函数。常见的输出函数有: echo、printf、print、print_r、sprintf、die、var-dump、var_export.

  • 分类:

    • 反射型XSS(非持久化):若输出函数并未对用户输入进行任何过滤,则当输入javascript代码时就会被执行。如果输入攻击性语句,如document.cookie等就会造成用户的cookie信息、用户浏览器信息等泄露。
    • 存储型XSS(持久化):通过未过滤的输入点将恶意脚本上传写入数据库,当有用户访问时就会读取恶意脚本,然后在本地浏览器加载执行。一次提交之后,每当有用户访问这个页面都会受到XSS攻击。
    • DOM型XSS:基于文档模型造成的XSS攻击
  • 防范措施:

    • PHP直接输出html的,可以采用以下的方法进行过滤:

      • htmlspecialchars函数
      • htmlentities函数
      • HTMLPurifier.auto.php插件
      • RemoveXss函数
    • PHP输出到JS代码中,或者开发Json API的,则需要前端在JS中进行过滤:

      • 尽量使用innerText(IE)和textContent(Firefox),也就是jQuery的text()来输出文本内容
      • 必须要用innerHTML等等函数,则需要做类似php的htmlspecialchars的过滤
    • 其它的通用的补充性防御手段

      • 在输出html时,加上Content Security Policy的Http Header
        (作用:可以防止页面被XSS攻击时,嵌入第三方的脚本文件等)
        (缺陷:IE或低版本的浏览器可能不支持)
      • 在设置Cookie时,加上HttpOnly参数
        (作用:可以防止页面被XSS攻击时,Cookie信息被盗取,可兼容至IE6)
        (缺陷:网站本身的JS代码也无法操作Cookie,而且作用有限,只能保证Cookie的安全)
      • 在开发API时,检验请求的Referer参数
        (作用:可以在一定程度上防止CSRF攻击)
        (缺陷:IE或低版本的浏览器中,Referer参数可以被伪造)

CSRF攻击

CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。即攻击者盗用了你的身份,在你不知情的情况下,以你的名义发送恶意请求。

  • 攻击过程:

    1. 用户通过浏览器正常登录某网站,在通过验证后,网站产生Cookie信息并返回给浏览器
    2. 用户未退出该网站之前,在同一浏览器中,打开了具有攻击性的链接
    3. 该链接让浏览器发送Get请求,由于用户已经登录,因此它将携带正确的cookie并以其权限发送请求,从而导致来自黑客请求恶意代码被执行
  • 防范措施:

    • 添加csrf_token
    • 验证Refere(js无权动Referer)
    • 加验证码

SSRF

服务器端请求伪造