从 SQL 注入到 Shell

整个实验根据在线教程的流程走就能顺利进行√

这是本人于 2018 年《网络安全》课程中做过的实验,整理一下搬到本博客。

环境配置

虚拟机1(受害者/服务器) Debian SQL - Host-only 网卡

虚拟机2(攻击者) Kali - Host-only 网卡

准备一台 Kali 虚拟机用作攻击者,Kali 自带的攻击工具足够丰富

下载 ISO 镜像,实际上是一个 Debian 服务器,然后用该镜像新建虚拟机

  • 安装完毕后长这样,不用疑惑,就是一个控制台↓
  • clear 命令清了个屏

端口/系统信息采集

查看网卡信息 ifconfig

扫描网段 netdiscover -r 192.168.1.0/24

获取服务器开放端口及系统信息

尝试远程连接

  • 这里连接 80 端口的时候忘记发送请求

使用 telnetnc 进行连接

  • 获得的结果相同√

再次进行尝试

  • 端口协议不匹配
    • telnet 明文传输数据
    • ssh 加密

使用 openssl 进行连接

  • 似乎是版本不匹配

网站信息采集

访问目标网址

对网页源码进行分析,这里令人感兴趣的是各个链接,显然后台使用的是 php

尝试访问链接

猜测其他图片,发现错误信息返回的还不少

暴力检测 Web 服务器上的目录和页面(使用 wfuzz)

1
2
3
4
5
wfuzz -c -z file,wordlist/general/big.txt --hc 404 http://192.168.1.101/FUZZ
# -c 高亮
# -z file,wordlist/general/big.txt 爆破字典
# --hc 404 忽略404响应
# http://192.168.1.101/FUZZ 用字典值替换FUZZ

SQL注入

测试

对 cat.php 进行 SQL 注入测试,显示了所有图片,说明存在漏洞

使用 UNION ,枚举字段数(列数)

使用 ORDER BY ,枚举字段数(列数)

信息获取

尝试后发现只有在 UNION 的第二列才能显示信息

补充:为什么只有第二个可以显示呢?

  • 其实不然,第三个也可以显示,只不过得从页面源码里看

直接上服务器找源码查看,可以知道 picture 表中有 4 个字段,但是网页只显示了其中的 2 个, id 只作为查询的关键字

  • /var/www/ 目录下翻代码

cat.php

picture.php

具体的显示结果

数据库版本信息

当前用户信息

当前使用的数据库信息

MySQL5 开始包含数据库、表、列的元信息 (meta information)

所有的表名称

所有的列名称

表和对应的列名称

查找是否有密码字段

users 表信息

登录后台

在线破解 MD5

使用 john 破解

  • 查看支持的模式,准备必要的密码文件

找一个密码字典尝试破解

未果,尝试使用 Kali 内置的其他字典

  • 截图前已爆破成功,这里就直接进行展示

获取用户名、密码后,尝试登录后台

  • 这里的 new.php 可以用来上传 Webshell

Webshell

构建 Webshell 文件,执行 GET 请求中 cmd 参数的值

尝试上传 php 文件

上传失败,说明该网站禁止了直接上传php

修改文件名,尝试绕过检测

上传成功,点击 Home 查看最新图片

测试 Webshell

系统用户信息

系统版本信息

列出目录下的文件

php 信息

php 配置文件中特定的设置

查看网卡信息

Google 搜索

Bingo

sqlmap

打开 Kali 内置的 sqlmap

根据帮助信息尝试使用

  • 找一下 sqlmap 在哪里

输出结果,包含服务器信息以及 SQL 注入点

使用 Enumeration 中的选项进行信息获取

  • 我就是一看有 all 选项就用 -a 的人,输出特别多多多多多
  • 请大家按需选择参数选项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
        ___
