一、口令设计缺陷

1. 弱口令

1.1 漏洞说明

这里包括了强口令,比如p@ssw0rd什么的,虽然元素满足了三元素,但其实还是很容易猜到的,在密码字典中,属于top级别。
也包括空口令,默认口令等。有些系统在设计之初,有些边缘角色是不设置密码的,如test,guest。默认口令尤其出现在硬件设备中,如防火墙,摄像头等,激活之后,没强制要求用户修改密码,尽管密码强度是高的,但是因为是固定的,所以也会存在风险。
还包括系统服务层面的口令,如ssh,ftp,3389,3306,1433,1521,27017等。
另外,可以测试一下万能密码
1:”or “a”=”a
2: ‘)or(‘a’=’a
3:or 1=1—
4:’or 1=1—
5:a’or’ 1=1—
6:”or 1=1—
7:’or’a’=’a
8:”or”=”a’=’a
9:’or’’=’
10:’or’=’or’
……
万能密码其实是代码层面的缺陷,与SQL注入有点类似。

1.2 测试方法

  1. 可手工测试几个常见密码:admin、123456、admin888、1、test、Test123456等。
  2. 万能密码直接在登录时拼接在用户名密码后面。
  3. web应用使用burp suite等工具抓包,发送到intruder模块对用户名密码进行测试。
  4. 系统层面可使用超级弱口令工具扫描。

    1.3 修复方法

  5. 采用强口令,三因素组成,8位以上。

    二、登录功能设计缺陷

    1. 暴力破解

    1.1 漏洞说明

    没有登录次数限制,也没有验证码,可以被第三方如burp suite抓包软件,对数据包进行不断重放,对用户名密码进行不断地尝试,暴力破解用户名密码。

    1.2 测试方法

  6. 先手工输入几个错误的密码,看是否会提示限制次数,或者跳出验证码。

  7. 如果没有,则使用burp suite等工具抓包,发送到intruder模块对用户名密码进行测试。

    1.3 修复方法

  8. 限制登录次数,如5次。

  9. 增加双重认证,或三重认证。

    2. 用户名枚举

    2.1 漏洞说明

    通过输入正确的和错误的用户名,观察不同的提示,如正确的用户提示密码错误,错误的用户名提示用户不存在,则可以枚举网站存在的用户名。
    意义在于,在暴力破解中,如果用户名和密码均不知道,那么爆破次数会更指数级增长,如果用户名是已知的,那么只需要爆破密码,爆破的成本会大大降低。

    2.2 测试方法

  10. 先手工输入几个错误的用户名,查看是否提示用户不存在。

  11. 如果没有,则使用burp suite等工具抓包,发送到intruder模块对用户名进行测试。

    2.3 修复方法

  12. 不管用户名对还是错,均提示用户名或密码错误。

    3. 图形码不更新

    3.1 漏洞说明

    如果带着错误的图形码去请求,而验证码没有更新,只是报验证码错误。那么验证码机制形同虚设,只要请求包中带着正确的验证码即可暴力破解用户名密码。

    3.2 测试方法

  13. 手工输入错误的验证码,查看验证码是否更新。

  14. 如果没更新,则可以用正确的验证码去爆破用户名密码。

    3.3 修复方法

  15. 每次请求,图形码都要重新生成。

    4. 登录绕过

    1. 漏洞说明

    如果网站登录是否成功是根据响应包中的某个参数,比如status,flag等,那么可以将响应包拦截,修改这些参数,让客户端认为是登录成功了。

    1.2 测试方法

  16. 正确成功,拦截请求包,相应包,观察成功登录的标志。

  17. 错误登录,把错误提示的参数改为成功,观察登录状态。

    1.3 修复方法

  18. 修改验证逻辑,是否登录成功,服务器返回一个参数告知客户端或浏览器,但是到此就是最终验证。

三、权限控制设计缺陷

1. 未授权访问

1.1 漏洞说明

一些本应该要授权才能访问的位置,信息,端口等,现在不需要授权就能直接访问和连接,那就是未授权访问。比如路径未授权访问,一些需要登录之后才能访问到的路径,如果未登录,强制访问也能访问到。
还有一些运维相关的后台未授权,比如/actuator,/swagger,/eureka等等。
端口也有未授权访问,或者叫匿名访问,ssh,ftp,数据库,memcached,zookeeper,vnc,rsync等。

1.2 测试方法

  1. 登录之后,复制路径,退出登录,强制访问路径,看能否访问。
  2. 在抓包的时候,把cookie,token等去掉,看响应。
  3. 端口未授权采用扫描器扫描,nmap,超级弱口令等。

    1.3 修复方法

  4. 增加验证机制。

  5. 严格校验用户凭证。
  6. 禁用匿名访问。

    2. 越权

    2.1 漏洞说明

    越权分为垂直越权和平行越权,垂直越权就是低权限越权到高权限,水平越权针对的用户是同等级的,不如普通用户和普通用户,高级用户和高级用户。其实从广义上来说,未授权也是越权,而且时垂直越权的一种。
    如果用户的信息资产和用户的凭证没有关联的话,就会导致A用户可以访问到B用户的资产,造成越权漏洞。比如A用户的信息用id=001,而B用户的信息用id=002,那么可以遍历id参数,查看所有用户的信息。又比如修改密码,通过修改用户id,实现修改他人密码。
    测试的时候其实没必要分垂直越权还是平行越权,因为它们的测试功能点几乎都一样的,根据用户的权限大小所以才产生了垂直和平行越权的分类。

    2.2 测试方法

  7. 登录,重置密码,修改密码时,观察是否有和用户相关的参数,如id=666,user=test01等,修改为其他用户的id。

  8. 查看订单时,修改订单id,是否能看到其他人的订单。
  9. 使用普通用户的token访问管理员的页面,查看是否能访问到。

    2.3 修复方法

  10. 严格校验用户资产和当前登录用户的凭证的关联性。

    四、输入验证设计缺陷

    1. SQL注入

    1.1 漏洞说明

    SQL注入存在于任何和数据库交互,但又没对用户的输入进行过滤的地方。如果用户的输入是一段SQL语句,那么就会被带入数据库执行,造成数据库数据泄露。
    所以必备的两个条件是:参数用户可控,参数带入数据库执行。

    1.2 测试方法

  11. 在输入的地方,比如输入框,url参数等,输入引号触发报错,如果报SQL的语法错误等,基本就是存在漏洞了。

  12. sqlmap是一个自动化工具,可以对请求的参数,请求头header的参数进行测试。

    1.3 修复方法

  13. 预编译绑定变量,使得语法不会改变,但是不能一步到位防注入,因为有些地方是用不了预编译的。

  14. 参数化查询,在接收用户输入的地方,采用参数的方式来给值,而不是SQL语句和用户输入直接拼接。
  15. 编码是遵循安全规范,使用安全的存储过程,使用安全的函数。
  16. 过滤关键词,比如select,order,union等,但是这不是一个很好的方式,因为用户可能不可避免地需要输入这些信息。而且极有可能会被绕过,下面列举一些绕过的技巧。

    1.4 绕过技巧

  17. 编码:针对一些关键词被过滤了,但是过滤一般都是黑名单过滤,把SQL语句编码后,可以逃过过滤。一些编码如urlencode,ASCII,hex,Unicode等。

  18. 空格:如果过滤了空格,可以使用注释/**/,++,(),tap,%20,%0a等逃过。
  19. 逻辑符:and,or,xor,not,可以使用&&,||,!,^等绕过。
  20. 双写:过滤检测到关键词的时候可能直接删除了,那么seselectlect就会被删掉select,剩下还是select。
  21. 大小写:seLEcte。
  22. =号:使用like,效果和=是一样的。
  23. 空字节:在前面加%00会被认为字符串的结果。

    2. XSS漏洞

    2.1 漏洞说明

    跨站脚本攻击xss输入代码注入的一种,注入的是JavaScript代码,由于程序没有对用户的输入进行过滤,导致用户输入的JavaScript代码被网页执行了。xss普通存在于输入框,url,表单这些地方,是的,和SQL注入差不多。
    xss分为三种:反射型,存储型,DOM型。
    反射型xss是一次性的,只能起一次作用,利用url等方式发送给受害者。
    存储型顾名思义就是把用户的输入存储起来的,那么JavaScript的代码也会被存在起来,多存在评论处,留言处,网站HTML结构处。

    2.2 测试方法

  24. 在输入框,参数,标签,url等地方插入,我的渗透测试用例 - 图1等,看是否执行弹窗操作。

    2.3 修复方法

  25. 过滤关键词,比如script,alert,onerror等。但是也是存在被绕过的,只有过滤的关键词足够多来避免。

  26. 过滤特殊符号,比如<>/\’”()=。

3. XXE漏洞

3.1 漏洞说明

XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

3.2 测试方法

  1. 当发现请求包是xml时,可以将请求包修改为如下:

<?xml version=”1.0” encodeing=”utf-8”?>
<!DOCTYPE entidty[
<! ENTITY name SYSTEM “file:///etc/passwd”>
]>

&name;
18

file方法可以修复,这里不仅支持file协议,还是支持HTTP://,ftp://,php://,gopher://,data://等,支持的协议视网站语言而定。

3. 文件包含/读取/删除/下载

3.1 漏洞说明

文件包含包括本地文件包含LFI和远程文件包含RFL。程序需要从本地或者远程引入一些比如图片,文件等,如果用户可以控制这个参数,文件名又没有过滤的话,用户可以包含一些比如/etc/passwd、/www/config.php等敏感文件,造成信息泄露。
不过文件包含漏洞的测试是着重在PHP写的网站上的,PHP中的四个文件包含函数:include,include_once,require,require_once。
远程文件包含是开启了allow_url_include,allow_url_fopen。
文件读取和文件包含的原理都是差不多的,区别在于:文件包含一般是包含网站脚本文件进来解析的,而文件读取什么文件都能读,只是读出文件内容而已,用的函数也不一样,PHP的文件读取函数:fopen,file_get_content,fget,fread等。
这些都可以延申到文件删除,文件下载等漏洞。

3.2 测试方法

  1. 一些加载文件的地方,比如file=/index.php,f=/img/logo.jpg。修改参数,读取/../../../../../../etc/passwd等。
  2. 在自己的服务器起一个HTTP服务,放一些文件让目标去包含。
  3. 可以使用PHP伪协议去读取文件:file://,http://,ftp://,php://,data://,phar://等。

    3.3 修复方法

  4. allow_url_include=off

  5. open_basedir=指定文件访问目录。
  6. 过滤../
  7. 开启魔术引导magic_quotes_qpc=on

    4. 文件上传

    4.1 漏洞说明

    文件上传也可以看作是输入验证缺陷导致的,用户输入的是文件。如果没有对用户输入的文件进行严格校验,会导致非常严重的后果。文件上传作为除了SQL注入,命令执行等重要getshell手段之一,必须格外重视。

    4.2 测试方法

  8. 上传任意后缀的文件,txt,exe,html等。

  9. 如果前端作为文件后缀限制,先上传允许的文件,抓包再修改后缀。

    4.3 修复方法

  10. 对上传的文件随机值重命名,加固定后缀。

  11. 对上传的文件进行旋绕。
  12. 统一上传接口,方便管理。
  13. 对文件名,文件类型,MIME类型进行检测。
  14. 限制文件大小。
  15. 返回包中不能返回上传的文件路径。
  16. 禁用敏感函数。

4.4 绕过技巧(PHP是一门漏洞语言)

  1. 绕过客户端检测:
    1. 抓包绕过前端后缀检测。
    2. 禁用浏览器js。
    3. 删除前端js判断函数或者修改上传文件类型。
  2. 绕过服务端检测
    1. 黑名单绕过
      1. 大小写,双写绕过。
      2. 后缀加空格,加点,加点加空格加点,加::DATA。(只适用于Windows)
      3. 特殊后缀:php2,php3,php4,php5,phtml,asa,cer,cdx,ascx,ashx,asac,jsp,jspx,jspf。
    2. 白名单绕过
      1. 00截断:文件名后缀加个空格,然后把空格的hex改为00,系统遇到00以为是文件读取结束了。
      2. .htaccess解析漏洞:先上传一个.htaccess文件,内容为(AddType aplication/x-httpd-php .jpg),意思是将所有的jpg文件当成是PHP来解析,然后再上传一个带马的jpg。
      3. apache解析漏洞:apache对于不认识的后缀名,就会从右往左递归识别,直到遇到认识的,比如php.aaa就会被识别为php。
      4. .user.ini:适用于服务器使用了CGI或者fastcgi模式,上传.user.ini文件内容为(auto_perpend_file=a.jpg),那么a.jpg就会被当成PHP来解析。
      5. 文件头添加GIF89a伪装成图片。
  3. WAF绕过

    1. 换行绕过:比如
      1. Content-Disposition:form-data;name=”file”;filename=”1.php”,
      2. 换成Content-Disposition:form-data;name=”file”;file
        name=”1.php”
    2. 多个等号绕过
      1. ontent-Disposition:form-data;name=”file”;filename==”1.php”
    3. 增加文件大小,类似于垃圾字符
      1. Content-Disposition:form-data;
        qqqqqqqq…qqqqqqqqqqq;name=”file”;filename=”1.php”
      2. 去掉或替换引号绕过
        1. Content-Disposition:form-data;name=file;filename=1.php
        2. Content-Disposition:form-data;name=‘file’;filename=”1.php”
      3. 增加filename干扰
        1. Content-Disposition:form-data;name=”file”;filename= ;filename=”1.php”
    4. 混淆form-data
      1. Content-Disposition:name=”file”;filename=”1.php” # 去除form-data
      2. Content-Disposition:qqqqq=”qweqwe”;name=”file”; filename=”1.php” # 替换form-data为垃圾值
      3. Content-Disposition: form-data ; name=“file”; filename=“1.php” # form-data后加空格
      4. Content-Disposition: for+m-data; name=“file”; filename=“1.php” # form-data中加+号
    5. 混淆content-disposition
      1. COntEnT-DIsposiTiOn: form-data; name=“file”; filename=“1.php” # 大小写混淆
      2. Content-Type: image/gif
        Content-Disposition: form-data; name=“file”; filename=“1.php”
        #调换Content-Type和ConTent-Disposition的顺序
      3. Content-Type: image/gif
        Content-Disposition: form-data; name=“file”; filename=“1.php”
        Content-Type: image/gif
        #增加额外的头
      4. AAAAAAAA:filename=“aaa.jpg”;
        Content-Disposition: form-data; name=“file”; filename=“1.php”
        Content-Type: image/gif
        #增加额外的头
      5. Content-Length: 666
        Content-Disposition: form-data; name=“file”; filename=“1.php”
        Content-Type: image/gif
        #增加额外的头
      6. Content-Disposition: form-data; name=“file_x”;;; filename=“test.php”
        #多个分号,导致可能解析不到文件名
    6. 双文件绕过
      1. Content-Type: multipart/form-data; boundary=—————————471114117352599
        Content-Length: 253
        —————————–471114117352599
        Content-Disposition: form-data; name=“file1”; filename=“shell.asp”
        Content-Type: application/octet-stream
        <%eval request(“a”)%>
        —————————–471114117352599–
    7. 容器和waf对bounday的要求不一样
      1. Content-Type: multipart/form-data; boundary=—————————471114117352599
        Content-Length: 253
        —————————–471114117352599
        Content-Disposition: form-data; name=“file1”; filename=“shell.asp”
        Content-Type: application/octet-stream
        <%eval request(“a”)%>
        —————————–471114117352599–
        一些waf会认为两段Boundary不一致的数据是无意义的,不进行检测,而容器并没有严格要求,正常接收数据。
    8. 条件竞争
      1. 一些网站对于上传的文件处理规则是:先上传到临时目录,检测到危险再删除。那么可以先上传一个生成一句话木马的文件,内容(fputs(fopen(‘shell6666.php’,’w’),’’) ;),在上传的同时不断访问此文件shell6666.php,则有可能在文件被删除之前访问到。
    9. 如果绕不过脚本后缀,但是如果可以上传html等, 也可以配合xss漏洞,拿不到shell,但是风险等级能增加。

      5. 命令注入\代码注入

      5.1 漏洞说明

      命令注入和代码注入本质上,都是去调用系统命令,区别在于,命令注入是直接调用系统shell,代码注入是利用脚本函数去调用系统shell。所以他们其实差别不大,可以认为是同一个漏洞。
      这里还是要提到PHP,PHP中的几个调用系统程序的函数:system,exec,assert,shell_exec,popen,eval等。

      5.2 测试方法

  4. 有时候网站内部会有ping功能,输入ip再加||dir,或||ls等。

  5. 与系统进行交互的地方都可以试试,或者参数都试试,就是比较费事。

    5.3 修复方法

  6. 限制能执行的命令函数。

  7. diasble_funtion禁用大多数函数(PHP)。
  8. 过滤命令分隔符。

注入类的就不赘述,xml注入,HTML注入,ldap注入,css注入等等,原理都是相同的,只是使用的场景,造成的危害不同而已。

五、访问控制设计缺陷

1. http方法

1.1 漏洞说明

webdav在HTTP1.1的基础之上,又添加了很多HTTP方法,方便程序对server的操作,但是同时也会带来一些风险。
常见的HTTP方法是get,post,head,除此之外,还有delete,put,trace,move等,这些方法,可以对server进行操作,被认为是不安全的。

1.2 测试方法

  1. 把请求方法改为OPTIONS,观察响应包中的allow字段或者Access-Control-Allow-Methods字段,会列举支持的HTTP方法。
  2. 如果OPTIONS刚好被禁用了,那就一个个尝试吧。

    1.3 修复方法

  3. 根据业务实际,有些方法如果用不到,就禁用。

  4. 最好只保留GET,POST。

    2. CORS(跨域资源共享)

    2.1 漏洞说明

    cors的出现是为了弥补同源策略的不足。同源策略是指:同协议(http和https是不同的),同域名(a.com和a1.a.com是不同的),同端口,三者相同,才能访问该资源。但是有些业务网站必须从子域名等其他地方获取一些资源,这样同源策略会阻止这样的操作。所以,cors诞生了,它可以指定该网站资产可以从哪里访问,像白名单一样设置。但是如果配置不当,就会如同虚设。
    cors允许浏览器像服务器发出XMLHttpRequest请求,解决了AJAX只允许同源的限制。浏览器一旦发现AJAX的请求,就会自定添加一些附加的头,比如Origin,有时候还有附加一次OPTIONS的预检请求。

    2.2 测试方法

  5. 在请求修改或添加Origin字段,这个字段的意思是这个请求时从哪里来的,观察响应包的Access-Control-Allow-Origin字段。如果是*或者是你修改的的值,那么就存在漏洞。

  6. 这里要介绍一些字段:

    1. Access-Control-Allow-Origin:必填,取值可以是请求头中Origin的值,也可以是代表接受任意域的请求。
    2. Access-Control-Allow-Methods:必填,设置服务器支持的跨域方法。在测试http方法时测到了。
    3. Access-Control-Allow—Headers:可选,跨域请求时支持的字段有Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragmatic。如果除了这些,还需要支持其他字段,则在这里指定。
    4. Access-Control-Allow—Credentials:可选,表示是否允许发送Cookie,如果设置为true,表示服务器允许在请求中包含cookie,如果不允许,则去掉该字段,因为它只能设置为true。
    5. Access-Control-Max-Age:可选,设置预检请求的有效期。

      2.3 修复方法

  7. 不要将Access-Control-Allow-Origin字段设置为*。

  8. 严格校验Origin字段的值。
  9. 信任域尽量减少。

    3. CSRF(跨站请求伪造)

    3.1 漏洞说明

    csrf和xss有类似之处,xss是插入JavaScript代码,而csrf是插入html代码。它们甚至有重合的地方,也可以配合起来利用。产生xss的原因是没对用户输入做校验,产生csrf的原因是没对用户的请求来源做校验。
    假设这样的场景:网站A的删除用户的请求地址为:www.site.com/?action=delete&user=大聪明。大聪明登录了这个网站A。这个时候,小机灵发给大聪明一个网站B:www.vlun.com,说里面有好康的东西,实际上,网站B里面内嵌了这样的代码:我的渗透测试用例 - 图2,大聪明用同一个浏览器访问了这个网站B,我的渗透测试用例 - 图3标签就会去请求获取图片资产,并且带上网站A的cookie,因为大聪明刚刚登录过,还没退出,但是我的渗透测试用例 - 图4的地址是网站A的删除用户的地址,不知不觉中,大聪明删除了自己。
    还有一种场景是同样在网站A中,网站A中存在xss漏洞,小机灵就在网站A中插入了我的渗透测试用例 - 图5这样的代码,不管谁登录了,大聪明都会被删除。这是csrf和xss的配合使用。
    但是上面是get的请求,比较好利用,如果网站A使用的是post请求来删除用户呢?一样的,只是恶意代码部分改成post请求体就可以了:

    3.2 测试方法

  10. burp suite pro版内置了csrf的测试方法。将拦截到的请求包,比如修改密码。右键Engagement tools—>Generate CSRF PoC,点击test in browser—>copy,粘贴到同一个浏览器,代理别关,请求,这时候会生成一个submit request的按钮,此时把代理关掉,访问,看密码是否被修改。

  11. 不用burp suite就按漏洞说明那样,在自己的服务器上放一个html文件,内嵌目标请求的我的渗透测试用例 - 图6代码,用同一个浏览器去访问,看密码有没有被修改。
  12. 抓包请求头中,去掉referer字段,再请求,看是否正常,但是这个不能确定漏洞一定存在。

    3.3 修复方法

  13. 验证referer,这个字段的意思是这个请求是从哪里来的,要利用csrf,则这个字段肯定是恶意网站的,所有验证referer字段有防护作用。不需要每个接口都验证,只要在重要操作的请求增加拦截器验证即可。但是有些浏览器是可以篡改referer的,所以不是全都能防住。但是方便快捷,开发肯改。

  14. 增加自定义属性,csrf就是利用网站没登出,会带着cookie去访问这个机制,如果网站还要一个参数,不在cookie里面,那么csrf就成功不了了。这个参数一般叫token,值是一串随机码。

    4 . SSRF(服务端请求伪造)

    4.1 漏洞说明

    ssrf叫服务端请求伪造,那csrf是不是可以叫客户端请求伪造?可以。
    服务端请求伪造,顾名思义,就是这个请求是从服务端发起的,而不是csrf那样从客户端。
    服务器有时候需要从其他地方获取资产,比如图片,翻译接口,分享等。如果没对请求的地址做限制,那么就会造成ssrf漏洞。听起来和文件读取差不多,没错,但不限于文件读取,文件读取是读取本服务器的文件。ssrf可以读取文件,也可以探测内网端口,操作内网服务等。用的协议也和文件读取差不多:file协议用来文件读取,dict用来探测软件版本,内网端口,操作redis等,gopher可以发get/post请求,http探测主机存活等。

    4.2 测试方法

  15. 一些资产获取的地方,比如加载图片,分享,文件加载等,和文件读取的位置差不多。

  16. 修改成file:///etc/passwd,dict://127.0.0.1:6379,或者网络上的一个图片地址等。

    4.3 修复方法

  17. 过滤返回的信息,因为攻击者在利用ssrf的时候,是根据返回信息的不同,来探测资产是否存在的,把返回信息的错误信息屏蔽,即使漏洞存在,漏洞也难以利用。

  18. 限制请求的端口为只能80,443,8080。
  19. 禁用不需要的协议,留下http/https。

    4.4 绕过技巧

  20. 利用@:当限制请求地址为某个域名如www.xxxx.com时,可以www.xxxx.com@www.vuln.com,某些函数只会解析后面的域名。

  21. 短网址:比如百度的短网址:https://dwz.cn,不过短网址越来越被和谐了。
  22. 进制转换:127.0.0.1转十进制2130706433。
  23. 利用句号:127。0。0。1
  24. 利用[::]:http://[::1.1.1.1]绕过只能local host的情况。

    5. 重放攻击

    5.1 漏洞说明

    重放攻击就是同一个请求,能够通过中间人劫持的方式,不断重放给服务器。在一些业务上,可能会造成影响,比如重放文件上传,重放手机短信验证,重放邮箱验证,可能造成文件堆积,短信炸弹,邮箱轰炸等。

    5.2 测试方法

  25. 在文件上传,短信验证码,邮件验证码,订单生成,评论提交等,抓包不断重放。

    6. 任意url跳转

    6.1 漏洞说明

    当系统具备url跳转功能,但是没过滤url的时候,可以跳转到任意恶意网站。

    6.2 测试方法

  26. 观察网站的链接,如果将要跳转的url是在参数中,则可以抓包修改url。

  27. 请求包中,任意包含url的地方,或者u=,host=等地址参数,可以修改为www.baidu.com。

    六、通信设计缺陷

    1. 明文传输

    1.1 漏洞说明

    如果网站使用的是http协议,而非https协议,当传输一些关键信息的时候,比如账号,密码,身份证信息等,没有进行加密处理,流量可能会被劫持,嗅探,导致信息的泄露。

    1.2 测试方法

  28. 是否使用http协议。

  29. 抓包,最方便的是登录包,查看账密是否加密。

    1.3 修复方法

  30. 使用https协议。

  31. 采用安全的加密算法:哈希加盐,AES,RSA等。

    2. 明文存储

    2.1 漏洞说明

    程序的一些关键信息,比如账号密码,比如用户数据,是存在在本地的什么地方,是否加密存储。网站日志记录什么内容,密码是否也会被记录?

    2.2 测试方法

  32. 到服务器翻文件,一般找config,db,txt,.sqlite等文件,查看关键数据是否加密。

  33. 查看网站的日志,是否会记录一些比如身份证,密码等敏感信息。

    2.3 修复方法

  34. 关键数据如账号密码身份证手机号采用加密存储,如md5。

  35. 日志,串口日志等都不应该记录密码。

    七、信息泄露

    1. 目录浏览/遍历

    1. 1 漏洞说明

    由于中间件配置不当,导致在访问某个文件夹时,文件夹内的文件和子文件夹均被枚举出来在页面上,也就是说该目录下的所有文件都可以访问和下载,这就是目录浏览漏洞。危害等级视数据的重要性而定。

    1.2 测试方法

  36. 一般是扫描目录发现,利用dirsearch等工具扫描。

    1.3 修复方法

  37. 目前一般是iis和apache会打开目录浏览功能,关闭即可。

  38. nginx默认不开启的,如果打开了,在配置文件关闭即可。

    2. 源码泄露

    2. 1 漏洞说明

    利用代码托管平台托管过的代码,目录会有一个.git或者.svn文件的隐藏文件,利用此文件,可以把源码恢复过来,造成git源代码泄露,svn源代码泄露。

    2.2 测试方法

  39. 这个还是利用目录扫描器扫描出来。

  40. 在web根目录手工加/.git/或/.svn/。

    2.3 修复方法

    删除。

    3. 备份文件泄露

    3.1 漏洞说明

    像一些配置文件:config.ini,config.cfg,web.xml等会暴露系统敏感配置,phpinfo等会暴露系统环境。还有www.zip,web.rar等文件,一般会包含网站系统的诸多信息。

    3.2 测试方法

  41. 这个还是利用目录扫描器扫描出来。

    4. 敏感目录

    4.1 漏洞说明

    这个严格来说,不是漏洞,而是信息收集,一些目录比如后台login,admin,regitster等注册页面,不在主页导航可以找得到,找到这些页面,测试面会多很多。

    4.2 测试方法

  42. 这个还是利用目录扫描器扫描出来。

    5. 错误信息/报错

    5.1 漏洞说明

    当网站系统遇到一些识别不了的内容,比如特殊字符串,字符串太长等,造成响应崩溃,这时候系统会抛出异常信息,这些异常信息,通过会包含有一些系统的关键信息,比如使用了什么web服务器,什么中间件,什么版本?

    5.2 测试方法

  43. 在请求包中修改参数加入特殊字符,或者删减请求包结构,总之目的是引发异常。

  44. 如果系统没有统一定义错误页面,可能会抛出堆栈异常暴露信息。

还有很多漏洞没列出来,说不上是漏洞,也说不上不是漏洞比如:

  1. “无需原密码即可修改密码”,
  2. “任意手机号/邮箱/用户名即可注册”,
  3. “phpmyadmin对外开放”,
  4. “危险端口对外开放”,
  5. “cookie未设置HTTP only”,
  6. ”jq版本/apache版本太低“,
  7. 等等。