AKun Wallpaper 代码审计实战分析5

2023-10-17 09:59

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

前言

前面四篇文章已经分析出了大部分的严重和高危漏洞,同时分析了这些漏洞的原理和修复方法。在这一篇文章中将继续分析fortify扫描出的漏洞。

AKun Wallpaper 代码审计实战分析1:https://blog.csdn.net/rpsate/article/details/122354690

AKun Wallpaper 代码审计实战分析2:https://blog.csdn.net/rpsate/article/details/122387998

AKun Wallpaper 代码审计实战分析3:https://blog.csdn.net/rpsate/article/details/122400520

AKun Wallpaper 代码审计实战分析4:https://blog.csdn.net/rpsate/article/details/122417856

漏洞分析1

在fortify的左边漏洞视图中看到了 Header Manipulation:Cookies,fortify的解释是: Including unvalidated data in Cookies can lead to HTTP Response header manipulation and enable cache-poisoning, cross-site scripting, cross-user defacement, page hijacking, cookie manipulation or open redirect.,翻译成中文是:在 Cookie 中包含未经验证的数据可能会导致 HTTP 响应标头操作并启用缓存中毒、跨站点脚本、跨用户破坏、页面劫持、cookie 操作或开放重定向。

在这里插入图片描述

判断此处是否存在漏洞就要分析数据的来源和去向,其数据来源是数据库 admin_root表中的id和用户名,其中户名在写入数据库时已经过滤了特殊字符,但是为了避免 CRLF注入,也需要吧 %0d%0a(\r\n)过滤。其中id是数据库自动生成的,不会存在危险数据。

CRLF注入:https://blog.csdn.net/rpsate/article/details/120601703

在这里插入图片描述

再看cookie数据的去向,通过全局搜索 $_COOKIE可以得知cookie的去向。通过全局搜索发现只有 admin/index.php的40行使用了cookie数据,而且也对js特殊字符过滤(前面已经修复),所以此处没有其他漏洞了。

在这里插入图片描述

漏洞分析2

不安全的随机数生成函数 mt_rand。这个函数每生成一个随机数就要更换一次随机数种子,不然可以通过已得到的随机数反推出随机数种子,然后再通过随机数种子推算出随机数。此处随机数的作用是获取随机的字体大小,验证码在图片种的随机的位置,随机的字体等等。这些随机数据给用户知道也无关紧要,最重要是的不能让用户推算出验证码。

随机数是根据随机数种子计算得到的,而且随机数与随机数种子是一一对应的关系。随机数生成函数:R=f(x),其中x就是随机数种子,R就是随机数。

再举一个通俗易懂的例子:我们把随机数种子比作一颗种子,随机数比作一个小树苗, mt_rand()执行一次那么树苗就长大一岁。基因一样的种子长大后长得到的树苗一模一样,但是每个年龄段的容貌是不同的。所以同样的随机数种子获得的随机数是一样的(基因一样,所以容貌相同),不更换随机数种子的情况下,每次mt_rand获取的随机数是不同的(每个年龄段的树苗容貌不同)。

在这里插入图片描述

看到 lib/string.func.php,这个文件中 buildRandomString函数是生成验证码的函数。此处验证码生成方式是通过 str_shuffle函数随机打乱字符串,然后取前4位字符。此处没有用到 mt_rand函数,所以不可以推算出验证码,不存在漏洞。

在这里插入图片描述

漏洞分析3

使用了Hardcoded password(硬编码密码),意思就是将密码直接写在了代码中。这是数据库的连接密码,只能写在代码中,所以此处代码没有问题。但是要注意的是在真实的业务环境中不能如下图所示一样使用弱口令。

在这里插入图片描述

漏洞分析4

此处如果在浏览器上记录密码,那么下次访问此页面时浏览器会自动填入。自动填入密码有一定泄密风险,但是用户可以选择不记录密码,这与代码无关(也可以通过特殊的代码让浏览器不自动填入),所以这需要用户养成良好的习惯。

在这里插入图片描述

漏洞分析5

看到 admin/doImageAction.php的145行左右,此处存在一个函数 move_uploaded_file,这个函数的作用是保存用户上传的文件。我们只要过滤了非法文件就可以避免文件上传漏洞。

在这里插入图片描述

该文件上传功能设置了扩展名白名单,然后去除了上传目录的执行权限,通过md5设置唯一文件名,所以该处文件上传不存在漏洞。

在这里插入图片描述

漏洞分析6

看到 admin/doLogin.php的10行和23行,fortify是检测到了addslashes函数对获取的用户名进行了过滤,但是怀疑存在sql注入漏洞。我们看到23行,在sql语句中可控参数 $get_username两边是有引号的,所以对 addslashes对引号过滤是可以防止sql注入。我们要知道某些情况下 addslashes函数可以通过宽字节绕过。虽然我们现在数据库现在用的是utf-8编码,无法通过宽字节绕过,但是该套系统部署在其他用 GBK的环境中就可以通过宽字节绕过 addslashes函数了,所以此处应该把 addslashes换成 mysql_real_escape_string

在这里插入图片描述

要注意:mysql_real_escape_string要与 mysql_set_charset搭配用,且 mysql_real_escape_string需要用在 mysql_set_charset后面。前面修复漏洞时已经将mysql_set_charset写在了 mysqlConnect函数中,所以修改代码应该如下图所示:

$get_username = $get_username;
$get_username = mysql_real_escape_string($get_username);

在这里插入图片描述

漏洞分析7

看到 core/core.php的128行,此处的 $searchContent也是仅仅使用addslashes过滤,其中 $offset$pageSize来自 getPageImageInfo函数,该函数把$offset转化成了整数,所以无恶意数据,$pageSize用户不可控。所以此处我们只要处理好searchContent即可。

在这里插入图片描述

修改后的代码如下图所示,还有其他sql注入漏洞和此处一样,大家可以用同样的方法修复。

$searchContent = mysql_real_escape_string($searchContent);

在这里插入图片描述

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



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

相关文章

使用Python和PaddleOCR实现图文识别的代码和步骤

《使用Python和PaddleOCR实现图文识别的代码和步骤》在当今数字化时代,图文识别技术的应用越来越广泛,如文档数字化、信息提取等,PaddleOCR是百度开源的一款强大的OCR工具包,它集成了... 目录一、引言二、环境准备2.1 安装 python2.2 安装 PaddlePaddle2.3 安装

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

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

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