eNdonesia 8.4 的 Calendar 模块存在一个远程 SQL 注入漏洞,这是一个经典的安全漏洞案例。由于参数过滤不严,攻击者能够通过构造特殊输入绕过认证,直接窃取数据库中的敏感信息。本文将深入拆解该漏洞的利用脚本,剖析其具体实现原理。
漏洞利用脚本分析
该漏洞利用脚本采用 Perl 语言编写,其核心思路是通过发送 HTTP 请求,向目标站点植入精心构造的 SQL 注入载荷,随后从返回的页面中提取管理员账号与密码哈希值。
1. 注入点与载荷
脚本首先定义了两个关键的字符串:
$sql_vulnerable = "/mod.php?mod=calendar&op=list_events&loc_id=";
该路径即为漏洞触发点,其中参数loc_id未经过任何过滤直接被拼接至数据库查询语句中。攻击者通过控制该参数的值,即可注入恶意 SQL 代码。
接下来是注入载荷:
-999/**/union select/**/0x3a,0x3a,concat(aid,0x3a,pwd),0x3a,concat(name,0x3a,pwd)/**/from/**/authors/*where name pwd
仔细分析这个语句:
- 首先使用
-999使原始查询返回错误或空结果,为后续的UNION注入创造条件。 - 利用
/**/注释符替代空格,以此绕过某些简单的输入过滤机制。 - 核心操作是通过
UNION SELECT从authors表中提取aid(用户名)与pwd(MD5密码哈希),同时获取name(用户昵称)及其对应的哈希值。 - 末尾的
/*where name pwd*/用作语法补全,确保整个SQL语句能够顺利执行而不引发错误。
2. 执行过程
脚本运行时首先检查命令行参数,若未指定目标URL,则输出帮助信息并退出。帮助信息中提示用户正确用法:perl script.pl www.target.com,并特别强调不要添加https://前缀。
进入主循环后,脚本会把传入的目标地址与前面的漏洞路径和注入载荷拼接成一个完整的 URL,比如:
https://www.target.com/mod.php?mod=calendar&op=list_events&loc_id=-999/**/union select/**/0x3a,0x3a,concat(aid,0x3a,pwd),0x3a,concat(name,0x3a,pwd)/**/from/**/authors/*where name pwd
随后通过LWP::UserAgent模块发送GET请求。若请求成功,脚本将从返回的HTML内容中,利用正则表达式/\>([0-9,a-z]{2,13}):([0-9,a-f]{32})/g匹配形如用户名:MD5密码的字符串。
一旦匹配成功,就会输出类似以下格式的结果:
[target] www.target.com
[loginx] admin:5d41402abc4b2a76b9719d911017c592
此处输出的MD5值为管理员密码的哈希摘要。攻击者获取该哈希后,可尝试在线破解或进一步实施恶意操作。
若请求失败或返回内容中未匹配到符合条件的字符串,则脚本输出错误信息并退出。
总结
该脚本的逻辑非常简洁:定位存在SQL注入漏洞的CMS系统,利用UNION SELECT从authors表中窃取管理员的用户名与密码哈希。其关键技巧在于构造闭合原始SQL语句的语法,并借助CONCAT函数将多列数据合并为单一字段,便于后续提取。尽管代码量不大,但攻击思路清晰,是早期自动化利用的典型框架之一。
