PHP 网站搭建和 SQLMAP 工具使用

实验目的

  1. 了解搭建网站的一般流程,学习使用 PHPStudy 来搭建网站。
  2. 了解 SQLMap 工具的原理和应用,利用 sqlmap 寻找数据库的注入漏洞。

实验内容

  1. 使用 PhpStudy 和金戈企业建站框架搭建网站服务。
  2. 使用 sqlmap 工具扫描该网站,寻找 sql 漏洞利用点。

实验环境

实验要求

  1. 将服务器的端口更换为 8080,域名修改为 www.test.com。网站搭建成功后,通过在浏览器中访问 www.test.com访问这个网站。
  2. 通过端口扫描工具扫描整个网站所开设的端口。看网站是否在 8080 端口提供服务。

根据实验指导书进行操作

实验步骤和结果

网站准备

  1. 安装 PHPStudy

    • 点击桌面上的 phpstudysetup 安装包,并为其指定一个合适的解压位置。等待其安装完毕
  2. 配置 PHPStudy

    • 设置好网站目录、端口,然后点击 “应用”。Apache 会重启
  3. 配置域名

    1. 从主界面中进入站点域名管理界面。
    2. 配置好域名后,点击 “新增”。
    3. 修改 hosts 文件,将刚刚起好的域名解析到本地
    4. 测试访问效果
  4. 将网站切换到 8080 端口上

    1. 打开域名管理界面,把域名改为要求的 www.test.com,端口设为 8080,然后点击修改。

    2. 相应的 host 中的域名要变一下。

    3. Apache 中的 httpd 端口也要修改。

    4. 此时再直接输入 www.test.com 就进不去了,得加上端口号才可以访问那个网站。

    5. 此时进行端口扫描,会发现网站的 8080 端口是开启的。

      192.168.235.138 是 web 服务器的 ip 地址

SQLMap 初使用

Sqlmap 是一款由 Python 语言开发的自动化 SQL 注入工具,其主要功能是扫描、发现并利用给定的 URL 的 SQL 注入漏洞。

本次我们使用 Sqlmap 工具寻找前一步搭建好的网站系统的 SQL 注入漏洞。

  1. 首先找到一处注入点 ry.php?ry_id=?。用引号测试下 GET 参数的情况。发现返回了空白页面而没有报错。推断可能存在注入漏洞

  2. 上工具,首先测试该链接有无注入漏洞,用 -u url 命令

    sqlmap -u <url>
  3. SQLmap 工具输出表明 ry.php 页面存在 GET 参数 ry_id 注入漏洞,基于报错的注入,基于时间的盲注,联合注入方法均有效。还探测到了服务器的后端使用了 php5.4.45,Apache2.4.23,使用 MySQL 数据库版本高于 4.1,操作系统为 Windows。

  4. 接下来使用 –dbs 选项来查找在该服务器上运行的所有数据库的名称列表。相当于执行了一次 show databases 的命令。

    sqlmap -u <url> --dbs
    • 找到了 5 个数据库。对照服务器上的数据库列表,发现确实有这些数据库。
  5. 接下来,使用 --current-user 选项查找当前数据库的用户。

    sqlmap -u <url> --current-user
    • root@localhost,权限相当大,可以想象这个数据库中拥有相当重要的数据。
  6. --tables 选项查看 jnng 数据库中的所有表。相当于执行了一次 show tables 命令。-D 选项确定数据库名称。

    sqlmap -u <url> -D jnng --tables
    • root 表应该有比较有趣的东西。一会可以看看。
  7. --columns 选项列出表的字段。-T 确定表名。

    sqlmap -u <url> -D jnng -T root --columns 
    • 发现了疑似用户名和密码的字段 root_nameroot_pass,接下来我们要拿到这几个字段。
  8. 使用–dump 选项导出字段。-C 选项确定要导出的字段名。SQLmap 还会自动发现密码 hash 字段并自动使用内建的字典进行破解。

    sqlmap -u <url> -D jnng -T root -C root_id,root_name,root_pass --dump
  9. 使用密码登录后台 www.test.com/isadmin/login.php,发现可以登录,证明前一步从数据库取得的数据是正确的。

    后台网页显示有问题,但是没有报密码错误,证明可以登上

  10. 看看别的地方

附录(可选)

其他难点和坑点

  1. phpstudy 包含了 php5,6 和 7 三个版本,每个版本需要安装不同的 VC 运行库
    • php5.3、5.4 和 apache 都是用 vc9 编译,电脑必须安装 vc9 运行库才能运行。
    • php5.5、5.6 是 vc11 编译,如用 php5.5、5.6 必须安装 vc11 运行库。
    • php7.0、7.1 是 vc14 编译,如用 php7.0、7.1 及以上版本必须安装 vc14 运行库。
  2. 利用 phpstudy 所建的网站文件夹及路径不能带有任何空格。
  3. 想要用别的虚拟机访问 windows server 服务器,需要在 server 端将防火墙配置好,具体是开启 80 端口、开启 ICMPv4-in,此时能 ping 通就差不多可以了。
  4. 这个网站还有 XSS 漏洞

怎么修复这个注入点

查看发生问题的 ry.php 源码。发现这样一段

ry.php linenos:false
1
2
$ry_id = $_GET['ry_id'];
$ry = root_alli(qyry,ry_id,$ry_id);

root_alli 函数中直接进行了条件拼接

ry.php linenos:false
1
$result = $conn->query('SELECT * FROM '.$tab.' where '.$zn.'  = '.$in);

GET 的 ry_id 未经过滤直接传入 root_alli,造成了 SQL 语句的拼接。

解决方案:先过滤(my_yz() 调用了 addslashes—— 常用的过滤操作)

1
2
3
4
5
$ry_id = my_yz($ry_id);

if (!is_numeric($ry_id)){
// error exit;
}