(1)密码修改逻辑漏洞

1 实验环境

软件名称版本部署方式IP
webuglatestdocker run -d -p 8082:80 -p 33060:3306 –name webug area39/webug172.31.5.7

2 逻辑漏洞概述

由于程序逻辑输入管控不严,导致程序不能够正常处理或处理错误。一般出现在登录注册、密码找回、信息查看、交易支付金额等位置,由于逻辑漏洞产生的流量多数为合法流量,一般的防护手段或设备无法阻止,也导致了逻辑漏洞成为了企业防护中的难题 。

3 如何挖掘逻辑漏洞

3.1 注册点

  • 注册功能可能出现任意用户注册、短信轰炸等问题
  • 前端验证:判断是否有任意用户注册
  • 手机验证码验证:验证码是否可以暴力破解,验证码与当前手机号没有检验匹配
  • 用户名密码注册:是否会导致批量注册

3.2 登陆点

  • 可能出现任意用户登陆、短信轰炸等问题
  • 前端验证:判断是否有任意用户登陆,是否有验证码回显,是否可以修改返回包造成任意用户登录问题
  • 手机验证码验证:是否可以爆破验证码,验证码与当前手机号有没有检验匹配
  • 账号密码登录:没有验证码或者是否存在验证码可以绕过(可以暴力破解)

3.3 密码找回点

  • 验证码是否可以多次使用
  • 验证码是否直接返回在数据包中
  • 验证码未绑定用户
  • 修改接受的手机或者邮箱进行密码重置
  • 前端验证绕过
  • 验证步骤绕过(先获取手机验证码,再输入要修改的邮箱和密码)
  • 未校验用户字段的值
  • 修改密码处id可被替换

。。。

4 密码修改逻辑漏洞

打开webug逻辑漏洞模块(默认账号:admin/admin, 数据库账号root/toor)

image-20230318112800662

后台页面

image-20230318113549496

进入容器查看网站后台管理系统的账号密码,可以看到有两个账号

[root@centos7 ~]# docker exec webug bash -c 'mysql -uroot -ptoor -e "use webug;select * from user_test\G"'
*************************** 1. row ***************************
      id: 1
username: admin
password: admin
*************************** 2. row ***************************
      id: 2
username: aaaaa
password: asdfsadf

4.1 修改密码未校验旧密码

使用账号aaaaa/asdfsadf 登录,发现404报错,这是由于webug自身的bug引起的

image-20230318114042219

删除URL中的pt_env后正常访问,是一个可以修改密码的页面

image-20230318114112583

输入任意密码后提交

image-20230318114326991

发现可以正常提交(未对旧密码做验证)

image-20230318114354409

再次查看后台数据库账号密码,发现密码修改成功

[root@centos7 ~]# docker exec webug bash -c 'mysql -uroot -ptoor -e "use webug;select * from user_test\G"'
*************************** 1. row ***************************
      id: 1
username: admin
password: admin
*************************** 2. row ***************************
      id: 2
username: aaaaa
password: 123  		#密码已被修改

4.2 普通用户修改管理员账号密码

使用burp抓包,使用账号aaaaa/123登录后台,再次提交修改密码的请求。

image-20230318115133691

发现其中有个字段id=2(通常0或者1是管理员的标识)

image-20230318115248085

将字段值改为1后,放行数据包。返回状态码200

image-20230318115729973

查看后台数据库信息,发现管理员账号密码已被修改

[root@centos7 ~]# docker exec webug bash -c 'mysql -uroot -ptoor -e "use webug;select * from user_test\G"'
*************************** 1. row ***************************
      id: 1
username: admin
password: test
*************************** 2. row ***************************
      id: 2
username: aaaaa
password: test