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实现全能手机虚拟键盘的示例代码

《使用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函数排序

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La