文章来源: 酒仙桥六号部队

前言

代码审计(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/

渗透测试之通过代码审计打点相关推荐

  1. tomcat temp 大量 upload 文件_渗透测试之文件上传漏洞总结

    文末下载上传环境源码 客户端 js检查 一般都是在网页上写一段javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式. 查看源代码可以看到有如下代码对上传文件类型进行了限制: 我们 ...

  2. 渗透测试之后台查找,如何查找网站后台

    渗透测试之后台查找,如何查找网站后台 1.当前页面信息浏览 查看图片的相关属性 查看网站底部管理入口和版权信息 robots文件 故意请求不存在的页面 2.当前页面后台猜解 CMS指纹识别 猜解常见后 ...

  3. 渗透测试之破解密码(3)

    渗透测试之破解密码(3) 常见密码破解技术 被动在线攻击 主动在线攻击 离线攻击 彩虹表 使用彩虹表破解密码 使用非技术性方法 使用闪存驱动器窃取密码 提升权限 TRK(Trinity Rescue ...

  4. 渗透测试之SQL注入基础

    渗透测试之SQL注入基础 SQL注入类型 按照数据类型类型来分类 按照执行效果来分类(页面回显效果) 按照数据提交的方式来分类 判断注入类型的方法 MySQL注入基础 联合查询注入 布尔注入 时间盲注 ...

  5. Kali渗透测试之端口扫描1——UDP、TCP、僵尸扫描、隐蔽扫描

    端口扫描 每个服务器上面都会跑很多应用,每个应用都会侦听某些端口,通过侦听端口接收来自客户端或其他用户对应用程序的访问.所以在发现目标主机存活后,我们需要知道目标主机上都开放了那些端口,应用程序的漏洞 ...

  6. @渗透测试之信息收集

    目录 渗透测试之信息收集 一.信息收集之概述 1.1 渗透一个目标系统,最常见的信息手机目标有如下几种: 1.2 信息收集的作用 二.利用搜索引擎收集信息 2.1 利用搜索引擎的收集目标主要有以下几种 ...

  7. Python渗透测试之ARP毒化和协议应用

    Python渗透测试之ARP毒化和协议应用 1. ARP毒化 ​ ARP毒化是一种比较老的渗透测试技术,通过ARP毒化技术分析并提取内网流量中的敏感信息,往往会有许多意外的收获. 1.1 工作原理 A ...

  8. 近源渗透测试之Keylogger实战

    近源渗透测试之Keylogger实战 转载,侵删 原创 大好人  来源于公众号:雷神众测 原文链接:https://mp.weixin.qq.com/s?__biz ... 8a1fcbc183d84 ...

  9. Kali渗透测试之主动侦查和被动侦查以及maltego的使用

    Kali渗透测试之maltego注册和使用 一.注册maltego 1.打开命令行终端,可以在kali桌面右键打开,也可以使用快捷键Ctrl+Alt+T打开 kali本身应该已经自带maltego,但 ...

最新文章

  1. 记一次 MySQL 的慢查优化
  2. 深入浅出聊聊 Rust WebAssembly(一)
  3. 电话光端机和PDH光端机的区别
  4. 使用projectx / os和Raspberry Pi托管您自己的电子邮件
  5. 视觉SLAM笔记(8) 齐次坐标
  6. 可视化工具sqlyog连接MySQL数据库
  7. 神通数据库常见问题解决方案
  8. 迁移学习:他山之石,可以攻玉【VALSE Webinar】Panel实录
  9. 工地人脸识别门禁考的出现对智慧工地提出解决方案
  10. 计算机word大作业,计算机操作基础--Word大作业要求.doc
  11. opencv 物体尺寸测量
  12. 举个栗子!Tableau技巧(7):如何做帕累托图
  13. 五一劳动节,微信公众号图文应该怎样排版?
  14. windowmediaplayer控件出现未能加载的问题
  15. Incomplete Multimodal Learning(不完整多模态学习)
  16. 不存在从 “int“ 转换到 “registers“ 的适当构造函数
  17. 在线佳能计算机,佳能相机秒变电脑摄像头 高画质直播新玩法
  18. 31家互联网地图服务甲级测绘资质单位
  19. MD5码加密(盐值加密)
  20. [Qt5控件] 控件stackedWidget、lineEdit等的用法

热门文章

  1. python 数组写txt_python txt文件常用读写操作
  2. solr部署在tomcat下
  3. (~最新合集~)计算机网络谢希仁第七版 第二章课后答案
  4. Str库系列函数合集(strlen、strcpy、strcmp、strcat、strchr等)
  5. linux-搜索查找类
  6. java实验原理和图例_图例解析JDK,JRE,JVM概念及使用
  7. 中文编程语言_文言文编程语言,让你明白什么叫“中文比英语还难”。
  8. 构造代码块、静态代码块、构造方法的执行顺序
  9. c语言程序转换成单片机语言,单片机编程常用到的类型转换 C语言程序实现
  10. android 定制ui,AndroidSDK-UI定制