安全测试(总结)
1.jsonNP劫持
(其实json劫持和jsonNP 劫持属于CSRF跨站请求伪造)的攻击范畴,解决方法和CSRF一样
定义:构造带有jsonp接口的恶意页面发给用户点击,从而将用户的敏感信息通过jsonp接口传输到攻击者服务器
json语法规则:数据在名称/值对中、数据由逗号分隔、花括号保存对象、方括号保存数据组
JSONP : JSON with Padding•是基于 JSON 格式的为解决跨域请求资源而产生的解决方案,由于同源策略,JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对领象,但也在一定程度上限制了一些前端功能的实现,一般来说位于 server1example.com 的网页无法与不是 server1.example.com 的服务器沟通,而 HTML的sscript元素是一个例外。利用<script>元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON资料,而这种模式就是所谓的JSONP
测试步骤:对返回值为json、jsonp为接口是否存在敏感信息;看是否存在劫持漏洞:检查是否存在有效token;无token,是否对referer进行校验,设置referer为空或者baidu.com,看是否返回数据
1.对所有返回值为json/jsonp的接口进行检查,如果不存在敏感信息則可以不用关心该风险
2.如果存在敏感信息,且为同域json,检查头部是否有while(1),如果有则不存在漏洞,否则进入第3步。
3.检查是否存在token, 无token进入第5步,否則进入第4步。
4. token设置为空进行重放,检查是否能够成功执行,如果执行成功則存在漏洞。
5. 使用空referer、该站城名1baidu.com作为referer,检测是否存在referer校验机制,如也不存在,則说明存在漏洞。
防御:敏感数据尽量不要操作JSONP跨域传输;检查referer,白名单
测试目的:测试返回内容为json/jsonNP 的接口,查看是否存在敏感信息,是否进行了json劫持防御(token、referer等)json劫持的目的主要是用于获取敏感信息,如没有,则不处置
2、SQL注入
定义:Web系统的代码中,经常会出现未对用户输入数据的合法性进行验证的情况,这样让恶意用户有机可乘,用户可以提交数据库语句)片段,根据程序返回的结果 ,甚至是异常信息来获得数据库信息等有用数据,这被称作SQL注入。
欺骗服务器执行恶意的SQL命令以到达对数想库的数据进行猜解、查询、规除、添加,如果应用程序使用权限较高的数据库用户连接数据库,那么通过SQL注入攻击很可能就直接得到系统权限,可以通过一步步的猜解或者联合查询就得到管理员的用户名和密码。
比如在一个登录界面,要求输入用戶名和密码:
可以这样途入实现免帐号登录:用户名:or1=1密码:
点登陆如若没有做特殊处理那么这个非法用户就很得意的登姑进去了 ,SELECT * FROM user table WHERE username=" or 1 =1 -and password="-为注释符
以下说明发现此现此漏洞的几种特特征输入
1.输入url参致中加单引号‘
比如http//:www.test com/testphp?id=12这个urL后加上单引号’,而后台逻辑在获取到url参数id时,直接拼装sql语句并执行,此时会号致sql语句出现这种情况:selecta where id =12’, sql执行时会发生错误,若代码中未对异常页面另加处理,很可能用户就会获知数据库类型等信息。
2.输入中增加 and 1 =1或 and1=2
如上例中的url,id参数输入id=12 and 1 =1 或者id= 12 and 1 =2
这是常见的2=1 1=2的测试方法,如果程序不可以进行SQL注入,对于一 个整型参数,这两类输入一股都会有程序定义的错误提示或者类型转换错误提示,或直接跳转到错误的url项面,若可以进行SQL注入,1=1输入与正场输入id=12的显示应无差异,而1=2可能会导致提示无记录,页面显示为空的情况。
3.尝话大小写不同的输入,尝试特殊字符对应ASCII码
有些程序中会过滤select等关键词,但是 记区分大小写,此时可以用selecT等尝法进行注入。或者尝试ASCII码来绕过程序中特殊字符的过滤
测试步骤:(SQL注入最经典最初的万能密码 OR ''=' ('or'a'='a) :
1、观察参数的值value是否为数字型。如果是数字型进行数字型测试,否则跳到第4步进行字符型测试(例如如果出现a那说明是字符型,如果出现2则将其当做数字型测试)
2、将被测参数后加上测试语句 "and 1=1“ ,即:地址栏中填入
"http://ww.exmaple.com/page.xx?name=value and 1=1〞 ,如果返回正确页面则进行下一步操作,杏则跳到第4步。
3、将被测参数后加上测试语句“and 1=2”(这里以第n个参数为例),其他爹数保持不变,即:地址栏中填入 "http://www.exmaple.com/page.xxx? name=value and 1=2”,如果返回正确页面则进行下一步操作,否则该参数存在注入漏洞,完成测试
4、将被测参数后加上测试语句 “ and '1' =' 1 ”,即:地址栏中填入
" http://wwww.exmaple.com/page.xx? name=value' and '1’ =’ 1 〞,如果返回正确页面则进行下一步操作,否则该经数存在注入漏洞,完成测试
5、将被测参数后加上测试语句 “ and “1' =’ 2 〞,即:地址栏中填入
"http://wwwexmaple.com/page xx? name=value’ and '1’ =’2 ”,如果返回正确页面则不存在漏洞,否则该参数存在汪入漏洞,完成测试
6.工具测试:测试时间型注入
显示SQL注入攻击:一般认为就是在url中添加非法的SQL注入语句来攻击的行为。由于web程序的语言不同和用的数据库不同,采用的注入语句也不同
隐式注入:http header注入:是不能在URL后添加非法的SQL语句根据页面的反应来进行注入,一般可以分为cookies注入、表单注入、http header注入
cookie注入:由于cookies是存放在客户端的验证用户数据,当服务器接受到cookies,并且没有经过任何过滤措施,往往会使攻击者在客户端修改为含有非法SQL语句的cookies,就形成了注入
表单注入:表单时用户直接向web程序输入的地方,经常在用户表单输入后会有对数据库的操作,由于表单的SQL注入不像显示注入那样直接,所以经常回忽视
用户的敏感信息不应该存在cookies中,登录状态下,cookies中涉及的登录信息等敏感字段,使用http only属性可以降低XSS产生后造成的危害。
防范:避免SQL注入的方法,采用过滤、合法性检查、和长度限制等方法,检查变量数据类型和格式,过滤特殊符号
3.权限漏洞
定义:web应用或接口缺乏权限鉴定(原因),攻击者可以获取或操作他人信息(危害)
分类:水平越权(同级别)、垂直越权(不同级别)、未授权访问(未登录用户)
水平越权:权限类型不变,权限ID不变,即同等角色下的用户,不但能够访问自己的私有数据,也能访问他人的私有数据
垂直越权:权限ID不变,权限类型改变,即低权限的角色经过一些途径,获得高权限的能力,就发生了越权访问。
预防:垂直使用账号1无法获取到2的信息
水平:使用账号1的session无法查看或操作2的数据
不要在URL(参数、路径),post数据、cookies等位置设置管理权限标识,而应该在后端通过session判断权限
4.XSS 跨站脚本攻击
定义:web页面缺乏HTML特殊字段的转义或者过滤机制(原因),攻击者可以通过插入恶意JS并执行,从而控制用户浏览器,盗取cookie(利用document.cookie得到cookies)等(危害)
XSS跨站脚本攻击,是指攻击者往web页面插入恶意html代码,当用户浏览该页时,嵌入web 页面的恶意代码会被执行,从而达到攻击的目的,XSS是目前最为普遍和影响严重的web应用安全漏洞,当应用程序没有对用户提交的内容进行验证和重新编码,直接呈现给网站访问者时,可能会发生XSS攻击。
XSS攻击的过程涉及攻击者、受害者、存在漏洞的网站三方,只有受害者会实际执行攻击者的代码,网站仅仅是发起进攻的载体,一般不会受到影响,XSS可以让攻击者在页面访问者的浏览器中执行脚本(一般为javascript),从而执行获得用户会话的安全信息,插入恶意信息,操纵浏览器,植入病毒等。
分类:反射型(恶意JS在url),存储型(恶意JS在数据库中,访问更广,危害更大),DOM型(恶意JS由网页JS动态创建)
测试步骤:
-
- 在表单中填写或者抓包修改请求中的参数,(以下代码都是对的)
a)<script>alert(1)</script>
b)"alert(1);x='"
c) "> < img src=x οnerrοr=alert(1)>
d)''></scritp> <script>alert(1) <script>< ''
e) <script src= "http://ox.com>
参数值填写上述代码,查看是否弹窗,如果在站点中,显示有该参数值的页面出现弹窗(如存在onmouseover则
需要移动鼠标后触发),则说明存在漏洞,停止测试
C会弹窗并显示1
2.查看源文件,搜索alert(1),检查payload中的引号,尖括号是否经过了转义,如果没有转义,则无论是否弹窗,都表示存在漏洞
3.功能测试时,可以有一些简单的方式测试是否经过正确的特殊字符的处理,常见的JS注入
防御:过滤输入:非字符串或者有固定值时,事先进行类型/值检查
转义输出:进行HTML转义,如转义为>
callback参数只允许数字、字母、下划线
长度限制:对输入输出进行过滤
5.CSRF跨站请求伪造
定义:链接的表单提交的所有请求参数都可被预测(原因),攻击者可构造一个自动提交表单的URL,当合法用户在登陆状态的时候,攻击者再诱导用户点击,此时用户在不知道请的情况下执行了攻击者伪造的增删改查请求(危害)CSRF是一种依赖web浏览器,欺骗代理人的攻击,代理人在正常访问页面中包含链接或者脚本时向与代理人保持会话的某个网站发送HTTP请求(即HTTP会话劫持或者session欺骗攻击)
简单来说就是攻击者用你的token,发送恶意请求或者往web页面插入恶意html代码
CSRF一度被认为是跨站脚本攻击XSS,但是CSRF伪造来自用户信任的请求,而XSS攻击者本身是站点内的信任用户。两者的相似之处,两种攻击都是被动攻击,都是利用链接或者页面中的脚本,CSRF常常利用跨站脚本攻击来实现(如XSS添加管理员)
CSRF攻击原理及过程:
1.用户C打开浏览器,访问受信任的网站A,输入用户名和密码请求登录网站A
2.在用户信息通过验证后,网站A产生cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A
3.用户未退出网站A之前,在同一浏览器中,打开一个tab页访问网站B
4.网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A
5.浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带cookie信息,向网站A发出请求,网站A并不知道该请求是由B发起的,所以会根据用户C的cookie信息以及C的权限处理该请求,导致来自网站B的恶意代码被执行。
测试步骤:
1.对所有增删改查操作的URL进行检查,是否在post请求参数中存在token,若无则无风险,若是存在token,则进一步判断token 设置为空或者任意值时是否执行成功,成功则存在风险。
2.用burpsuit自带的生成CSRF poc,发送给被攻击者尝试是否触发
3.检测CSRF漏洞最简单的方法就是抓一个正常请求的数据包,去掉referer字段后再重新提交,如果该提交还有效,那么可以判定存在风险
防御:对所有增删改查操作,在http head 或者请求参数中加入CSRF token,并在服务端验证
1.利用http referer 检查访问的来路是否可信
2.提交每一个表单或者重要表单使用随机验证码
3.在重要操作中使用一次性密码使CSRF攻击者无法再伪造和猜测
4.在客户端安装防止会话攻击的软件
5.防止跨站脚本攻击
测试目的:增删改查操作是否进行了CSRF防御,防止攻击者诱导受害者进行数据敏感操作(修改个人资料),获取敏感信息
CSRF与XSS区别:
CSRF:无法获取受害者的cookie,无法看到cookie,只是利用受害者是被服务器信任的(靠验证cookie),而给服务器发送请求
XSS:利用cookie只是XSS的一种体现,XSS还可以篡改网页,URL跳转等,跨站脚本,脚本可以做什么,XSS就可以做什么。XSS就利用cookie上,是获取受害者的cookie,得到服务器的信任后进行攻击。
6.CORS跨站资源共享
定义:跨源资源共享(CORS,或通俗地译为跨域资源共享)是一种基于 HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其他源(域、协议或端口),使得浏览器允许这些源访问加载自己的资源。跨源资源共享还通过一种机制来检查服务器是否会允许要发送的真实请求,该机制通过浏览器发起一个到服务器托管的跨源资源的“预检”请求。在预检中,浏览器发送的头中标示有 HTTP 方法和真实请求中会用到的头
测试步骤:
1.curl访问网站 curl https://www.junsec.com -H "Origin: https://test.com"
-I
,检查返回包的 Access-Control-Allow-Origin 字段是否为https://test.com
2.burpsuite发送请求包,查看返回包,Access-Control-Allow-Origin的值,当其为null、意味着信任任何域
7.登录安全
定义:登录没有做好安全控制(原因),攻击者暴力破解,账号被盗(危害)
1.在注册页面进行注册,输入简单口令,检查前端是否会提示密码强度不够
2.使用burpSuite进行拦截,修改密码为简单口令,检查是否能够成功提交,成功提交就存在风险
登录封禁策略:
1.向开发询问登陆失败策略,其中封禁手段包括:封禁用户名,IP等,封禁依据包括:请求频率、错误次数等
2.打开登陆页面,输入正确的用户名,输入错误密码看封禁策略是否执行
3.尝试随机输入用户名和密码(均不正确)查看是否生效
4.每隔N次输入错误的,然后输入一次正确的,查看错误次数是否被重置
5.高频率请求登录操作,查看封禁是否生效
【密码找回】测试目的:测试密码找回流程是否可以被绕过,从而修改其他用户密码
【密码找回】测试方法:
1.进入密码找回页面,检查是否存在短信电话邮箱等二次验证,没有则存在风险
2.输入错误的手机号,其他正确,查看是不是能够收到密码找回验证
3.验证凭证为链接,检查链接中的参数是否可以被解密或者使用了弱token,是否存在有效期
4.检查找回密码的凭证是否会出现在html文本,url参数中
【会话固定】测试目的:测试登陆成功后,会话标识是否发生变更,如果没有变更,攻击者通过一些手段为受害者提供一个会话标识,待受害者成功登录后,攻击者也可以获得相应的权限。
【会话固定】测试方法:
1.访问未登录网站的页面,记录当前cookies中的会话标识
2.执行成功登录,记录登陆后的会话标识
3.对比登录前后的2个会话标识,如果相同,存在漏洞。
【会话固定】防御策略:用户登录时生成新的session ID,如果攻击者使用的会话标识符不是有效的,那这种方式会有效,因为不是有效的会话标识符,将会要求用户重新登录
大部分会话劫持的方法对会话固定攻击同样有效,如设置Httponly,关闭透明化session ID ,user-Agent验证,Token校验等
【账号体系】测试步骤:
1.查看是否使用了统一的账号体系或者第三方的
2.独立的账号体系,测试密码的传输方式是不是https,密码是否加密传输
3.向开发咨询密码的加密方式,是否过于简单(未使用盐,仅使用Md5,base64或者自定义的加密方式)
【密码强度】:强口令
【失败提示】:不要明确提示
【验证码】:短信通道验证码接口未作次数限制,短线轰炸,是不是有验证码,有没有错误尝试次数,验证码的重用,空值
【测试用例设计点】
1.用户密码后台存储是否加密
2.用户密码在网络传输过程中是否加密
3.密码是否具有有效期,有效期到后是否提示
4.不登录的情况下,直接输入登录后的地址看是否重定向到用户登录界面
5.密码输入框输入的密码在页面源码模式下是否可被查看
6.输入框输入SQL注入的字段或者XSS攻击的脚本
7.多次登录失败下,系统是否会阻止
8.同一用户不同浏览器登录,验证是否有互斥性
9.是否可以使用登录的api发送登录请求,绕开验证码校验
10.截取到的token信息,是否可以绕开登录直接在其他终端使用,token有效期
8.文件传输安全
测试方法:
1.上传任意后缀文件,检查是否可以上传成功
2.上传任意文件,使用BurpSuite拦截,修改Content-type为image,检查是否可上传成功
3.上传test.jpg,使用BurpSuite拦截,修改文件名为test.asp,检查文件是否可以上传成功
4.如为图片,咨询开发是否进行了resize或者水印处理
测试步骤:
见文件传输漏洞页
关于使用appscan进行安全测试步骤:如何从0到1做一次完整的安全测试