# 一、概要 ## SQLancer SQLancer是一种自动测试数据库管理系统(DBMS)的工具,用于发现其实现中的错误。也就是说,它在DBMS实现的代码中查找错误,而不是在用户编写的查询中查找错误。SQLancer已经在成熟且广为人知的DBMS中发现了数百个bug。 ## Manuel Rigger Manuel Rigger 是新加坡国立大学计算机学院计算学部的一位助理教授,领导着 TEST 实验室,该实验室隶属于编程语言与软件工程组。‌ 在具体项目上,他主导开发了 ‌SQLancer‌ 工具,这是一个用于自动测试数据库管理系统的框架。通过该工具,他的团队已发现并报告了数百个关键数据库系统中的独特漏洞,该工具在学术界和工业界均有广泛应用。‌ Manuel Rigger的主页见参考[2]。 模糊测试相关介绍见参考[4],[5]。 # 二、环境 - OS:CentOS 7.6 - SQLancer版本:v2.0.0 - PostgreSQL版本:v12(v12以上版本支持有缺陷) PostgreSQL v12以上版本测试,报告以下错误: ``` ERROR: character number must be positive ``` ``` ERROR: cannot specify storage parameters for a partitioned table ``` ``` ERROR: partitioned tables cannot be unlogged ``` # 三、编译安装 ## 准备编译环境 要求: - maven >= 3.2.5 - JDK >= 11 JDK可以直接安装openjdk: ``` yum install java-11-openjdk ``` 配置PATH: ``` export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64/ export PATH=$JAVA_HOME/bin:$PATH ``` CentOS 7.6默认源安装的maven版本过低,不满足要求,可以从maven官网(见参考[3])下载大于3.2.5版或最新版。 ![image](../../../../../ff_internal_upload/img/2025/image-20251224094753480.png) 下载后,解压缩,放到可以访问的路径,然后将路径加到PATH中即可,例如: ``` export PATH=/opt/apache-maven-3.9.12/bin/:$PATH ``` 验证mvn和JDK配置是否正确: ```bash $ mvn --version Apache Maven 3.9.12 (848fbb4bf2d427b72bdb2471c22fced7ebd9a7a1) Maven home: /opt/apache-maven-3.9.12 Java version: 11.0.23, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 Default locale: zh_CN, platform encoding: UTF-8 OS name: "linux", version: "3.10.0-957.el7.x86_64", arch: "amd64", family: "unix" ``` ## 安装PostgreSQL 请自行安装`PostgreSQL 12`,过程略。 本文示例`PostgreSQL 12`从源码自行编译安装,端口为`7404`,用户名`yz`。 注意:需要为`PostgreSQL`创建一个名为“test”的`database`,否则,后续执行`sqlancer`时将报以下错误: ``` SQLancer failed creating a test database, indicating that SQLancer might have failed connecting to the DBMS. In order to change the username, password, host and port, you can use the --username, --password, --host and --port options. org.postgresql.util.PSQLException: FATAL: database "test" does not exist …… ``` ## 获取SQLancer源码 ```bash git clone https://github.com/sqlancer/sqlancer cd sqlancer # 使用稳定分支: git checkout v2.0.0 ``` ## 编译 ``` mvn package -DskipTests ``` 编译后,jar包及其依赖在target目录下,目录内容如下: ```bash $ ll target/ drwxrwxr-x 2 yz yz 28 12月 23 09:13 antrun drwxrwxr-x 4 yz yz 38 12月 23 09:11 classes drwxrwxr-x 3 yz yz 25 12月 23 09:11 generated-sources drwxrwxr-x 3 yz yz 30 12月 23 09:11 generated-test-sources drwxrwxr-x 2 yz yz 16384 12月 23 09:27 lib drwxrwxr-x 2 yz yz 28 12月 23 09:13 maven-archiver drwxrwxr-x 3 yz yz 35 12月 23 09:11 maven-status -rw-rw-r-- 1 yz yz 1810281 12月 23 09:27 sqlancer-2.0.0.jar drwxrwxr-x 4 yz yz 38 12月 23 09:11 test-classes ``` 需要说明的是,按照`sqlancer`默认配置,mvn编译出来的`sqlancer-2.0.0.jar`包依赖于lib目录,不能单独运行,如果希望将lib目录下的依赖包也打包到一个jar内,则需要修改`pom.xml`(详见参考[6],[7]),修改内容如下: ```diff $ git diff diff --git a/pom.xml b/pom.xml index b57ed010..51e9bd70 100644 --- a/pom.xml +++ b/pom.xml @@ -129,20 +129,29 @@ + org.apache.maven.plugins - maven-jar-plugin - 3.2.1 - - - - true - lib/ - sqlancer.Main - - - + maven-shade-plugin + 3.2.0 + + + package + + shade + + + false + + + sqlancer.Main + + + + + + org.codehaus.mojo xml-maven-plugin ``` # 四、测试 ```bash # jar在sqlancer/target目录下 cd target # 直接执行以下命令,将返回命令参数说明: java -jar sqlancer-2.0.0.jar --help ``` 以下是执行PostgreSQL测试示例: ```bash $ java -jar sqlancer-2.0.0.jar --port 7404 --username yz --num-queries 10 postgres [2025/12/24 17:05:44] Executed 0 queries (0 queries/s; 0.00/s dbs, successful statements: 0%). Threads shut down: 0. [2025/12/24 17:05:49] Executed 0 queries (0 queries/s; 0.00/s dbs, successful statements: 71%). Threads shut down: 0. [2025/12/24 17:05:54] Executed 0 queries (0 queries/s; 0.00/s dbs, successful statements: 76%). Threads shut down: 0. [2025/12/24 17:05:59] Executed 0 queries (0 queries/s; 0.00/s dbs, successful statements: 78%). Threads shut down: 0. …… ``` # 五、参考 1. [sqlancer](https://github.com/sqlancer/sqlancer) 2. [Manuel Rigger](https://www.manuelrigger.at/) 3. [Downloading Apache Maven and Maven Daemon](https://maven.apache.org/download.cgi) 4. [数据库进阶测试三部曲 - 从 PQS 到 NoREC 再到 TLP](https://zhuanlan.zhihu.com/p/144725800) 5. [How SQLite Is Tested](https://www.sqlite.org/testing.html) 6. [一段实用的maven pom:将项目依赖打包到文件夹或打入jar中](https://blog.csdn.net/aitangyong/article/details/52526876) 7. [How to Create an Executable JAR with Maven](https://www.baeldung.com/executable-jar-with-maven)