__H__
___ ___[.]_____ ___ ___ {1.2.9#stable}
|_ -| . ["] | .'| . |
|___|_ [(]_|_|_|__,| _|
|_|V |_| http://sqlmap.org

Usage: python sqlmap [options]

Options:
-h, --help Show basic help message and exit
-hh Show advanced help message and exit
--version Show program's version number and exit
-v VERBOSE Verbosity level: 0-6 (default 1)

Target:
At least one of these options has to be provided to define the
target(s)

-u URL, --url=URL Target URL (e.g. "http://www.site.com/vuln.php?id=1")
-g GOOGLEDORK Process Google dork results as target URLs

Request:
These options can be used to specify how to connect to the target URL

--data=DATA Data string to be sent through POST
--cookie=COOKIE HTTP Cookie header value
--random-agent Use randomly selected HTTP User-Agent header value
--proxy=PROXY Use a proxy to connect to the target URL
--tor Use Tor anonymity network
--check-tor Check to see if Tor is used properly

Injection:
These options can be used to specify which parameters to test for,
provide custom injection payloads and optional tampering scripts

-p TESTPARAMETER Testable parameter(s)
--dbms=DBMS Force back-end DBMS to provided value

Detection:
These options can be used to customize the detection phase

--level=LEVEL Level of tests to perform (1-5, default 1)
--risk=RISK Risk of tests to perform (1-3, default 1)

Techniques:
These options can be used to tweak testing of specific SQL injection
techniques

--technique=TECH SQL injection techniques to use (default "BEUSTQ")

Enumeration:
These options can be used to enumerate the back-end database
management system information, structure and data contained in the
tables. Moreover you can run your own SQL statements

-a, --all Retrieve everything
-b, --banner Retrieve DBMS banner
--current-user Retrieve DBMS current user
--current-db Retrieve DBMS current database
--passwords Enumerate DBMS users password hashes
--tables Enumerate DBMS database tables
--columns Enumerate DBMS database table columns
--schema Enumerate DBMS schema
--dump Dump DBMS database table entries
--dump-all Dump all DBMS databases tables entries
-D DB DBMS database to enumerate
-T TBL DBMS database table(s) to enumerate
-C COL DBMS database table column(s) to enumerate

Operating system access:
These options can be used to access the back-end database management
system underlying operating system

--os-shell Prompt for an interactive operating system shell
--os-pwn Prompt for an OOB shell, Meterpreter or VNC

General:
These options can be used to set some general working parameters

--batch Never ask for user input, use the default behavior
--flush-session Flush session files for current target

Miscellaneous:
--sqlmap-shell Prompt for an interactive sqlmap shell
--wizard Simple wizard interface for beginner users

[!] to see full list of options run with '-hh'

虽然用 -a 参数跑了好一会儿,但是顺手就爆破了一下密码,而且收获非常丰厚

  • 在当前权限下,爬取所有数据表(包含字段设定,各个表项)
  • 检测到哈希字段,提供爆破

查看表、表项

  • 检测到疑似密码的哈希值就会尝试爆破
  • --batch 表示使用默认配置,不需要用户输入选择

尝试使用 --os-shell 获取 Webshell

  • 因为从 cat.php 这里访问到的路径是没有写入权限的,需要到 admin/uploads 目录下才能写入/上传文件,因此这里获取 Webshell 失败

weevely

简单体验了下 weevely

  • 使用 weevely 生成后门文件
    • 这里的 P4ssw0rd 是设置用于之后使用 weevely 通过后门进入服务器的密码,也可以设置为其他的
  • 将后门文件上传至服务器
  • 通过后门进入服务器后台

上传文件所在的路径,需要通过这个路径来使用后门进入服务器

用图片试一下

  • 没想到原来的图片上传还暗含文件名长度的限制条件

测试无果

  • 虽然图片中内嵌了后门,但是无法使用
  • google 得知是服务器没有开启 .htaccess 模块支持(未验证)

使用模块进行反向 tcp 连接

  • nc 开启 23 端口的监听
  • 通过后门在服务器调用 weevely 自带的 :backdoor_reversetcp 模块

参阅