web常见安全及检测,修复(密码管理,代码配置,sql注入,xss,提权,上传漏洞,开源组件等)

-- web系统的常见安全测试项及检测,验证,修复方案
【官网】:

应用场景

怎么判断一个web项目是否存在常见的信息安全问题或者潜在漏洞 1)系统安全(是否可能被sql注入,是否可能被提权,是否可能有跨站脚本攻击,是否容易被ddos攻击,是否缺少鉴权). 2) 业务安全. 3) 运维安全.

基础资源

实际运营场景

使用须知

请结合实际情况,实际情况可能得从人员管理,权限管理,服务器管理,信息管理规范等各方面入手

配置步骤

A)系统安全.

A1)跨站脚本攻击(xss,全称:Cross-Site Scripting).

<测试> 向可编辑内容的地方输入以下内容并保存:<script> alert(1)</ script>

<验证>看查看保存的内容时是否能运行alert弹窗。如果能则确认了一个xss漏洞。

<修复>对可能输入script的地方进行编码,转义等处理后保存。


A2)sql注入.

<测试>输入 右侧内容(1=1  后面可以自由发挥sql)  观看表现:   ‘ or 1=1 --    或者  ‘ or  1=1 #

<验证>是否造成sql错误或者未知的sql执行结果

<修复>使用参数化处理或者类似EF这种ORM框架。


A3)注册,添加,修改,重置密码的地方需要确保复杂度。

<测试>对123456,admin,password,pwd等明文,hash等进行密码比对,验证是否有很多弱密码。

<验证>是否猜到密码,并进行正常登录

<修复>增加强制校验密码复杂度,不达标的不予通过,定期提醒更换密码等。

       1)至少16个字符,至少包含特殊字符,数字,大小写字母等几种类型

        2)定期更换。

        3)避免包含有意义的短语,单词等。


A4)上传文件时的漏洞.

<测试>提交意外的文件类型,意外大小的文件, 提交一个恶意文件但传输中途修改包内容.

      尝试用Burp Suite抓包,通过修改包内的Content-Type值进行上传,将application/octet-stream修改为image/jpeg。
       上传成功,右击图片,选择复制图像地址,图像地址就是恶意文件的地址

<验证>是否能提交成功.

<修复>

        1)增加对上传文件的大小,类型的校验:

   在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。

        2)增加对上传目录的磁盘目录权限的管理(不允许执行,不允许创建目录)

        参考: http://config.net.cn/server/serversecurity/c8b5e2d4-8cfc-4fee-94a8-a60335bea670-p1.html

        3)将IIS,nginx升级到最新。

        4)单独设置文件服务器的域名。

          使得恶意文件的运行遇到跨域问题而部分失效。

        5)使用随机数改写文件名和文件路径.

          在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击

 

A5)js,jquery等第三方库的老版本因漏洞而需要更新到更新版本。

<测试>查看各库的版本,官网的安全漏洞通知。

   jQuery 1.x,2.x,bootstrap 3.x和Moment.js已达到使用寿命(EOL),这意味着它们将来将不会收到安全更新.

<验证>检查应用版本情况.

<修复>更新到最新,跟进官网的推荐方案。


A6)Cookie的安全管理.

<测试>cookie在浏览器抓包时的表现.

<验证>

<修复>设置httpOnly(只能传输,无法通过js访问)

           确保加密,有时效性。

           确保进入https的时候才产生cookie。


A8)安全凭据通过url形式传递。

<测试> 查看url的相关参数含义,分析。

<验证> 容易被恶意存储,在异地,或其它时间发起请求(重放).

<修复> 向页面输出下面这段,会自动进行跳转

 <form id=”form_redirect”  action=”要跳转的url”  method=”post”>

     <input type=”hidden” name=”token” value=”token的值”>

<input type=”hidden” name=”redirectUrl” value=”redirect的值”>

</form>

  <script type="text/javascript">

     document.forms["form_redirect"].submit();

  </script>

