通过修改代码进行代码审计 写在前面在平常练习中,可能网上已经报出该源码中的漏洞,但我们可以不先看网上的教程,只需知道它是什么类型的漏洞,在本地搭建环境,试着自己先去寻找这个…
通过修改代码进行代码审计
写在前面
在平常练习中,可能网上已经报出该源码中的漏洞,但我们可以不先看网上的教程,只需知道它是什么类型的漏洞,在本地搭建环境,试着自己先去寻找这个漏洞,同时学着去修改代码进行对变量的理解,这样我们的代码审计能力会快速提高,说不一定还会有意外收获,在这次beescms源码上传漏洞审计中,最终查询发现自己审计出来的漏洞跟网上报出来的漏洞并不是在同一目录下。
环境搭建
源码下载地址:https://pan.baidu.com/s/1FETiU_Moh7lysaF77ZhFtQ
提取码:4534
工具:
PhpStudy、Seay源代码审计系统
将数据库密码改为自己的数据库的密码
访问install目录进行安装
设置账号密码
初次代码审计
首先搜索上传的关键字,获取上传点,但发现太多文件有上传这个关键字,根本无从下手
于是我就想着搜索文件上传的相关函数$_FILES
这下看着少多了,任意打开一个来看,就选第一个吧,要登录后台才能成功访问,登录加载后发现有文件上传的页面,有点惊喜。
配合抓包工具来分析参数,在包的末尾发现两个参数,再用参数去定义到文件中的代码段
在文件中搜索参数,分析这段代码,重点在is_uploaded_file()函数中的内容,is_uploaded_file()函数判断指定的文件是否是通过 HTTP POST 上传的,这段代码主要是对上传文件操作的处理
在这段代码中,网上搜索发现PHP没有自带up_file()函数,而且注释中标注处理上传后的图片信息,看到这个让我引起了注意,接着定位该函数
将上传文件的包放出去,看看返回信息
返回的信息有什么特点呢?发现上面返回的错误信息跟fun.php中的代码信息一样,为了进一步确认,于是我改动那个文件中的信息
继续上传文件,发现返回的信息跟我们修改的信息一样
由此说明代码段是在这里执行,并且该段代码有进行文件大小、类型的判断,文件大小可以忽略不计,关键在于文件类型,如何让我们上传自己想上传的文件类型呢?file_type就是获取文件的类型,怎么获取的呢?pathinfo ()函数以数组的形式返回关于文件路径的信息,并且赋值给pic_name,file_type获取pic_name中的extension值,也就是文件的类型,type为自定义类型列表,也就是包含允许上传的文件类型的内容。为了区分type与file_type值,我进行代码改写,输出type值,这样就可以更好的了解type的意思了。
file_type的值怎样才可以更改成我们想要的值呢?为了方便起见我用PHP在线运行,pathinfo()函数进行测试,看下如何获取extension值,通过各种测试,比如截断、垃圾字符等,发现extension的值都是最后点的值,这个上传点测试漏洞无效,没有漏洞。
当然此时我们遇到这种情况时,内心还是非常焦灼的,很多人遇到这样就几乎想放弃了,可现实中的代码审计就是这样,几乎不可能一下子得到答案,所以我们不能放弃,回到最初的那样,继续测试其他文件,下面这次审计终于成功了。
再次代码审计
选择admin_pic_upload.php文件,继续抓包去文件中分析变量,这里分析pic_cate
文件上传主要看过滤,up_img()函数用来处理提交的内容,array数组记录着要验证的type类型,所以接下来我们要详细了解up_img()函数。
定位up_img()函数,分析这段代码,重点在于验证type的值,pathinfo()函数获取上传文件的信息后,将它赋值给pic_name,file_type获取上传文件中的type值,及数据包中Content-Type后的值,strtolower()函数将file_type所有字符转换为小写与array数组中的type值进行比较,in_array() 函数搜索array数组中是否存在与file_type相等的值,如果存在就上传。由于只验证了Content-Type值,可以确定这里存在漏洞。
漏洞利用
抓包按图修改值
本地对应目录查看文件是否上传成功
访问该地址,在这里为了更好的体验效果我在上传的图片中加入了<?php phpinfo(); ?> 可以明显的看到我们上传的图片类型变成我们想要的类型,代码也被执行,最后我在上网查询了其他人的代码审计http://cn-sec.com/archives/311436.html 发现别人的目录跟我的不一样,也算是意外的惊喜。
总结
我们不能说测试一个文件发现没有漏洞就想着放弃,往往一个漏洞的发现并不是那么轻而易举,不要认为别人代码审计就是文章中的那么短,那是因为别人是将成功的案例直接发出来,其中也会遇到无数的困难,没有写出来而已,在平时的代码审计过程中,我们要学会通过修改代码,输出自己想要的变量值,来进行分析,可以加深我们对代码的理解,这样我们的代码审计能力会慢慢的提高,效率也会得到提高,而不是一味的跟着别人的思路去想。
- 本文作者: Honeypot
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/255
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!