渗透测试之通过代码审计打点
文章来源: 酒仙桥六号部队
前言
代码审计(Code Audit)顾名思义就是通过阅读源代码,从中找出程序源代码中存在的
缺陷或安全隐患,提前发现并解决风险,这在甲方的SDL建设中是很重要的一环。而在渗透测试中,可以通过代码审计挖掘程序漏洞,快速利用漏洞进行攻击达成目标。
审计思路
常见的审计思路有:
1.寻找敏感功能点,通读功能点代码;
优点: 精准定向挖掘,利用程度高;
缺点:命名不规范的代码容易被忽略,导致失去先机。
2.根据敏感关键字回溯参数传递过程;
优点:通过搜索敏感关键字可快速定位可能存在的漏洞,可定向挖掘,高效、高质量;
缺点:对程序整体架构了解不够深入,在漏洞定位时比较耗时,逻辑漏洞覆盖不到。
3.直接通读全文代码;
优点:对整体架构熟悉,了解程序的数据流处理、配置文件、过滤函数等;
缺点:耗时长,需要足够的时间熟悉整体架构。
审计方法
按照是否使用(半)自动化工具分有工具扫描、人工审计和两者相结合的几种审计方式,笔者比较喜欢硬刚,毕竟正常挖业务层面漏洞没有那么复杂,不太需要对底层的一些特性了解的很清楚。
按照数据流向可分为正向审计和逆向审计,正向审计即从功能入口点进行跟踪,一直到数据流处理结束;逆向审计即现根据一些关键词搜索,定位到可能存在风险的关键词/函数,再反推到功能入口,看整个处理过程是否存在漏洞。
成功案例
案例一:一个任意文件下载漏洞引起的代码审计
在一次授权测试中,找到一处任意文件下载漏洞,正常思路先下载网站的配置文件,看看数据库是否可以外联。
不幸的是不可以外联(其实现在能外联的也很少了),幸运的是在配置文件中收集到了一个域用户,这是意外之喜。
接着下载Download.aspx文件看看内容:
我们知道, .net是编译型语言,在aspx中一般是没有服务代码的,这里看到使用了Inherits来继承后端代码。
Inherits是啥?
MSDN官方解释:定义供页继承的代码隐藏类。它可以是从Page类派生的任何类。此特性与CodeFile
特性一起使用,后者包含指向代码隐藏类的源文件的路径。
通俗一点就是代码都在这个Inherits指向的dll中了,那么我们下载到dll文件,就可以对后端代码进行一波窥探了,于是构造下载XXXXXX.Web.dll,文件下载到本地后,IL Spy打开就是一顿肉眼观察。
大致看了一下目录,有Upload字样,优先级直线上升,先进去看看:
public void uploadFile() {string formStringParamValue = SWFUrlOper.GetFormStringParamValue("path");string formStringParamValue2 = SWFUrlOper.GetFormStringParamValue("fn");bool flag = SWFUrlOper.GetFormStringParamValue("small").ToLower() == "true";......string[] array = new string[]{"jpg","gif","png","bmp"};string formStringParamValue3 = SWFUrlOper.GetFormStringParamValue("data");try {System.Web.HttpPostedFile httpPostedFile = base.Request.Files["Filedata"];string b = string.Empty;string text = string.Empty;if (httpPostedFile.ContentLength > 0) {text = httpPostedFile.FileName;if (text.IndexOf(".") != -1) {b = text.Substring(text.LastIndexOf(".") + 1, text.Length - text.LastIndexOf(".") - 1).ToLower();}SWFUploadFile sWFUploadFile = new SWFUploadFile();if (flag) {sWFUploadFile.set_SmallPic(true);sWFUploadFile.set_MaxWith((formIntParamValue == 0) ? sWFUploadFile.get_MaxWith() : formIntParamValue);sWFUploadFile.set_MaxHeight((formIntParamValue2 == 0) ? sWFUploadFile.get_MaxHeight() : formIntParamValue2);}sWFUploadFile.set_IsWaterMark(isWaterMark);int num = 0;string text2 = sWFUploadFile.SaveFile(httpPostedFile, formStringParamValue, formStringParamValue2, ref num);...}
38行进行了文件保存,之前没有对文件的内容、后缀等有任何过滤,开开心心挖到任意文件上传。二话不说本地构造上传个shell。
<form name="form" method="post" action="http://xxxx.com/cms/SWFUpload.aspx" enctype="multipart/form-data" ><input type="file" name="Filedata"><input type="submit" name="Submit" value="upload" >
</form>
假如这里代码被混淆的话,可以使用de4dot进行反混淆,de4dot支持10几种混淆方式的反混淆:
Dotfuscator
.NET Reactor
Xenocode
CryptoObfuscator
SmartAssembly
......
比如使用Dotfuscator混淆过的DLL是这样的:
使用de4dot反混淆:
CMD命令行执行: de4dot.exe ADD.dll
看下效果:
代码已经基本恢复到可读状态了,其他高级用户请参考github上的介绍。
案例二:某个开源系统的代码审计
授权渗透时发现只有一个登录框,遇到这种情况一般只能拼字典进行爆破了,还好客户使用的是一套开源系统二次开发,可以down到代码进行分析一波。
拿到代码看了一下结构,是thinkphp的二开,遵循MVC模型代码那是一个层次分明。
因为目标只有登录框,所以这里我关注的重点除了文件上传、SQL注入,又多了一个绕过登陆的想法了,no代码no哔哔~~
Upload太刺眼了,忍不住进去分析一下。
class UploadController extends ComController {......private function saveimg($file) {$uptypes = array('image/jpeg','image/jpg','image/jpeg','image/png','image/pjpeg','image/gif','image/bmp','image/x-png');$max_file_size=2000000; //上传文件大小限制,单位BYTE$destination_folder = 'Public/attached/'.date('Ym').'/'; //上传文件路径if ($max_file_size < $file["size"]) {echo "文件太大!";return null;}if (!in_array($file["type"], $uptypes)) {echo "文件类型不符!".$file["type"];return null;}if (!file_exists($destination_folder)) {mkdir($destination_folder);}$filename = $file["tmp_name"];$image_size = getimagessize($filename);$pinfo = pathinfo($file["name"]);$ftype = $pinfo['extension'];$destination = $destination_folder.time().".".$ftype;if (file_exists($destination) && $overwrite != true) {echo "同名文件已经存在了";return null;}if (!move_uploaded_file($filename, $destination)) {return null;}return "/".$destination;}......
只对文件MIME类型进行了检测,做安全的都爱这样的开发工程师,比心~
不过这里继承了ComController,里面有身份认证,不能直接getshell了...呜呜呜,还要突破登录后台才行。
跟进ComController看下认证检查过程。
class ComController extends BaseController {public $USER;public function _initialize() {C(setting());$user = cookie('user');$this->USER = $user;$url = U("login/index");if (!$user) {header("Location: {$url}");exit(0);}$Auth = new Auth();$allow_controller_name=array('Upload'); //放行控制器名称$allow_action_name = array(); //放行函数名称if (!$Auth->check(CONTROLLER_NAME.'/'.ACTION_NAME, $this->USER['uid'])&&!in_array(CONTROLLER_NAME, $allow_controller_name) && !in_array(ACTION_NAME, $allow_action_name)) {$this->error('没有权限访问本页面!');}$user = member(intval($user['uid']));$this->assign('user', $user);
嗯,我可能深深爱上了这个开发工程师了,从cookie中获取认证信息,并赋值给$user对象,那么我们就可以操控用户登录啦,在配合后台的任意文件上传,美滋滋~
失败案例
总结
相对于甲方不同,渗透测试中代码审计更多的是挖掘可利用的漏洞或利用链进行攻击,尽可能的获取更高的权限为目的。
个人觉得渗透测试时关注的漏洞优先级:
命令执行 > 代码执行 > 文件上传 > 文件包含 > SQL注入 > 文件下载 > 逻辑漏洞 > SSRF > XSS ....
代码审计除了需要了解漏洞的原理、熟悉常见的编程语言、常见的危险函数、常见的协议、渗透技巧外,还需要一些开发调试工具(IDEA、PHPStrom、PyCharm ...),以上内容有不正之处,还请大家斧正。
注:
de4dot项目地址:
https://github.com/0xd4d/de4dot/
渗透测试之通过代码审计打点相关推荐
- tomcat temp 大量 upload 文件_渗透测试之文件上传漏洞总结
文末下载上传环境源码 客户端 js检查 一般都是在网页上写一段javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式. 查看源代码可以看到有如下代码对上传文件类型进行了限制: 我们 ...
- 渗透测试之后台查找,如何查找网站后台
渗透测试之后台查找,如何查找网站后台 1.当前页面信息浏览 查看图片的相关属性 查看网站底部管理入口和版权信息 robots文件 故意请求不存在的页面 2.当前页面后台猜解 CMS指纹识别 猜解常见后 ...
- 渗透测试之破解密码(3)
渗透测试之破解密码(3) 常见密码破解技术 被动在线攻击 主动在线攻击 离线攻击 彩虹表 使用彩虹表破解密码 使用非技术性方法 使用闪存驱动器窃取密码 提升权限 TRK(Trinity Rescue ...
- 渗透测试之SQL注入基础
渗透测试之SQL注入基础 SQL注入类型 按照数据类型类型来分类 按照执行效果来分类(页面回显效果) 按照数据提交的方式来分类 判断注入类型的方法 MySQL注入基础 联合查询注入 布尔注入 时间盲注 ...
- Kali渗透测试之端口扫描1——UDP、TCP、僵尸扫描、隐蔽扫描
端口扫描 每个服务器上面都会跑很多应用,每个应用都会侦听某些端口,通过侦听端口接收来自客户端或其他用户对应用程序的访问.所以在发现目标主机存活后,我们需要知道目标主机上都开放了那些端口,应用程序的漏洞 ...
- @渗透测试之信息收集
目录 渗透测试之信息收集 一.信息收集之概述 1.1 渗透一个目标系统,最常见的信息手机目标有如下几种: 1.2 信息收集的作用 二.利用搜索引擎收集信息 2.1 利用搜索引擎的收集目标主要有以下几种 ...
- Python渗透测试之ARP毒化和协议应用
Python渗透测试之ARP毒化和协议应用 1. ARP毒化 ARP毒化是一种比较老的渗透测试技术,通过ARP毒化技术分析并提取内网流量中的敏感信息,往往会有许多意外的收获. 1.1 工作原理 A ...
- 近源渗透测试之Keylogger实战
近源渗透测试之Keylogger实战 转载,侵删 原创 大好人 来源于公众号:雷神众测 原文链接:https://mp.weixin.qq.com/s?__biz ... 8a1fcbc183d84 ...
- Kali渗透测试之主动侦查和被动侦查以及maltego的使用
Kali渗透测试之maltego注册和使用 一.注册maltego 1.打开命令行终端,可以在kali桌面右键打开,也可以使用快捷键Ctrl+Alt+T打开 kali本身应该已经自带maltego,但 ...
最新文章
- 记一次 MySQL 的慢查优化
- 深入浅出聊聊 Rust WebAssembly(一)
- 电话光端机和PDH光端机的区别
- 使用projectx / os和Raspberry Pi托管您自己的电子邮件
- 视觉SLAM笔记(8) 齐次坐标
- 可视化工具sqlyog连接MySQL数据库
- 神通数据库常见问题解决方案
- 迁移学习:他山之石,可以攻玉【VALSE Webinar】Panel实录
- 工地人脸识别门禁考的出现对智慧工地提出解决方案
- 计算机word大作业,计算机操作基础--Word大作业要求.doc
- opencv 物体尺寸测量
- 举个栗子!Tableau技巧(7):如何做帕累托图
- 五一劳动节,微信公众号图文应该怎样排版?
- windowmediaplayer控件出现未能加载的问题
- Incomplete Multimodal Learning(不完整多模态学习)
- 不存在从 “int“ 转换到 “registers“ 的适当构造函数
- 在线佳能计算机,佳能相机秒变电脑摄像头 高画质直播新玩法
- 31家互联网地图服务甲级测绘资质单位
- MD5码加密(盐值加密)
- [Qt5控件] 控件stackedWidget、lineEdit等的用法
热门文章
- python 数组写txt_python txt文件常用读写操作
- solr部署在tomcat下
- (~最新合集~)计算机网络谢希仁第七版 第二章课后答案
- Str库系列函数合集(strlen、strcpy、strcmp、strcat、strchr等)
- linux-搜索查找类
- java实验原理和图例_图例解析JDK,JRE,JVM概念及使用
- 中文编程语言_文言文编程语言,让你明白什么叫“中文比英语还难”。
- 构造代码块、静态代码块、构造方法的执行顺序
- c语言程序转换成单片机语言,单片机编程常用到的类型转换 C语言程序实现
- android 定制ui,AndroidSDK-UI定制