A9)免登录,匿名访问的api或action问题.

检查系统中[AllowAnonymous]特性是否滥用,避免新手程序员因为复制粘贴导致的权限错误声明。


A10)http明文发送密码等信息。

  1)对密码之类的要么js进行md5.

  2)将密码进行rsa公钥加密之后再发送到服务器。

A11)数据库连接密码,第三方api或sdk的密钥等不能放到已经被git或svn管理的代码或配置文件中。

     1)建议搞一个网络配置中心,用时拿到。并且区分开发环境和生产环境。

     2)放到用户私密信息中。

     

B)业务安全.

B1)敏感信息进行脱敏和加工处理.

  1)类似客户手机号,客户邮箱等联系方式,可以在公开报表或给不直接相关人看时替换中间4位为*.

  2)类似住址之类的隐私信息在非必要时不展示。

  3) 类似工资之类的数据,避免展示出来。

  4)如果从生产环境拿数据库到开发环境部署之前,需要先脱敏。

  5)对于服务器端的敏感文件,首先不要保存在站点目录下,其次不要使用简单有规律的文件名,应该使用加盐hash之后的值作为文件名。


B2)未采用事务保证业务完整性.

<测试>制造部分db操作失败,看是否有确保完整性.

<验证>db数据检查

<修复>适当采用事务,在性能和一致性之间寻找平衡。

    [注]对于同时包含db事务和api的,可以事务先执行但不提交,等api执行成功之后再提交,否则回滚。


B3)角色权限规划或应用不合理导致部分角色可以提权.

<测试>检测低权限用户是否能创建,管理其它用户。

<验证>结合实际,看看提权操作是否合理.

<修复>梳理并完善角色权限用户三者关系,从更高的角度看问题.

B4)确保一个用户只有一个会话(一个账号同时只能在一个地方登录).

<测试>同一时间,在两个浏览器上登录同一个账号.

<验证>是否可以正常使用.

<修复>增加会话凭据校验,每次登录都生成一个,页面刷新时都检查是否和登录生成的会话凭据一致,不一致则退出。


B5)发布的客户端,移动端app之类的产品没有混淆保护。

 1)未混淆,加壳保护的产品将很容易变成别人的产品了,因为别人拿过去直接二次开发。


C)运维安全.

C1)公司第三方服务(支付,社交分享,第三方统计等)的账号申请规范.

  1)必须通过公司的企业邮箱去申请相关的第三方服务账号。

  2)绑定的手机号必须是公司核心负责人的手机号。

  3)认证的身份信息必须是公司核心负责人的身份信息,防止员工离职之后的一系列问题。

  4)不同服务的密码必须为独立的(禁止共享一个密码)强密码(包含数字,大小写字母,特殊字符),长度至少16位,且不含弱密码。

C2)员工工作相关的账号,密码/密钥, url通过keepass之类的工具管理保存。

  1)方便员工离职时的交接.

  2)方便管理众多的,不同的站点的账号和复杂密码,避免因为追求简单好记而设置弱密码或共享密码的问题。

  3)方便通过一个管理密码管理众多的应用服务的账号,密码。

   keepass官网: https://keepass.info/


C3)api没有加速率和访问配额限制,可能导致服务被搞崩溃。


1)增加用户的访问速率,单位时间的访问配额。(类似耗时的,短信/邮件,付费服务等)


C4)针对不同的微服务,业务模块专门提供独立的数据库访问连接,其中还可以拆分为针对部分表的读写权限.

  1)避免不熟悉的开发人员操作不想关的数据表,实现越权处理。最后导致风险不可控。


C5)测试/探针诊断工具被公布到了公网,导致被恶意查看大量系统的相关信息。

  删除测试页面以及无用文件,例如test.cgi,phpinfo.php,info.pho, .svn/entries等


C6)没有操作日志,无法审计行为。

  必要的操作日志可以在后期查看,回顾很多问题.






常见问题

快速入门

参考资料