AKun Wallpaper 代码审计实战分析1

2023-10-17 09:59

本文主要是介绍AKun Wallpaper 代码审计实战分析1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

萌新博主前一段时间一不小心发现了一个漏洞并获取了一个CVE编号,高兴了好一阵子。于是本萌新就想学习一下代码审计,挖一点CVE来玩一玩。最终选择了《代码审计——企业级Web代码安全架构》作为学习资料。学习一阵子后准备进行实战分析,于是就想起了自己多年前写的一个小破站,代码下载地址:https://gitee.com/rpsate/akun-wallpaper 。该网站功能较少,采用函数式编程,代码嵌套少,漏洞较多,十分适合代码审计入门。该网站的功能模块如下图所示:

在这里插入图片描述

网站部署

首先在mysql中创建一个名为 searchimages的数据库。

mysql -uroot -proot #此处实例账号和密码都为root
create database searchimages #创建数据库

然后将网站根目录中的 searchimages.sql导入该数据库中,网站后台的默认账号和密码是admin:admin

use searchimages
source D:\phpstudy\www\searchimages.sql #导入数据库

然后修改文件/configs/config.php中数据库账号和密码即可。

在这里插入图片描述

XSS漏洞

漏洞分析

首先通过审计工具fortify自动审计,这个工具可以扫描出可能存在的漏洞代码,然后再进行人工分析。扫描后发现存在三十多个可能存在xss漏洞的代码。

在这里插入图片描述

如下图中第一个xss漏洞在jquery.3.3.1.js中,这个文件是调用的js库,暂时不用管。我们看到 editAdmi.php的29行,这里直接将 $username$email变量输出来。我们看到窗口的左下方有数据流走向分析,点击中间 Diagram按钮后会出现数据流的走向的图示。这可以直观的表示出数据从哪里来,中间经过了哪里,这样可以使我们更加快速的分析出代码中是否存在漏洞。

在这里插入图片描述

通过分析发现 $username$email直接从数据库中取出,未经处理直接输出在了页面上。这极有可能存在一个xss漏洞,接下来可以通过利用该漏洞来确认该处是否存在漏洞。

在这里插入图片描述

漏洞复现

下面我们来复现一下这个xss漏洞。登陆网站后台,在添加管理员页面的邮箱栏填写 "/><script>alert(1)</script>//,账号和密码任意,然后点击添加管理员按钮。

在这里插入图片描述

点击刚刚添加账号后面的修改按钮就跳转到了 editAdmin.php页面,然后就发现成功的弹出了一个提示框,这说明该处存在一个漏洞。

在这里插入图片描述

在这里插入图片描述

修复漏洞

书中提供了两种解决建议,分别为:特殊字符HTML实体转码,标签事件属性黑名单。黑名单的绕过方式多种多样,防范难度非常高,我们这里就采用特殊字符实体转码的方式,当然最好同时采用两种方法。

特殊字符HTML实体转码主要有两个函数: htmlentities()htmlspecialchars(),两者都是将html特殊字符转码,其区别是htmlspecialchars()只格式化& ' " <> 这几个特殊符号,htmlentities()会转换除了空格之外的特殊字符。

要注意的是使用htmlentities()如果不指定编码,遇到中文则会乱码。

两者默认都不会转义单引号 ',需要设置第二个参数来转义单引号。

第2个参数取值有3种,分别如下:

  • ENT_COMPAT(默认值):只转换双引号。
  • ENT_QUOTES:两种引号都转换。
  • ENT_NOQUOTES:两种引号都不转换。

如果不转义单引号,在特殊的情况下是会存在xss漏洞的,所以我们可以自定义一个同时对特殊字符和单引号转义的函数。该网站的 /lib/common.func.php文件被所有网页包含,可以在该页面中定义全局函数。

function my_htmlspecialchars($str) {return htmlspecialchars($str, ENT_QUOTES);
}

然后在每个数据输出点调用该函数即可,如下图所示。

在这里插入图片描述

然后我们刷新editAdmin.php页面,看到没有再次弹出提示框,而是在邮件输入框正常显示了全部的js代码。我们可以采用同样的方法可以修复其他xss漏洞。

在这里插入图片描述

漏洞分析

接下来看到 editImage.php的32行, $imagePath也是从数据库中直接取出,并且未处理直接输出在页面上。我们以同样的方法复现该漏洞,但是没有成功!所以可能是该数据再写入数据库前已经处理了。

在这里插入图片描述

接下来我们分析一下 $imagePath是如何进入数据库的,通过该变量名称得知该数据即图片的地址。我们看到 douploadImages.php的72行,通过分析得出 putImage函数是将图片的名称和地址写入数据库中。而图片的地址是通过时间戳生成唯一id,然后通过md5加密得到,所以这个数据源不可能存在恶意数据。所以通过分析得到该处不存在xss漏洞。

在这里插入图片描述

接下来分析 editImages.php的36行,变量$imageName是图片的名字,我们刚刚看到这个数据在输入数据库的时候没有处理,所以该处存在xss漏洞,需要调用特殊字符HTML实体转码函数来处理该数据。我们可以用同样的方法修复其他xss漏洞。

在这里插入图片描述

这篇关于AKun Wallpaper 代码审计实战分析1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/224638

相关文章

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序