一、sql注入简介
1.1 sql注入原理
服务器端未严格匹配过滤客户端传来的数据,导致服务器端的sql语句被恶意修改而执行,导致了信息泄露。
1.2 sql注入类型
从注入参数来分:数值型注入、字符型注入、搜索注入
从注入方法来分:布尔型盲注、时间延迟盲注、报错盲注、二次注入、宽字节注入、联合注入、堆叠查询、内联查询注入
从提交方式来分:GET注入、POST注入、COOKIE注入、http头部注入
从数据库分:mysql注入、mssql注入、oracle注入等
1.3 sql注入防御
防御思路:
1、严格匹配 传送来的数据类型和数据长度
2、对一些特殊字符进行转义编码
3、对sql语句进行预编译和绑定变量
4、对网站的数据库用户即权限进行限制,不要使用root用户
5、把错误信息都屏蔽掉
1.4 了解redis授权
redis授权是指redis在默认情况下是没有设置密码的,他会绑定0.0.0.0:6379 ,如果没有采取策略,比如添加防火墙规则,避免非信任的IP访问等,这样会将redis暴露在公网上,如果没有设置密码验证,会导致任意用户在可以访问目标服务器的情况下未授权访问redis以及读取redis数据
1.5 带外注入原理
带外注入是一种攻击技术,利用dns解析记录获取数据,我们可以通过构造特殊DNS查询请求,将需要获取的数据隐匿在请求中,当DNS服务器处理请时返回数据给攻击者,窃取数据.
1.6 了解二次注入
二次注入就是攻击者构造的恶意语句存储在数据库中,然后恶意数据被读取并进入到sql查询语句中所导致的sql注入
在第一次进行数据库输入据插入的时候,仅仅对其中的特殊字符进行转义,再写入数据库的时候还保留了原来的数据,但是数据本身包含而已内容
在将数据保存到数据中后,开发者认为数据是安全的,在下一次需要进行查询的时候,直接从数据库中取出了恶意数据,没有进行进一步的处理和校验,导致了信息泄露。
1.7 宽字节注入原理
mysql数据库在使用宽字节(GBK)编码时,会认为俩个字符是一个汉字(前一个ascii码要大于128 (比如%df)才到汉字的范围),而且当我们输入单引号时,mysql会调用转义函数,将单引号变为\' ,其中\的十六进制是%5c,mysql的GBK编码会认为%df%5c是一个宽字节,也就是一个汉字運,从而使单引号闭合(逃逸)。进行注入攻击
1.8 sqlmap的常用选项
sqlmap是一个工具,专门用来测试sql注入漏洞的,很好用
-u : 指定目标url进行测试,一般是get请求
-r : 从文本文件中读取Http请求作为Sql注入探测的目标 一般是POST方式
-purge : 清除历史缓存
-a : 获取所有信息、数据
--current-user :获取当前用户名
--current-db : 获取当前数据库
--hostname : 获取DBMS服务器的主机名
--is-dba :探测DBMS当前用户是否DBA(数据库管理员)
--users 枚举出所有数据库
--tables 枚举数据库中的所有表
--columns 枚举出表中所有字段
-D 指定数据库 -T 指定数据表 -C 指定字段
二、XSS漏洞
原理:就是程序对用户输入没有做合理的过滤限制,导致攻击者构造的字符输出到前端时被浏览器当作有效代码解析执行从而产生的危害
XSS分类
反射型XSS; 存储型XSS; DOM型XSS
XSS危害
1)流浪劫持 2)获取用户COOKIE信息,盗取账号 3)篡改、删除页面信息(钓鱼)
4)配合CSRF攻击,实施进一步攻击
防范XSS攻击
1)过滤输入的数据,包括单引号、双引号、<> 等非法字符
2)对输出到页面的数据进行相应的编码转换
3)适当使用HTTP only 属性保护终端cookie
XSS检测流程
1)找到输入点(查询接口、留言板等)
2)输入一组特殊字符+唯一标识符,查看返回的源码是否做出了相应的处理
3)通过搜索定位到唯一字符(构造闭合)
4)构造脚本代码(绕过)查看是否执行成功,如果成功,存在XSS漏洞
怎么修复XSS漏洞
xss攻击两大要素:1、攻击者提交恶意代码 2、浏览器执行恶意代码。
所以需要严格控制输入和输出
输入点控制:不要在允许位置插入不可信数据
在向HTMLURL属性插入不可信数据前,进行URL编码
在向HTML元素内容、属性属性值插入不可信数据前对HTML解码
在向HTML Javascript Data Values 插入不可信数据前,进入Javascript解码
输出点控制:
前端渲染把代码和数据分割开
拼接HTML时对其进行转义,需要采用合适的转义库,对HTML模块各处插入点进行充分的转义,对于HTML转义通常只有一个规则,就是把 & <> " ' / 这几个字符转移掉,确实能起到一定的XSS防护作用,但并不完善。
其他除此之外,还有做HTTP Only 对cookie劫持限制
XSS钓鱼
XSS钓鱼是存在的,在实际的攻击场景中,xss钓鱼的场景也是非常多的,可以内嵌一些钓鱼界面或者钓鱼链接。
存储型XSS的页面如何利用basic认证实现钓鱼1)已知存在一个存在存储型XSS漏洞的页面A和攻击者后台B
2)攻击这个可以利用该漏洞在A页面中内嵌一个请求
3)这个请求是向远端的服务器发起请求
4)攻击者后台返回一个要求能进行Bacis认证的头部,在用户界面上就会弹出一个要进行身份认证的提示框:
5)用户一旦输入了账号密码,这个账号喵喵就会发送到攻击者后台B
三、CSRF漏洞
CSRF原理
CSRF攻击利用网站对于用户网页浏览器的信任,劫持用户当前已登录的WEB应用程序,去执行并非用户本意的操作
如何确定一个网站是否存在CSRF漏洞?就是判断对其关键信息(比如密码等敏感信息的操作(增删改)是否容易被伪造)
关键信息是否容易被伪造
对目标网站增删改的地方进行标记,观察逻辑(抓包),判断请求是否可以被伪造
确认凭证的有效期
虽然退出了浏览器,但cookie没有及时过期,导致CSRF攻击变简单,因为csrf有一个条件是登录状态。
CSRF有什么局限性
1、目标站点不能有检查referer的操作,或许被攻击者的浏览器允许referer欺骗
2、攻击者必须在目标站点找到一个表单的提交入口,或许有类似的 URL(例如用来转钱,修改受害者邮箱或者密码)
3、攻击者必须猜中所有的表单或者URL参数中的正确的值,如果有密码验证值或者ID,攻击者没有猜对,攻击很可能不成立
4、攻击者必须诱使受害者访问有恶意代码的页面,并且此时受害者已经登录到目标站点
如何防御CSRF
1、避免在URL中铭文显示特定操作的参数内容
2、使用同源策略token,检查客户端是否有令牌token其有效性
3、检查referer 头部,拒绝来自非本站的直接URL请求
4、使用验证码
5、使用自定义的头部或参数:在每个请求中加入自定义的头部或参数,并在服务器端进行验证
6、使用SameSite Cookie属性:将Cookie的SameSite属性设置为strict或者Lax可以限制跨站点的Cookie传递,防止某些类型的CSRF攻击。
CSRF和XSS的区别
1、XSS攻击,恶意代码存储在站点之中,而CSRF攻击中,恶意代码存储在受害者访问的第三方网页中
2、XSS攻击遵循双向攻击模式,允许攻击者执行恶意脚本,访问响应,并将后续敏感数据发送到攻击者选择的目的地; CSRF是一种单项攻击机制,这意味着攻击者只能发起HTTP请求,但不能检索一发起请求的响应
3、在XSS攻击中,只要用户登录,就可以存储和交付有效载荷,而CSRF攻击则需要经过身份验证的用户处于活动会话中
4、XSS攻击提供执行恶意脚本来执行攻击者所选择的任何活动,从而豁达了攻击范围, 相反CSRF仅限于用户可以指定的操作,例如点击恶意链接或访问黑客的网站
四、SSRF
SSRF是一种有攻击者构造形成由服务器端发起请求的一个安全漏洞,一般情况下,SSRF攻击的目标从外网无法访问的内容系统,加载指定地址的图片,下载等等
SSRF原理
服务端提供了从其他服务器应用获取数据的功能,但是没有对前端传进来的目标地址做严格的过滤限制,导致攻击者可以传入任意地址,来让服务器对其发起请求并返回该目标地址请求的数据,攻击者以存在SSRF的服务器为跳板对其他的目标服务器进行攻击
简单来说就是,服务器对其他服务器资源进行请求,没有做合法验证
SSRF防御
1、过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先体验返回的信息是否符合标准
2、统一错误信息,避免用户可以根据错误信息来判断远程服务器的端口状态
3、限制请求的端口为http常用的端口,比如80, 443、8080,8090
4、黑名单内网IP,避免应用被用来获取内网数据,攻击内网
5、禁用不需要的协议,仅仅允许http和https请求,可以防止类似于file:// 等引起的问题
五、文件上传漏洞
文件上传漏洞原理
在文件上传的功能处,若服务器脚本语言对上传的文件做合理的过滤和限制,导致恶意用户上传恶意的脚本文件时,获取执行服务器的能力
文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马、病毒,恶意脚本或者webshell等。"文件上传"本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
文件上传的防护
1、验证文件类型,采用白名单或者黑名单的方式过滤
2、 对用户上传的文件重命名
3、检测文件的内容,如果里面出现一些敏感字符,进行过滤
4、安全配置、确保上传文件目录没有执行权限
什么是webshell
webshell就是以asp、php、jsp或者cgi等网页形式存在的一种命令执行方式,也可以将其称为一种网页后门。
攻击者在入侵了一个网站后,通常会将这些asp或者php后门文件与网站服务器web目录下正常的网页文件混在一起,然后使用浏览器来访问这些后门,得到一个命令执行环境,以达到控制网站服务器的目的(可以上传下载或者修改文件,操作数据库,执行任意命令等)webshell后门隐藏性高,可以轻松穿越防火墙,访问webshell时不会留下系统日志,指挥在网站的web日志中留下一些数据提交记录