一.概述
1.编写目的
1.1.结合公司的内部人员培养体系,本手册旨在为安全测试人员提供测试指导
1.2.安全测试人员通过查阅该指南可快速掌握Web应用安全测试,提高工作能力
2.使用范围
2.1.本文适用于Web应用安全测试人员
3.注意事项
3.1.本文旨在为测试人员提供漏洞测试的基本思路,随着安全技术的发展
3.2.更多的新漏洞和测试方法将被爆出,安全测试人员应该具备不断学习新知识的能力
二.Web应用安全测试指南
1.认证授权类
1.1.明文传输
漏洞描述:密码明文传输存在于web网站登录页面
用户名或者密码采用明文传输,容易被嗅探软件截取
检测条件:测试目标所有敏感信息传输功能处
检测方法:
a.找到网站或者web系统登录页面
b.通过对网站登录页面的请求进行抓包,工具可用burp、wireshark、filder等等
分析其数据包中相关password(密码)参数的值是否为明文
风险等级:
【中危】:传输数据包含明文密码、链接、明文身份证、明文地址等其他敏感信息
【中危】:GET方式明文传输用户名密码
【中危】:Token或者用户身份标识,以GET方式显示在URL中
修复方案:
建议按照网站的密级要求,需要对密码传输过程中进行加密
1.2.用户枚举
漏洞描述:
在于系统的登录页面,利用登陆时输入系统存在的用户名错误密码和不存在的用户名错误密码
返回不同的出错信息可枚举出系统中存在的账号信息。
检测条件:
a.测试目标的登录功能、忘记密码功能
b.登录错误回显不一致
检测方法:
c.找到网站或者web系统登录页面
d.在web系统登录页面,通过手工方式,利用系统中存在的用户名和不存在的用户名
密码随意,尝试登录,查看其回显内容
例如:输入存在的用户名admin,展示:密码错误
输入不存在的用户名 test,展示:用户不存在
风险等级:
【中危】:可通过返回关键字对系统可用账号进行枚举
修复方案:
e.建议对网站登录页面的判断回显信息修改为一致:用户名或密码错误
1.3.用户名暴力破解
漏洞描述:
暴力破解的基本思想是根据题目的部分条件确定答案的大致范围
并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕
若某个情况验证符合题目的全部条件,则为本问题的一个解
若全部情况验证后都不符合题目的全部条件,则本题无解
常常存在于网站的登录系统中,通过对已知的管理员用户名,进行对其登录口令的大量尝试
检测条件:
a.测试目标具有登录页面
b.登录页面无验证码,无锁定机制
c.登陆页面有验证码,但可以进行识别或者无效
检测方法:
d.找到网站登录页面
e.利用 burp 对登录页面进行抓包,将其发送到 Intruder,并设置其密码参数
如pwd=为变量,添加payload(字典),进行攻击
攻击过程中查看其返回的字节长度,来判断是否成功
攻击效果下图:burpsuite抓包使用Intruder模块进行爆破
暴力破解有三种形式:
f.固定账号对密码暴力破解
g.在得知账号规律性,或者通过某种方式获取到大量账号的前提下,固定密码对账号暴力破解
h.使用网上流传的账号密码库进行撞库攻击
风险等级:
【中危】:存在暴力破解风险,但未暴破出密码
修复方案:
a.账户锁定
账户锁定是很有效的方法,因为暴力破解程序在5-6次的探测中猜出密码的可能性很小
但是同时也拒绝正常用户的使用
如果攻击者的探测是建立在用户名探测成功之后的行为,那么会造成严重的拒绝服务攻击
对于对大量用户名只用一个密码的探测攻击账户锁定无效
如果对已经锁定的账户并不返回任何信息,可能迷惑攻击者
b.返回信息
如果不管结果如何都返回成功的信息,破解软件就会停止攻击
但是对人来说很快就会被识破
c.页面跳转
产生登录错的的时候就跳到另一个页面要求重新登录,比如126和校内网都是这样做的
局限性在于不能总是跳转页面,一般只在第一次错误的时候跳转
但是第一次之后又可以继续暴力探测
d.适当的延时
检查密码的时候适当的插入一些暂停,可以减缓攻击,但是可能对用户造成一定的影响
e.封锁多次登录的IP地址
这种方法也是有缺点的,因为攻击者可以定时更换自己的IP
f.验证码
验证码是阻止暴力攻击的好方法,但设计不好的验证码是可以绕过的
而且对于特定目标的手工探测来说验证码是没有作用的
1.4.短信验证爆破
漏洞描述:
短信验证码位数太短或有效期太长导致可暴力破解
检测条件:
测试目标具有短信验证码的功能
检测方法:
点击发送短信验证码,输入任意验证码,提交请求,使用burpsuite拦截请求
在intruder模块设置验证码参数为枚举变量,这时payload类型为numbers,对验证码进行暴力破解
风险等级:
【中危】:短信验证码可被爆破
修复方案:
a.短信验证码不少于6位
b.有效期不超过1分钟
c.验证码错误次数超过上限应采取账户锁定策略
1.5.图形验证码绕过
漏洞描述:
图形验证码可被绕过,执行暴力破解等操作
检测条件:
测试目标具有图形验证码的功能
检测方法:
a.验证码和用户名、密码是否一次性、同时提交给服务器验证,如果是分开提交、分开验证,则存在漏洞
c.在服务器端是否只有在验证码检验通过后才进行用户名和密码的检验,如果不是说明存在漏洞
检测方法:输入错误的用户名或密码、错误的验证码
观察返回信息,是否只提示验证码错误,也就是说当验证码错误时,禁止再判断用户名和密码
d.验证码是否为图片形式且在一张图片中,不为图片形式或不在一张图片中,说明存在漏洞,完成检测
e.生成的验证码是否可以通过html源代码查看到,如果可以说明存在漏洞,完成检测
f.生成验证码的模块是否根据提供的参数生成验证码,如果是说明存在漏洞,完成检测
g.请求10次观察验证码是否随机生成,如果存在一定的规律(例如5次后出现同一验证码)说明存在漏洞,完成检测
h.验证码在认证一次后是否立即失效
漏洞等级:
【中危】:验证码可多次使用、发现特权验证码、前端校验、返回验证码、返回带有验证码信息的图片
修复方案:
i.系统在开发时注意验证识别后销毁session中的验证码
j.限制用户提交的验证码不能为空
k.判断提交的验证码与服务器上存储的是否一致
l.禁止将验证码明文信息发送至客户端
1.6.短信验证码绕过
漏洞描述:
短信验证码可被绕过,执行其他操作
检测条件:
测试目标具有短信验证码的功能
检测方法:
a.请求发送短信,填写任意验证码,然后提交其他操作请求,将验证码参数置空或删除,测试是否可绕过检测
b.尝试特权验证码,如000000、111111等
c.同一个短信验证码是否能使用多次
d.短信验证码使用前端验证,使用burpsuite进行抓包,修改response返回包,从而绕过
漏洞等级:
【高危】:短信验证码可以直接绕过
修复方案:
e.若存在特权验证码,建议将其删除
f.应用服务端应严格校验验证码参数是否为空,格式是否正确
g.关键操作每提交一次请求,应发送新的短信验证码,并且不可继续使用旧的验证
h.短信验证码应该进行服务器端验证
1.7.会话固定
漏洞描述:
在用户进入登录页面,但还未登录时,就已经产生一个session,用户输入信息,登录以后
session的id不会改变,也就是说没有建立新session,原来的session也没有被销毁
攻击者事先访问系统并建立一个会话,诱使受害者使用此会话登录系统
然后攻击者再使用该会话访问系统即可登录受害者的账户,会话固定攻击的原理及流程
攻击者Bob匿名访问www.buybook.com
服务器与Bob建立了一个会话,比如sessionid为1234567
Bob构造一个URL:http://www.buybook.com/login.jsp?sessionid=1234567,发给受害者Alice
Alice直接打开此链接,输入自己的用户名和密码登录系统,此时Bob再次访问http://www.buybook.com/viewprofile.jsp?sessionid=1234567,即可进入Alice 的账户
检测条件:
测试目标所有带有会话的功能
检测方法:
a.打开网站登录页面
b.登陆前通过软件工具抓取到的cookie信息值与在登录后抓取到的cookie进行对比
如果其值一样,则可判断其会话的cookies或者sessions未进行更新
漏洞等级:
【中危】:会话可由攻击者建立后发给受害者使用该会话登录系统
然后攻击者利用该会话即可登录受害者账户
修复方案:
在用户提供的认证信息(例如用户名和密码)、相应的权限级别发生变化时,
服务器端应重新生成SessionID,并强制失效之前的会话
JAVA示例代码:
request.getSession().invalidate();//清空 session
Cookie cookie = request.getCookies()[0];//获取 cookie
cookie.setMaxAge(0);//让 cookie 过期
1.8.会话重用
漏洞描述:
用户退出系统后,服务器端Session未失效,攻击者可利用此Session向服务器继续发送服务请求
检测条件:
测试目标所有带有会话的功能
检测方法:
通过客户端提供的注销功能退出客户端登录,利用登录时的会话再次向服务器发出操作请求
判断服务器是否返回操作结果
漏洞等级:
【高危】: 关闭浏览器后或退出后返回之前页面会话依然有效
修复方案:
用户退出系统后,服务器端应清空此用户的Session信息
1.9.会话失效时间过长
漏洞描述:
应用系统的会话时效时间过长
导致服务器性能受损,且由于过长的失效时间会导致可以被多次利用
检测条件:
测试目标所有带有会话的功能
检测方法:
登录目标系统获得会话,几个小时之后再次利用该会话操作目标系统,测试会话是否失效
漏洞等级:
【低危】:公网系统会话失效时间超过30分钟
修复方案:
a.服务器端设置Session的存活时间,超过存活时间强制销毁Session
b.当客户端发生变化时(比如IP、UserAgent等信息),要求用户重新登录
c.限制每个用户只允许拥有一个有效Session
当用户再次登录时,攻击者所保持的Session便会失效
1.10.算法可逆
漏洞描述:
登录认证过程中加密算法可逆
检测条件:
a.测试目标正常运行
b.登录功能处
检测方法:
c.使用burpsuite抓包研究登录的加密逻辑
d.研究登录功能加载的js源代码,是否存在解密的密钥可进行利用
漏洞等级:
【高危】:算法可逆可以直接绕过登录认证
修复方案:
加强算法的复杂度并且采取服务器端双向验证
2.信息泄露类
2.1.敏感信息泄露
漏洞描述:
在敏感数据包括但不限于:口令、密钥、证书、会话标识、License、隐私数据
(如短消息的内容)、授权凭据、个人数据(如姓名、身份证、住址、电话等)等
在程序文件、配置文件、日志文件、备份文件及数据库中都有可能包含敏感数据
检测条件:
测试目标正常运行
检测方法:
a.检测形式多样,工具爬虫扫描得到敏感文件的路径,从而找到敏感数据
b.手工挖掘,根据web容器或者网页源代码的查看,找到敏感信息
c.使用burpsuite抓包,查看response返回包,找到敏感信息
漏洞等级:
【高危】:泄露重要的敏感信息的文件
修复方案:
a.禁止在代码中存储敏感数据:禁止在代码中存储如数据库连接字符串、口令和密钥之类的敏感数据,这样容易导致泄密
用于加密密钥的密钥可以硬编码在代码中
b.禁止密钥或帐号的口令以明文形式存储在数据库或者文件中:密钥或帐号的口令必须经过加密存储
例外情况,如果Web容器的配置文件中只能以明文方式配置连接数据库的用户名和口令
那么就不用强制遵循该规则,将该配置文件的属性改为只有属主可读写
c.禁止在 cookie 中以明文形式存储敏感数据:cookie信息容易被窃取,尽量不要在cookie中存储敏感数据
如果条件限制必须使用cookie存储敏感信息时,必须先对敏感信息加密再存储到cookie
d.禁止在隐藏域中存放明文形式的敏感数据
e.禁止用自己开发的加密算法,必须使用公开、安全的标准加密算法
f.禁止在日志中记录明文的敏感数据:禁止在日志中记录明文的敏感数据
(如口令、会话标识jsessionid等), 防止敏感信息泄漏
g.禁止带有敏感数据的Web页面缓存:带有敏感数据的Web页面都应该禁止缓存
以防止敏感信息泄漏或通过代理服务器上网的用户数据互窜问题
2.2.报错页面敏感信息泄露
漏洞描述:
错误页面由服务器产生403、404、500 等错误时,返回详细错误信息
报错信息中可能会包含服务器代码信息、数据库连接信息、SQL语句或者敏感文件的路径
为攻击者收集信息提供方便
检测条件:
测试目标正常运行
检测方法:
a.通过目录扫描或手工输入不存在的文件或路径,触发服务器产生404错误并返回404页面
b.通过目录扫描或手工输入一个无权限查看的文件或路径
触发服务器产生403错误并返回403页面
c.手工输入不存在的参数或特殊构造的字符串
如单引号,尖括号等,触发服务器产生500错误并返回500页面或异常信息
漏洞等级:
【高危】:开启调试模式,泄露大量应用的敏感信息如代码、报错信息等
【低危】:未开启调试模式,泄露部分中间件版本、少量代码信息等
修复方案:
a.编码时增加异常处理模块,对错误页面做统一的自定义返回界面,隐藏服务器版本信息
b.不对外输出程序运行时产生的异常错误信息详情
2.3.robots.txt泄漏敏感信息
漏洞描述:
搜索引擎可以通过robots文件可以获知哪些页面可以爬取,哪些页面不可以爬取
Robots协议是网站国际互联网界通行的道德规范
其目的是保护网站数据和敏感信息、确保用户个人信息和隐私不被侵犯
如果robots.txt文件编辑的太过详细,反而会泄露网站的敏感目录或者文件
比如网站后台路径,从而得知其使用的系统类型,从而有针对性地进行利用
检测条件:
测试目标正常运行
检测方法:
a.检测形式多样,工具爬虫扫描得到敏感文件的路径,从而找到robots文件
b.手工挖掘,直接在域名后输入/robots.txt进行查看
漏洞等级:
【低危】:robots.txt中存在allow和disallow的具体内容泄露敏感目录
修复方案:
a.User-agent: *这里的代表的所有的搜索引擎种类,是一个通配符
b.Disallow: /这里定义是禁止爬寻站点所有的内容
c.Disallow: /admin/这里定义是禁止爬寻admin目录下面的目录
d.Disallow: /ABC/这里定义是禁止爬寻ABC目录下面的目录
d.Disallow: /cgi-bin/.htm禁止访问/cgi-bin/目录下的所有以".htm"为后缀的 URL(包含子目录)
f.Disallow: /?*禁止访问网站中所有包含问号(?)的网址
g.Disallow: /.jpg$禁止抓取网页所有的.jpg格式的图片
h.Disallow:/ab/adc.html禁止爬取ab文件夹下面的adc.html文件
i.Allow: /cgi-bin/这里定义是允许爬寻cgi-bin目录下面的目录
j.Allow: /tmp这里定义是允许爬寻tmp的整个目录
k.Allow: .htm$仅允许访问以".htm"为后缀的URL
l.Allow: .gif$允许抓取网页和gif格式图片
m.Sitemap: 网站地图告诉爬虫这个页面是网站地图
2.4.SVN信息泄露
漏洞描述:
SVN是程序员常用的源代码版本管理软件
一旦网站出现SVN漏洞,其危害远比SQL注入等其它常见网站漏洞更为致命
因为黑客获取到网站源代码后,一方面是掠夺了网站的技术知识资产
另一方面,黑客还可通过源代码分析其它安全漏洞,从而对网站服务器及用户数据造成持续威胁
更严重的问题在于,SVN产生的.svn目录下还包含以.svn-base 结尾的源代码文件副本
(低版本SVN具体路径为text-base目录,高版本SVN为pristine目录)
如果服务器没有对此类后缀做解析,黑客则可以直接获得文件源代码
检测条件:
测试目标采用SVN(subversion)源代码版本管理软件
检测方法:
访问http://[ip]/CVS/Entriesp以及http://[ip]/.svn/entriesp看是否成功
也可以自行构造,根据显示的主目录去逐级访问并遍历相关的目录和文件利用web漏洞扫描工具进行检测
漏洞等级:
【高危】:泄露公司svn敏感信息
修复方案:
删除SVN各目录下的.svn目录,删除CVS的CVS目录,或者对URL中进行过滤,过滤相关svn等相关敏感字符
2.5. 备份文件信息泄露
漏洞描述:
备份文件泄露,在web服务中,尝尝不局限于网站的源代码泄露,网站的数据库备份文件,
以及上传的敏感文件,或者一切正常备份
原则不允许访问的文件可被通过访问web路径进行下载得到,造成其信息泄露
有效的帮助攻击者理解网站应用逻辑,为展开其他类型的攻击提供 有利信息
降低攻击的难度,可以进一步获取其他敏感数据
检测条件:
a.测试目标正常运行
b.存在可通过构造路径,将备份文件下载出来
检测方法:
a.常见检测方法是通过对网站进行web漏洞扫描,直接利用爬虫来爬取网站可能存在的路径以及链接,如果存在备份文件,则可通过web直接进行下载
b.也可以通过自行构造字典,对网站某一目录下,指定字典进行爆破,常见的扫描工具有 wwwscan、御剑后台扫描工具等
漏洞等级:
【高危】:泄露敏感信息。
修复方案:
a.网站管理员严格检查web中可访问的路径下是否存在备份文件
常见备份文件后为.jsp.bak、.bak、.sql、.txt等等
如果有这些文件,直接将该备份文件进行转移到其他目录或者直接删除即可
b.严格控制可网站可访问目录下的文件敏感度的存放问题,不要将敏感文件置于该目录
2.6.github信息泄露
漏洞描述:
公司内部人员或者第三方开发商将公司代码或者其他相关信息存储到外网的github
当中造成公司的信息泄露
检测条件:
测试目标正常运行
检测方法:
通过github监控巡检
漏洞等级:
【高危】:泄露公司内部重要信息或者代码
修复方案:
a.及时删除github上面泄露的敏感信息
b.员工意识培训,禁止将公司文件上传到github
c.自建内部git平台
2.7.目录浏览
漏洞描述:
目录浏览漏洞是由于网站存在配置缺陷,存在目录可浏览漏洞
这会导致网站很多隐私文件与目录泄露
比如数据库备份文件、配置文件等,攻击者利用该信息可以更容易得到网站权限,导致网站被黑
检测条件:
测试目标具有目录浏览功能
检测方法:
可以利用web漏洞扫描器扫描web应用进行检测
也可通过搜索网站标题包含“index of”关键词的网站进行访问
漏洞等级:
【高危】:目录可以浏览,未泄露包含密码、个人信息等敏感文件
【低危】:目录可以浏览,泄露包含密码、个人信息等敏感文件
修复方案:(目前存在该漏洞的常见中间件为apache和IIS)
a.IIS 中关闭目录浏览功能:在IIS的网站属性中,勾去“目录浏览”选项,重启IIS
b.Apache中关闭目录浏览功能:打开Apache配置文件httpd.conf
查找“Options Indexes FollowSymLinks”
修改为“Options -Indexes”(减号表示取消,保存退出,重启Apache
c.Nginx中默认不会开启目录浏览功能,若发现当前已开启该功能,可以编辑nginx.conf文件
删除如下两行:autoindex on;autoindex_exact_size on,重启Nginx
2.8.物理路径信息泄露
漏洞描述:
应用中泄露出应用在主机中的绝对地址路径
检测条件:
测试目标正常运行
检测方法:
a.打开网页源代码,查看图片等媒体的链接及超链接
b.通过报错信息获取
漏洞等级:
【低危】:泄露应用绝对路径。
修复方案:
a.媒体链接和超链接采用相对路径的表达方式
b.报错信息中不对外输出网站物理路径等敏感信息
2.9.敏感信息明文存储
漏洞描述:
敏感信息明文存储在后台或者数据库中
检测条件:
测试目标存储敏感信息的地方
检测方法:
a.查看后台存储的敏感信息
b.查看数据库中存储的数据
漏洞等级:
【中危】:敏感信息直接明文存储在后台或者数据库当中
修复方案:
将敏感信息加密后进行存储
3.下一期更新:《WEB应用安全测试》主要包含:文件I/O类及接口安全类等