【反编译步骤记录】修复Uni-app依赖包uniapp-v8-release.aar中WXSQLiteOpenHelper数据库注入漏洞
业务场景
近期APP安全检查扫描出了一系列漏洞,由于部分漏洞存在于第三方jar或aar中,Uni-app线上打包无法解决,只能通过本地安卓离线打包的方式,反编译依赖包中的.class文件为.java文件,修改业务代码后再重新编译为.class文件,最后替换原来的.class文件,重新打包即可
技术要求
Java
开发工具
Android Studio
版本参考
- Android Studio:2021.3.1
- Java:1.8
- Gradle:6.5
- Android-SDK@3.95.81954_20231030
以下是具体的操作流程
漏洞描述
由此可知,是由于Uni-app提供的离线aar依赖
uniapp-v8-release\jars\classes.jar!\com\taobao\weex\appfram\storage\WXSQLiteOpenHelper.class
中createTableIfNotExists
方法的问题。虽然Android Studio提供的反编译视图让我们快速定位到了漏洞位置,可我们却不能编辑文件(File is read-only),因此我们需要反编译才行
首先,使用Android Studio创建一个空项目
切换至Project视图
在
app/src/main/java
下创建与uniapp-v8-release.aar中WXSQLiteOpenHelper.class文件所在包中相同路径的包名,例如:WXSQLiteOpenHelper.class在com.taobao.weex.appfram.storeage包下,则app/src/main/java下也需要创建com.taobao.weex.appfram.storeage
的包名
创建相同包名
com.taobao.weex.appfram.storeage
在com.taobao.weex.appfram.storeage下创建WXSQLiteOpenHelper.class同名的java文件
WXSQLiteOpenHelper.java
将uniapp-v8-release.aar中WXSQLiteOpenHelper.class中的内容
复制
到WXSQLiteOpenHelper.java中,找到漏洞所在的createTableIfNotExists
方法
修改sql查询语句,这里简单写的样例代码,具体根据实际业务需求写就行
private void createTableIfNotExists(@NonNull SQLiteDatabase db) {
Cursor cursor = null;
try {
String sql = "SELECT DISTINCT tbl_name FROM sqlite_master WHERE tbl_name = ?";
String[] selectionArgs = new String[]{"default_wx_storage"};
cursor = db.rawQuery(sql, selectionArgs);
if (cursor == null || cursor.getCount() <= 0) {
db.execSQL("CREATE TABLE IF NOT EXISTS default_wx_storage (key TEXT PRIMARY KEY,value TEXT NOT NULL,timestamp TEXT NOT NULL,persistent INTEGER DEFAULT 0)");
return;
}
} catch (Exception var7) {
var7.printStackTrace();
return;
} finally {
if (cursor != null) {
cursor.close();
}
}
}
至此,代码改好了,会发现有些地方
爆红
,没关系,这是因为新项目中没有导入依赖,导入一下uniapp-v8-release.aar
即可
将原来的uniapp-v8-release.aar复制到
app/libs
目录下
在
app/build.gradle
中加入以下代码,然后点击右上角的Sync Now
同步一下
implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])
控制台显示
BUILD SUCCESSFUL in 1s
即为同步成功,这时候会发现WXSQLiteOpenHelper.java中的代码就不爆红了
接下来,我们需要
重新打包
将WXSQLiteOpenHelper.java编译生成一个新的WXSQLiteOpenHelper.class
文件,在右上角gradle中先clean一下,然后再build
build过程中会报
Type com.taobao.weex.appfram.storage.WXSQLiteOpenHelper is defined multiple times...
命名冲突之类的错,没关系不用管,因为WXSQLiteOpenHelper.class已经生成了
找到
app\build\intermediates\javac\debug\classes\com\taobao\weex\appfram\storage
下的WXSQLiteOpenHelper.class
文件,会发现build后的代码是我们新修改后的内容,则代表编译成功!
最后一步就是将WXSQLiteOpenHelper.class文件
粘贴替换
到原有项目
的uniapp-v8-release.aar\classes.jar\com\taobao\weex\appfram\storage中了,我这边是用的WinRAR
打开替换的
替换后,打开原项目,会发现
External Library
中WXSQLiteOpenHelper.class
依旧是老代码,gradle并未更新依赖
将原项目
simpleDemo/build.gradle
中dependencies
中的implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])
这行代码注释
一下,点击右上角的Sync Now
,再将这行代码放开
,再Sync Now
一下
再打开
External Library中WXSQLiteOpenHelper.class
文件,代码更新成功!搞定!!
在执行某个步骤时也许会出现一些意外状况导致报错,不要慌,这在开发过程中是很正常的,善用搜索功能,汲取他人经验,咱也能行!!