AKun Wallpaper 代码审计实战分析3

2023-10-17 09:59

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

前言

在前面我已经介绍了AKun Wallpaper的部署,分析了xss漏洞并且讲解了如何修复这些漏洞。如果还没有看过我前两篇文章的师傅可以先看一下前两篇文章。在这一篇文章中我将重点分析任意文件删除漏洞和sql注入漏洞,然后对漏洞进行复现,最后讲解如何修复这些漏洞。

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

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

漏洞分析1

审计过程

首先看到doImageAction.php的第18行,此处存在一个删除文件函数 unlink()。该函数的参数 $fileName是通过GET方式获取,所以该处所删除的文件可控,所以该处存在任意文件删除漏洞。

在这里插入图片描述

漏洞复现

为了避免删除正常文件,我在网站根目录下创建了一个文件 a.php来做测试。

在这里插入图片描述

然后访问 http://127.0.0.1/admin/doimageAction.php?action=delImage&fileName=../a.php,其中action=delImage代表要执行删除文件的操作,fileName=../a.php表示要删除的文件就是上一级目录中的a.php。但是访问后网页后弹出提示框提示删除失败,其实这时候已经成功删除文件了。再次查看文件,发现a.php已经不存在了。

在这里插入图片描述

这里提示删除失败是因为没有传入id参数,导致数据库删除图片相应的记录失败。如下图所示,标红路径即本次程序运行路径。

在这里插入图片描述

修复方案

防止任意文件删除的方法有多种,但是所有方法基本有以下两个特点:

  1. 尽量避免从用户端获取文件名。
  2. 防止目录跳转。

所以此处给出两种解决办法:

  1. 禁止用户任意传入文件名,通过图片id从数据库中获取图片名称。
  2. 禁止目录跳转,只允许删除指定目录中的文件。

这里选择第二种方法做演示,在删除文件的代码前添加如下代码即可防止任意文件删除。其中 LIST_IMAGES是图片存储的目录, basename()函数是去除目录,只保留文件名。修改后如下图所示:

$fileName = LIST_IMAGES."/".basename($fileName);

在这里插入图片描述

注意:在doImageAction.php中37行是循环删除多个文件,在复现此处漏洞的时候传入的参数与前面有所不同,其参数格式为: action=delAllImage&info=id1:filename1,id2:filename2,id3:filename3,但是其修复方式与前面讲述方法一样。

漏洞分析2

审计过程

看到 lib/downImage.php文件,在该文件中执行流程是:

  1. 首先通过GET方式获取一个字符串。
  2. 然后将字符串中目录去除,只保留有效文件名部分。
  3. 最后下载该文件。

虽然该漏洞不能任意穿越目录,但是可以下载当前目录中任意文件。该文件存在 lib目录中,该目录中存在一些敏感文件。如果这些文件能被用户下载,将会存在巨大的潜在风险。

在这里插入图片描述

修复方法可以根据具体业务需求设置白名单。此文件本来是移动端程序下载图片时使用,这里为了简化程序删除了移动端版本,但是downImage.php忘记删除了,所以此处删除该文件就可修复,不会影响正常业务。

漏洞分析3

审计过程

看到 lib/mysql.func.php第24行,此处执行了一条sql语句,顺着这条语句找到数据源。

在这里插入图片描述

数据源是 core/core.php的20行处获取,从数据源到sql语句执行的过程中未进行任何安全处理,所以该处大概率存在sql注入漏洞。

在这里插入图片描述

漏洞复现

上面分析的代码功能就是添加管理员,我们打开添加管理员页面,填写任意数据。

在这里插入图片描述

开启浏览器代理,通过burpsuite抓取数据包。

在这里插入图片描述

将数据包发送到 Repeater模块,并构造恶意payload。发送数据包5s后才收到响应包,这说明函数sleep(5)已经执行成功。

在这里插入图片描述

修复方案

sql注入的防范方法主要有以下几种:

  1. 通过addslashesmysql_real_escape_string等函数或开启magic_quotes_gpc参数来过滤引号。这种方法在某些情况下可以通过宽字节注入或二次注入绕过限制,也不能有效防范int类型注入。
  2. 通过intval函数转换防止注入。该函数的作用是将变量转化为int型。这种方法无法对本身含有字符型数据的数据进行处理。
  3. 通过黑名单或白名单的方式进行过滤。绕过白名单或黑名单的方法多种多样,难以防范。
  4. 采用PDO预编译防止sql注入。这种方法防止sql注入的效果比较好,建议采用这种方法。

此处如果采用PDO预编译的方法修复漏洞,该程序所有sql语句都要重写,工作量巨大,所以建议开发初期就采用PDO预编译方式操作数据库。此处采用 mysql_real_escape_string函数加上 mysql_set_charset函数对特殊字符转义来防止sql注入。

Q:mysql_set_charset的作用是什么?

A:mysql_set_charset设置了数据库的编码,同时也记录了当前设置的编码,在后面使用mysql_real_escape_string函数时会自动获取这个编码,并通过此编码来转义特殊字符。这样统一了转义时用的编码和数据库编码,便可以防止宽字节注入。

Q:addslashesmysql_real_escape_string的区别是什么?

A:mysql_real_escape_string会获取数据库字符集并根据数据库字符集转义特殊字符,而addslashes会直接使用默认字符集转义特殊字符。另外addslashes只会对 '"\null 转义,而mysql_real_escape_string同时还会对 \r\n\x1a转义。

lib/mysql.func.php第13行的 mysql_query("set names utf8");替换成下面代码:

mysql_set_charset('utf8');

在这里插入图片描述

然后使用mysql_real_escape_string函数对用户传过来的数据进行转义,lib/mysql.func.php中20行的 insert函数改成:

function insert($table,$data) {$key = join(",",array_keys($data));$key = mysql_real_escape_string($key);$value = join(",", array_values($data));$value = mysql_real_escape_string($value);$value = explode(",", $value);$value = "'".join("','", $value)."'";$sql = "INSERT INTO {$table}({$key}) VALUES({$value})";mysql_query($sql);return mysql_insert_id();
}

在这里插入图片描述

其他sql注入漏洞原理类似,可以用同样的方法修复。

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



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

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d