一、安全测试的目的:
为了尽可能的发现安全漏洞
二、安全测试的基本步骤:
收集信息—>熟悉环境—>梳理功能—>评估风险—>制定计划—>执行测试—>输出结果
1、如何熟悉环境:a. 测试在哪儿执行:浏览器还是APP
b. 测试有没有前置条件:内部系统还是外部系统?是否需要特定账号才能使用
c. 系统特殊属性:是否是行业专门系统,是否需要其他预先只是储备
2、功能是否已就绪:一般在功能测试基本完成之后进行安全测试
3、制定计划(设置场景,设计用例)
4、执行测试
三、通常容易出现的安全漏洞
1、CSRF攻击
(跨站请求伪造,通过伪装来自受信任用户的请求来利用受信任的网站)
如:某用户转账操作:http://www.mybank.com/Transfer.php?toBankId=11&money=1000。转账操作成功后访问某个网站(或链接图片),该网站有如下代码:<img src=http://www.mybank.com/Transfer.php?toBankId=11&money=10000>。访问成功后该用户账户就少了10000人民币了~
其原理是因为该用户访问银行操作网站后,该网站没有唯一标识认证用户,因此在短时间再次访问该链接不能辨认是否是用户自己在进行转账操作,进而操作成功,这样用户在不知情的情况下就损失了10000元,就算再次去银行查账也只会认为是用户自己转出10000元。
那么如何检测某个地方是否存在CSRF攻击:通过fiddler或Charles抓包查看接口是否有唯一标识(如:在增删改的表单提交接口上,若没有csrftoken或者refer校验,则存在csrf漏洞)
- 如果增删改的表单有referer,需把referer参数改为www.baidu.com 看是否页面返回正常;
- 如果没有refer,看是否有csrftoken,更改token,看是否正常;
- 若没有refer或csrftoken,则说明存在问题
2、XSS
(跨站脚本攻击,目的是在页面中输入可被控制的HTML代码。所以有输出的地方就有可能又XSS)
如:设计上出现失误:允许用户在页面中输出HTML代码,如下页面
该页面源代码为:
试着在输入框中输入:abcd123,得到结果为
也就是说我们输入的字符会被原封不动的输出来,那么如果在该输入框中输入如下JS代码:
<script>alert(‘xss’)</script>会出现什么情况呢?由此看来XSS的原理就是利用输出的环境来构造代码。XSS就是在页面执行你想要的JS,(以上举例摘抄某博客,写的比较基础,比较容易懂:http://netsecurity.51cto.com/art/201408/448305_all.htm)
以上例子输入代码点击提交,成功弹出对话框,基本就可以确定存在XSS漏洞了。
那么如何检测某个地方是不是存在XSS,通过举例也应该了解一些了。整理下来:
- 确定输入点&确定输出点
- 构造攻击向量:--></textarea>/><img src=x onerror=alert(1)/><!--
- 刷新页面,查看是否有弹框?
3、SQL注入
SQL注入详解:
(一)https://baijiahao.baidu.com/s?id=1568598718373461&wfr=spider&for=pc
(二)
https://m9.baidu.com/feed/data/landingpage?s_type=news&dsp=wise&nid=3745639765741583179&p_from=4
(三)https://baijiahao.baidu.com/s?id=1568598718373461&wfr=spider&for=pc
原理:SQL语句中有允许用户任意控制的通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。后果极其严重,可以导致数据库被攻击者完全控制,甚至导致服务器崩溃。所以,有参与到数据库语句构造的地方就有可能有SQL注入。
如:一个简单的登录页面,代码方法中userName和 password 是没有经过任何处理,直接拿前端传入的数据。输入正常数据,合并的SQL为:
SELECT COUNT(*) FROM Login WHERE UserName=‘admin‘ AND Password=‘123456‘
如果我输入:admin’ --,密码随便输,合并的SQL语句变为:
SELECT COUNT(*) FROM Login WHERE UserName=‘admin‘-- Password=‘123‘
其中--为注释符,后面语句则被省略而登录成功了。如图:
这是最简单的一种SQL注入。常见的SQL注入语句详见(也可自行百度)
“http://blog.csdn.net/ywb201314/article/details/52401511”
那么如何检查是否存在SQL注入呢?一个简单的方法:随手在参数后面加一个英文半角单引号(‘)
原因:单引号在SQL语句中通常是闭合字符串,一般程序无需闭合字符串,而是在代码中替用户完成这整个过程,用户新增的单引号会使得程序的闭合乱序,往往页面就会报错。
4、鉴权失当
鉴权失当有多种,通常只有在有权限控制的功能中出现。
- 低权限用户可以控制高权限用户才能使用的功能称为【垂直越权】
- 同等级用户间可以互相访问原本只有对方才能访问的功能称为【水平越权】
- 某个功能在特定情况下才能访问,但可以被绕过称为【上下文越权】
鉴权失当其实是一个逻辑漏洞,常见的:管理后台容易出现越权
测试方法:
- 准备两个或者更多个不同权限的账号
- 拷贝相关的URL,交给拎一个权限的账号访问
- 如果能看到前一个账号的信息,就证明问题存在
5、上传漏洞
允许文件上传的地方就可能出现上传漏洞(用于利用上传漏洞来控制服务器的工具:WebShell)
测试方法:用同种语言写一个“hello Word”,上传这个文件至这个程序,如果在页面中程序被执行了,(输出源代码不算数),则说明存在上传漏洞
6、敏感信息泄露