PHP 网站搭建和 SQLMAP 工具使用
实验目的
- 了解搭建网站的一般流程,学习使用 PHPStudy 来搭建网站。
- 了解 SQLMap 工具的原理和应用,利用 sqlmap 寻找数据库的注入漏洞。
实验内容
- 使用 PhpStudy 和金戈企业建站框架搭建网站服务。
- 使用 sqlmap 工具扫描该网站,寻找 sql 漏洞利用点。
实验环境
实验要求
- 将服务器的端口更换为 8080,域名修改为
www.test.com。网站搭建成功后,通过在浏览器中访问www.test.com访问这个网站。 - 通过端口扫描工具扫描整个网站所开设的端口。看网站是否在 8080 端口提供服务。
根据实验指导书进行操作
实验步骤和结果
网站准备
-
安装 PHPStudy
- 点击桌面上的 phpstudysetup 安装包,并为其指定一个合适的解压位置。等待其安装完毕
![]()
![]()
![]()
-
配置 PHPStudy
- 设置好网站目录、端口,然后点击 “应用”。Apache 会重启
![设置端口]()
![设置网站目录]()
![Apache部分设置全览]()
![]()
- 设置好网站目录、端口,然后点击 “应用”。Apache 会重启
-
配置域名
- 从主界面中进入站点域名管理界面。
![域名管理界面]()
- 配置好域名后,点击 “新增”。
![左侧“站点”栏中出现了新建的站点]()
- 修改 hosts 文件,将刚刚起好的域名解析到本地
![添加一行127.0.0.1 <域名>]()
- 测试访问效果
![]()
- 从主界面中进入站点域名管理界面。
-
将网站切换到 8080 端口上
-
打开域名管理界面,把域名改为要求的
www.test.com,端口设为8080,然后点击修改。
![要修改的项目]()
-
相应的 host 中的域名要变一下。
![添加或修改成127.0.0.1 www.test.com]()
-
Apache 中的 httpd 端口也要修改。
![改为8080]()
-
此时再直接输入
www.test.com就进不去了,得加上端口号才可以访问那个网站。![]()
![]()
-
此时进行端口扫描,会发现网站的 8080 端口是开启的。
192.168.235.138 是 web 服务器的 ip 地址
-
SQLMap 初使用
Sqlmap 是一款由 Python 语言开发的自动化 SQL 注入工具,其主要功能是扫描、发现并利用给定的 URL 的 SQL 注入漏洞。
本次我们使用 Sqlmap 工具寻找前一步搭建好的网站系统的 SQL 注入漏洞。
-
首先找到一处注入点
ry.php?ry_id=?。用引号测试下 GET 参数的情况。发现返回了空白页面而没有报错。推断可能存在注入漏洞![]()
![]()
-
上工具,首先测试该链接有无注入漏洞,用
-u url命令sqlmap -u <url>
![]()
![]()
![]()
-
SQLmap 工具输出表明
ry.php页面存在 GET 参数ry_id注入漏洞,基于报错的注入,基于时间的盲注,联合注入方法均有效。还探测到了服务器的后端使用了 php5.4.45,Apache2.4.23,使用 MySQL 数据库版本高于 4.1,操作系统为 Windows。
-
接下来使用
–dbs选项来查找在该服务器上运行的所有数据库的名称列表。相当于执行了一次show databases的命令。sqlmap -u <url> --dbs
- 找到了 5 个数据库。对照服务器上的数据库列表,发现确实有这些数据库。
![sqlmap跑出来的数据库列表]()
![本地工具截取出来的]()
-
接下来,使用
--current-user选项查找当前数据库的用户。sqlmap -u <url> --current-user
- 是
root@localhost,权限相当大,可以想象这个数据库中拥有相当重要的数据。![]()
- 是
-
用
--tables选项查看jnng数据库中的所有表。相当于执行了一次show tables命令。-D选项确定数据库名称。sqlmap -u <url> -D jnng --tables
- root 表应该有比较有趣的东西。一会可以看看。
-
用
--columns选项列出表的字段。-T确定表名。sqlmap -u <url> -D jnng -T root --columns
- 发现了疑似用户名和密码的字段
root_name和root_pass,接下来我们要拿到这几个字段。
- 发现了疑似用户名和密码的字段
-
使用–dump 选项导出字段。-C 选项确定要导出的字段名。SQLmap 还会自动发现密码 hash 字段并自动使用内建的字典进行破解。
sqlmap -u <url> -D jnng -T root -C root_id,root_name,root_pass --dump
![]()
![]()
-
使用密码登录后台
www.test.com/isadmin/login.php,发现可以登录,证明前一步从数据库取得的数据是正确的。后台网页显示有问题,但是没有报密码错误,证明可以登上
![]()
![]()
-
看看别的地方
![]()
![]()
![]()
![]()
附录(可选)
其他难点和坑点
- 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 运行库。
- 利用 phpstudy 所建的网站文件夹及路径不能带有任何空格。
- 想要用别的虚拟机访问 windows server 服务器,需要在 server 端将防火墙配置好,具体是开启 80 端口、开启 ICMPv4-in,此时能 ping 通就差不多可以了。
- 这个网站还有 XSS 漏洞
![]()
怎么修复这个注入点
查看发生问题的ry.php源码。发现这样一段
1 | $ry_id = $_GET['ry_id']; |
root_alli 函数中直接进行了条件拼接
1 | $result = $conn->query('SELECT * FROM '.$tab.' where '.$zn.' = '.$in); |
GET 的ry_id未经过滤直接传入root_alli,造成了 SQL 语句的拼接。
解决方案:先过滤(my_yz()调用了addslashes —— 常用的过滤操作)
1 | $ry_id = my_yz($ry_id); |
































