在这面具之下,是你坚强的信念
闪石星曜
正在火热练习阶段ing......
我们每分享更新一套后,会裁剪一部分内容到公众号
供大家学习
如果大家想学习完整更多内容
欢迎加入炼石计划训练营
但不妨现在先学习下本套课程吧~
··· ···
1
项目安装
A、基础环境部署
1、Java环境部署
Java版本如下图所示:
JDK下载链接:
https://www.oracle.com/java/technologies/downloads/#java8-windows
安装步骤操作简单,只需下一步即可,不过多赘述。
2、Maven环境部署
关于Maven环境部署与安装,可参考下面的文章,安装最新版即可。
https://www.runoob.com/maven/maven-setup.html
在IDEA中内置了Maven,对于我们来说足够用了。
Maven加速配置
配置国内源下载一些依赖组件会非常快,但会有极个别情况,有些组件使用国内源无法下载,则需要再更改配置,大家留有印象就好。
①、访问c:\Users\当前用户\.m2
目录,当前用户文件夹需要根据当前用户来定,如下图所示:
②、打开settings.xml
文件,复制粘贴以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<pluginGroups></pluginGroups>
<proxies></proxies>
<localRepository>C:\Users\当前用户\.m2\repository</localRepository>
<servers>
</servers>
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
<profiles>
</profiles>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
</settings>
注意代码中的当前用户
该位置路径应与你当前用户一致。
3、Mysql环境部署
个人偏好于使用phpstudy,它集成了很多常用组件,如apache,mysql等。作为练习,方便至极,一键启动即可使用。
官方下载链接:
https://www.xp.cn/
下载完成后,双击进入软件。进入首页处,选择mysql套件,点击启动即可,如下图所示:
点击左侧数据库
,可以对数据库进行密码修改
操作。
4、IDEA
官方下载地址,可选择使用Ultimate
版本。
https://www.jetbrains.com/zh-cn/idea/download/#section=windows
B、环境搭建
安装整体过程首先将数据导入mysql数据库中,然后将项目导入IDEA中,修改配置文件中数据库信息,点击启动即完成环境搭建。
①、在phpstudy中启动Mysql
②、启动cmd命令行,进入mysql数据库,命令:mysql -u root -p
,然后键入你的密码。
③、使用命令创建数据库:create database rbac;
。使用命令选择rbac数据库:use rbac;
④、导入rbac.sql
文件,该文件位于RefiningStone-RBAC
项目文件夹内。在导入时务必注意路径中的正斜杠。使用命令source
导入数据,如下图所示:
最后全部为Query OK...
,无报错,即为全部导入成功。
⑤、打开IDEA,点击Open or import
,选择项目文件夹下的pom.xml
文件,最后选择打开方式为Open as project
,如下图所示:
也可以右键选择文件夹,点击Open folder as Intellij IDEA project......
第一次导入项目,Maven会自动下载所需依赖,会花费一些时间。
⑥、几个现象表明项目部署成功。pom.xml
文件无报错,项目代码已编译为class
,Edit Configurations...
处显示可以运行。
⑦、进入src - main - resources - application.yml
,对配置文件进行相关修改,主要修改Mysql数据库连接账号密码,具体可以去phpstudy下数据库处查看。
⑧、万事具备,点击右上侧启动即可。下侧console控制台中信息无任何报错,即为启动成功,另外需要注意的是启动端口是多少,启动端口可以在application.yml
文件中更改port
的值。
⑨、打开浏览器,键入http://127.0.0.1:8088/login.html
,访问项目。
至此,环境已搭建完毕,可以开始面的练习了。
2
代码审计漏洞挖掘
“环境部署完成后,
通过代码审计深入发现安全漏洞”
5.1、SQL注入漏洞挖掘
本项目整合了Mybatis操作数据库。通过前面的学习,我们了解到Mybatis错误的配置会导致SQL注入漏洞的存在,这是我们挖掘SQL注入漏洞的入口点。
我们先来回顾下:
Mybatis拼接sql有下面两种方式:
#{}
告诉 MyBatis 创建一个预编译语句(PreparedStatement)参数,在 JDBC 中,这样的一个参数在 SQL 中会由一个“?”来标识,并被传递到一个新的预处理语句中,
${}
仅仅是纯粹的 string 替换,在动态 SQL 解析阶段将会进行变量替换,直接替换字符串,会导致SQL注入产生。
一些不能使用#{}
的场景:
表名/字段名
order by/group by
like模糊查询
in
因此,我们在代码审计阶段进行SQL注入漏洞挖掘,应关注xxxxMapper.xml
中使用${}
拼接SQL的地方,全局搜索关键字符。Windows快捷键CTRL+SHIFT+F
(如果快捷键冲突,需自己更改)。
调出Find in path
,File mask选择文件类型为*.xml
,键入关键字符${
,如下图所示:
通过上述搜索,发现了SQL语句使用了like
语句并使用$
进行拼接参数,这种情况下无疑是存在SQL注入的。
我们逆向追踪所拼接的参数,看看是从前端哪个地方输入进来的。
首先在IDEA中安装Free Mybatis Plugin
,该插件方便mapper.xml与mapper接口之间跳转。需在左上角File -> Settings -> Plugin
中安装。
逆向追踪参数流程,举例说明
①、通过搜索还发现src/main/resources/mybatis-mappers/DictMapper.xml
文件,第17行,存在使用like
语句以及$
拼接SQL。安装了Free Mybatis Plugin
插件后,左侧会有绿色箭头,点击即可跳转到mapper接口处,也就是DAO层文件,如下图所示:
②、我们继续向前找到谁调用了DictDao.java
中的getFuzzyDictByPage
,Windows系统按住ctrl
键,鼠标左击getFuzzyDictByPage
进入该方法,或者说查看谁用了这个方法。如下图所示:
③、点击进入DICTServiceImpl.java
文件,发现getDictPage
函数中使用了`getFuzzyDictByPage
,如下图所示:
④、继续按住ctrl
键,鼠标左击getDictPage
方法,点击后,直接进入到了DictController
文件中第43行,如下图所示:
找到Controller层后,发现并没有dictname参数,因为Controller中以实体类接收表单数据。进入MyDict
发现该类为实体类,其中定义多个参数,如下图所示:
⑥、经过上述参数逆向追踪,确定了dictName为字典名称
位于查询字典功能
处。我们可以启动项目,配合渗透测试进一步验证,更加直观。
5.3、越权漏洞挖掘
在渗透测试阶段挖掘漏洞时发现了越权漏洞,我们现在从代码审计角度跟踪一下删除流程。
通过URL路径api/user
查看相关Controller,搜索发现为UserController
,位于src/main/java/com/codermy/myspringsecurity/plus/admin/controller/UserControlle
。进一步查找关于删除用户的的方法,发现在该文件的第115行~123行,通过userId
删除用户,如下图所示:
跟踪一下删除用户逻辑流程。
①、通过上述代码,发现UserController
从前端接收userId
参数,调用userService.deleteUser(userId)
进行删除,此处无任何权限关联。
②、通过userService
找到userServiceImpl
实现类,位于src/main/java/codermy/myspringsecurity/admin/service/impl/UserServiceImpl
。从中找到deleteUser()
方法,如下图所示:
③、从中可以看到,该方法首先使用了checkUserAllowed()
方法根据userId
校验用户是否允许操作。然后分别调用了roleUserDao.deleteRoleUserByUserId(userId);
,userJobDao.deleteUserJobByUserId(userId);
,userDao.deleteUserById(userId);
通过userId
删除用户,并且通过用户ID删除用户和岗位关联。按住CTRL
键左击deleteUserxxx
调用的方法,可以跳转到DAO层文件。如下图所示:
跟着删除用户整体流程逻辑走下来,发现userId是仅从用户侧获取的,没有从session中获取的,并且没有将userId与所删除的数据做身份关联。
简单来说,通过流程走下来发现代码只根据userId
进行删除账户操作。任意用户都可以调用该接口进行删除其他用户,从而导致越权漏洞的出现。
并且用户ID值极易进行遍历,从而进行批量任意用户删除。
3
渗透测试漏洞验证
“在代码审计阶段发现漏洞后,
通过渗透测试进一步验证。”
3.1、SQL注入漏洞挖掘
-
什么是SQL注入漏洞
SQL注入主要发生在与数据库交互的地方,前端将数据传入后端后进行了数据库相关操作。如果我们传入的数据没有有被过滤或转义,拼接到查询SQL中,被当成SQL语句执行。那么我们可以构造攻击语句,进而可以攻击操作数据库。
SQL几种注入模式:
-
基于布尔的盲注,即可以根据返回页面判断条件真假的注入;
-
基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中;
-
基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断;
-
联合查询注入,可以使用 union 的情况下的注入;
-
堆查询注入,可以同时执行多条语句的执行时的注入
对于不同数据库,攻击语句不同。常见的数据库有Mysql
,Oracle
,SQL Server
等等。
SQL注入必练靶场:
SQLi-labs:
https://github.com/Audi-1/sqli-labs
-
SQL注入漏洞挖掘
SQL注入漏洞挖掘第一步是找与数据库交互的地方,也所谓的注入点
。
手工挖掘,初步判断:
针对每个与数据库交互的点,使用下述攻击POC,观察响应,进行初步判断。
‘
’ and '1'='1
' or '1'='1
’ and '1'='2
' or '1'='2
' and\u0020'1'='1
' and\u0020'%'='
' or\u0020'1'='1
' and\u0020'1'='2
' or\u0020length(user)=3 or\u0020'1'='1
' or\u0020length(user)=2 or\u0020'1'='1
更多探测语句,可收集相关字典。
自动化挖掘:
使用SQL注入神器SQLmap
,官方地址:https://sqlmap.org/
SQLMap 是一个开源的渗透测试工具,可以用来进行自动化检测,利用 SQL 注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。
使用SQLmap对每个与数据交互的点都进行SQL注入探测。
经过一番探测,发现系统管理 -> 用户管理 -> 查询
和系统管理 -> 字典管理 -> 查询
两处存在SQL注入。以其中一个为例进行演示。
①、访问系统管理 -> 用户管理 -> 查询
功能,输入关键字,点击查询,此时使用Burp抓取数据包,如下图所示:
②、在桌面新建文本文件r.txt
,并将抓取到的数据包复制进去,如下图所示:
③、开启命令行,进入sqlmap文件夹,输入命令py -3 sqlmap.py -r xxxxx
,回车进行sql注入漏洞探测,如果需要输入选项,敲击回车默认即可,如下图所示:
④、等待一段一时间,经过探测,发现nickName
参数存在SQL注入漏洞,如下图所示:
⑤、使用sqlmap获取当前数据库,命令py -3 sqlmap.py -r 绝对路径\r.txt --dbs
,如下图所示:
⑥、sqlmap获取数据库表信息,命令py -3 sqlmap.py -r xxx\r.txt -D information_schema --tables
,如下图所示:
3.8、越权漏洞挖掘
-
什么是越权漏洞
越权,顾名思义,是超越权限或权力范围的意思。越权漏洞也就是超越该账户权限操作其他账号。比如:越权获取敏感信息、越权删除他人订单、越权添加管理账号等等。
越权漏洞主要形成原因为在对数据进行增删改查时没有进行权限的判定
,或验证权限不充分,从而导致越权漏洞的出现。
水平越权:同权限下账号数据的越权读取/操作。
垂直越权:不同权限下账号数据的越权读取/操作。比如:普通用户越权操作/读取了管理员数据。
挖掘越权漏洞前置条件最好是准备两个账号
。对于水平越权准备两个同权限
账号。对于垂直越权准备两个不同权限
账号。
除非是自己搭建环境或者是授权的渗透测试项目,否则不建议通过遍历ID方式来测试越权漏洞。
-
越权漏洞手工挖掘
手工漏洞挖掘漏洞比较耗时耗力,但优点在于可以对所有流程有更深入的了解,可以发现更深层问题。
经过深入的手工挖掘,发现系统中存在越权漏洞。详细步骤如下。
①、登录admin
账号,访问系统管理 -> 用户管理
,点击新增
,添加越权测试用的账号,如下图所示:
②、点击提交后,退出admin账号,登录yuequan
账号,初始密码为123456
,访问系统管理 -> 用户管理
,随便添加个账号,对比admin
和yuequan
两个账号数据,如下图所示:
③、通过访问两个不同权限账号下的用户管理,观察到两个账号的用户数据不同。admin
账号下的用户管理包括了所有的用户信息,yuequan
账号下仅能看到自己新添加的yuequan1
的账号。我们进一步验证越权漏洞。登录admin
账号,访问用户管理功能,选择一个不存在于yuequan
账号下的账号数据。通过上图对比,选择test4
为例。
④、此时浏览器打开代理连接到Burp,Burp下的Proxy打开Intercept on
,然后点击删除test4
,此时Burp抓取到删除的数据包,记录userId
参数,将数据包发送到Repeater
模块,最后将数据包Drop
掉,我们不做删除操作。如下图所示:
⑤、退出admin账号,登录yuequan账号后,访问用户管理功能,点击删除某个账号,此时同样开始Burp拦截数据包,发送到Repeater模块
,并将userId
替换成6
后,点击Send
发送数据包,提示删除用户成功
,如下图所示:
⑥、最后登录admin账号,进一步验证test4
账号被越权删除,如下图所示:
上述操作,我们可以采用两种方式来进行验证。一是通过替换cookie,二是通过修改userid,这两者的意义是一样的。
-
越权漏洞自动化挖掘
工具推荐BurpSuite插件Autorize
。官方地址:https://github.com/portswigger/autorize
,可通过BurpSuite的Extender-BApp Store
安装。
安装Autorize
之前需要先安装Jython
环境,下载地址:https://www.jython.org/download.html
。安装教程可自行搜索。
①、登录yuequan账号
,记录cookie值,并将该值导入到Autorize
模块,规则配置如下图所示:
②、然后登录到admin
账号,对各个功能进行点击操作,即可看到测试结果。有三个测试结果Bypassed - 红色标记:不存在
,Enforced - 绿色标记:存在
,Is enforced??? - 黄色标记:不确定是否存在越权漏洞,需要手工验证
。扫描结果如下图所示:
注意:上述仅为演示,过滤规则不是最优,可根据实际项目场景,进行构造。
举一反三,后台系统一些功能点还存在相关问题,比如角色管理
,部门管理
等等。思考一下问题会出在哪里,再配合使用自动化工具,赶紧动手试试吧。
另外,我们通过挖掘越权漏洞时发现,低权限在用户管理处添加的账号,admin账号也能看到。那么配合XSS漏洞,是不是能做些什么骚操作呢?
4
完整目录
“本套课程完整目录如下,
如果上面内容学的不过瘾,
大家可以从下面加入炼石计划”
5
内卷开始
“看的不过瘾?可以试试加入炼石计划
简单说说炼石计划,
每一套练习环境都是有针对性的精挑细选,
不同的系统包含不同类型的漏洞。
并且每一套环境我都希望大家真心动手操作,
不要以为仅仅看了文章就觉得自己学会了。
所以,我会先分享漏洞环境,让大家先行操作练习
然后我再分享课程文章,供大家学习操作
如果你喜欢这种模式,不妨赶紧来学习。”
关于炼石计划详细介绍,大家可以点击下面这篇文章
JavaWeb代码审计实战开源系统学习心得,赶紧进来看!!!
或者扫描下方二维码直接加入学习~
加入后,记得看置顶文章哦~
玄说安全知识星球成员免费学习本系列课程。
—END—
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论