代码审计
PHP
前期准备
SQL注入篇
文件操作函数汇总
命令执行篇
XML实体注入篇
前端漏洞篇
反序列化篇
小技巧篇
其它资料
本文档使用 MrDoc 发布
-
+
首页
小技巧篇
# 小技巧篇 ## 为什么小技巧很重要 - 白盒测试常见疑问 - 基本 Web 漏洞都有所了解,但实际漏洞挖掘过程中,为什么挖不到漏洞? - 大部分地方都有过滤,但是有过滤不代表没有问题。 - 代码量增加以后,如何快速的找到漏洞? - 通过双向漏洞挖掘方法,首先从index.php开始,先简单了解一下应用是什么样的:有什么功能,架构是什么样的,有没有全局变量的过滤,有哪些入口点,有哪些第三方的工具。 - 搜索漏洞关键字,命令执行关键字,sql关键字,xxe关键字。从函数网上回溯,看下参数有没有用户可以控制的地方。 - 这类漏洞挖常规漏洞问题不大,罗辑漏洞难挖一点。 - 如何挖掘对安全有一定防御的代码中的漏洞? - 大部分代码都有过滤,如何挖掘就是看能不能绕过。 - 哪些一定无法绕过有个印象。 - 目标使用了现代PHP框架,很难找到常见漏洞,怎么突破? - laravel,YII等,这里面的框架开发理念有:secure as default。或者使用了ORM等,就很难找到sql注入。想写漏洞都比较困难。 - 你所需要的两个知识 - 白盒测试的基本方法 - 常见漏洞函数,修复方法。 - 白盒测试技巧 ## 现代Web开发框架下的PHP漏洞 - 现代Web开发框架 - Laravel:要求PHP在7.1以上 - Symfony - Slimphp - Yii2 - 特点 - 所需PHP版本较高,\0截断等老漏洞绝迹。 - 提供功能强大的ORM。 - 提供自动处理输出的模板引擎,前端漏洞也难挖掘。 - 开发者可以通过composer找到任何需要的功能类,避免因为自己造轮子产生的漏洞。这个composer类似python的pip,Java的maven。 - 现代web开发框架安全思想 - Secure by default 原则 - 文档中,会详细叙述可能出现的安全问题。 - 挖掘思路 - 寻找框架本身的安全漏洞。或者特性,如果用户使用这个特性不规范也有可能出现漏洞。 - 寻找不规范的开发方式 - 寻找错误的配置,开启了debug模式等。 - 异常的利用,通过人为构造异常抛出敏感信息,新的框架较多,老框架几乎没有。 - 第三方服务的利用 - spl_autoload的利用,现代开发框架才有,自动加载用户用到的没有包含的类。 ### 寻找框架本身的漏洞 - Slim3框架架构上存在XXE漏洞 > https://bugs.leavesongs.com/php/php%E6%A1%86%E6%9E%B6slim3%E6%9E%B6%E6%9E%84%E4%B8%8A%E5%AD%98%E5%9C%A8xxe%E6%BC%8F%E6%B4%9E%EF%BC%88xxe%E7%9A%84%E5%85%B8%E5%9E%8B%E5%AD%98%E5%9C%A8%E5%BD%A2%E5%BC%8F%EF%BC%89/ - 特点: - restful+前后端分离式框架慢慢流行 - json/xml成为主流数据传输格式 - 框架默认支持多种格式解析方法,由请求包中的Content-Type决定 - 解析XML时出现XXE漏洞 - POC攻击 - 任意文件读取/SSRF/拒绝服务 漏洞。 ```php public function __construct($method, UriInterface $uri, HeadersInterface $headers, array $cookies, array $serverParams, StreamInterface $body, array $uploadedFiles = []) { $this->originalMethod = $this->filterMethod($method); $this->uri = $uri; $this->headers = $headers; $this->cookies = $cookies; $this->serverParams = $serverParams; $this->attributes = new Collection(); $this->body = $body; $this->uploadedFiles = $uploadedFiles; if (!$this->headers->has('Host') || $this->uri->getHost() !== '') { $this->headers->set('Host', $this->uri->getHost()); } $this->registerMediaTypeParser('application/json', function ($input) { return json_decode($input, true); }); $this->registerMediaTypeParser('application/xml', function ($input) { return simplexml_load_string($input); }); $this->registerMediaTypeParser('text/xml', function ($input) { return simplexml_load_string($input); }); $this->registerMediaTypeParser('application/x-www-form-urlencoded', function ($input) { parse_str($input, $data); return $data; }); } ``` - 实际上解析代码是作为回调函数写在Request类的构造方法里了。 - 可见这里直接调用了simplexml_load_string解析$input,造成XML实体注入漏洞。 ### 寻找不规范的开发方式 - Edusohu一处SQL注入漏洞 > https://bugs.leavesongs.com/php/edusoho%E4%B8%80%E5%A4%84sql%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E%EF%BC%88demo%E7%AB%99%E6%BC%94%E7%A4%BA%EF%BC%89/ - 特点: - 基于symfony(开发框架)+doctrine(ORM) - doctrine orm默认使用参数化查询杜绝sql注入漏洞 - sql语句多参数情况下,开发者不知道如何使用参数化查询(不确定有多少个参数就不知道"?"改写多少次) - 开发者未详尽阅读框架文档 - sql语句多参数情况下,进行拼接->sql注入漏洞 ```php public function insert($tableExpression, array $data, array $types = array()) { $this->connect(); if (empty($data)) { return $this->executeUpdate('INSERT INTO ' . $tableExpression . ' ()' . ' VALUES ()'); } return $this->executeUpdate( 'INSERT INTO ' . $tableExpression . ' (' . implode(', ', array_keys($data)) . ')' . ' VALUES (' . implode(', ', array_fill(0, count($data), '?')) . ')', array_values($data), is_string(key($types)) ? $this->extractTypeValues($data, $types) : $types ); } ``` - 实际上,参数化查询真正起作用的地方,是在SQL语句的『value』位置。正如上述代码中写的,在values的位置,他用array_fill将?填充进SQL语句中,并绑定需要插入的数据。 - 但field位置直接拼接的啊' (' . implode(', ', array_keys($data)) . ')'。 ### 异常的利用 - Edusoho任意用户密码泄露 > https://www.leavesongs.com/PENETRATION/edusoho-debug-user-information-disclose.html - 特点: - 现代PHP框架多使用“异常处理”的方式处理错误,以前框架基本没有。 - DEBUG模式下,框架会抛出详细的异常信息 - 异常信息:所在函数、异常堆栈、当前所有变量 - 思路:在用户信息页面制造一个异常,即可获取“用户”这个变量的所有信息 - 寻找构造异常的方法->传入数组导致字符串处理时出现异常 - 这里触发异常的时候会抛出所有变量,包括用户变量。下面是异常的触发方法。 ```php <?php error_reporting(-1); $name = $_GET['name']; $fullname = 'test' . $name; // localhost/test.php?name[0]=5,这样就能触发异常。 ?> ``` ### 第三方服务的应用 - Discuz!x有条件远程命令执行 - - 特点: - 现代web应用多会配置第三方服务:redis/Memcached/Mongodb - SSRF请求可草错Redis - 修改Redis内任意信息 - 控制preg_replace参数 - /e模式PHP代码执行 ### spl_autoload利用 - 该函数作用:尝试加载未定义的类。用户新建一个对象时,如果发现当前类在上下文中没有声明,就会在目录下寻找有没有叫这个类名的php文件并将它包含进来。 - Phpwind GET型CSRF任意代码执行 > https://bugs.leavesongs.com/php/phpwind-get%E5%9E%8Bcsrf%E4%BB%BB%E6%84%8F%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C/ - 特点: - PHP自动类加载机制(spl_autoload) - Windows目录分隔符与PHP命名空间(php5.3后增加的特性)分隔符相同,php命名空间用\反斜线来区分的,如A\B\C表示命名空间是A\B,名字是C的类。 - 跨目录包含PHP类文件:这里可以跨目录很重要。 - 成功构造反序列化利用链 ## 压缩炸弹的利用 - 何为压缩炸弹 - Web应用执行了解压缩操作(上传一个目录压缩包) - 黑客利用压缩包的一些特性,构造“畸形”压缩包(特性,不是漏洞) - 解压缩时将造成漏洞 - 那些压缩炸弹惯用的方式 - 绕过文件检查失败后的删除操作 - 阻止压缩时的文件检查 - 绕过压缩时的文件检查 - 链接文件的利用 ### 绕过文件检查失败后的删除操作 - PHPCMS头像上传功能导致的任意文件上传漏洞 > https://www.leavesongs.com/PENETRATION/after-phpcms-upload-vul.html - 过程 1. 用户选择头像后,前端将其处理成多种大小并打包上传。 2. 后端接收压缩包并解压 3. 删除非法文件 - 漏洞核心: - unlink无法删除目录 - 将webshell放入压缩包文件夹中->成功保留 ```php <?php //存储flashpost图片 $filename = $dir.$this->uid.'.zip'; file_put_contents($filename, $this->avatardata); //此时写入压缩文件夹内容 //解压缩文件 pc_base::load_app_class('pclzip', 'phpsso', 0); $archive = new PclZip($filename); if ($archive->extract(PCLZIP_OPT_PATH, $dir) == 0) { die("Error : ".$archive->errorInfo(true)); } //568 行 //判断文件安全,删除压缩包和非jpg图片 $avatararr = array('180x180.jpg', '30x30.jpg', '45x45.jpg', '90x90.jpg'); if($handle = opendir($dir)) { while(false !== ($file = readdir($handle))) { if($file !== '.' && $file !== '..') { if(!in_array($file, $avatararr)) { @unlink($dir.$file); } else { $info = @getimagesize($dir.$file); if(!$info || $info[2] !=2) { @unlink($dir.$file); } } } } ``` ### 阻止压缩时的文件检查 - Finecms前台任意文件上传系列漏洞 > https://www.leavesongs.com/PENETRATION/fineCMS-getshell.html - 过程: 1. 用户选择头像后,前端将其处理成多种大小并打包 2. 后端接收压缩包并解压 3. 在当前目录递归删除非法文件 - 缺陷: - 解压失败时,程序抛出错误并停止运行->webshell保留 - 里面有三个文件,第一个文件是头像,第二个文件是webshell,第三个文件是会解压错误的文件。 ### 绕过压缩时的文件检查 - Finecms前台任意文上传系列漏洞 > - 过程: - 用户选择头像后,前端将其处理成多种大小并打包上传 - 后端接收压缩包并解压(触发错误后不会退出程序,会继续检查文件后缀) - 在当前目录递归删除非法文件 - 缺陷: - 使用../可解压到上层目录 - 构造一个文件文件名是../../../webshell.php ### 链接文件的利用 - 绕过新浪SAE沙盒读取任意文件 - 用户可以上传自己的代码,然后运行的平台 > - 特点 - 解压时未判断文件类型 - 软连接文件可保留至压缩包中 - 访问该软连接 - 服务器中间件自动读取软链接指向的文件 - 任意文件读取漏洞 ``` // 创建软链接 ln -s /etc/passwd test // 访问软链接 cat test ``` ## 条件竞争漏洞 - 假设用户可以向网站POST一段内容,网站会将内容写入固定文件中。这时候可能就会有竞争问题,比如两个人同时写入,可能会值写入了一个人的内容,或则两个人内容是乱的。 - 白盒测试中的条件竞争漏洞 - 条件竞争漏洞 - 并发状态 - 进程与线程 - 条件竞争漏洞挖掘方向 - 上传后删除的利用 - 忘记上锁的数据库 - 鸡肋文件包含的妙用 ### 上传后删除的利用 - Finecms前台任意文件上传系列漏洞 > - 特点 - 后端接收压缩包 - 解压压缩包 - 在当前目录递归删除非法文件 - 利用 - 竞争:删除文件前,访问webshell并在上层目录写入新的webshell ### 忘记上锁的数据库 - 乌云某处刷人民币漏洞成功提现 > - 过程 1. 查询用户余额 2. 查询购买商品的价格 4. 判断:用户余额>商品价格 4. 用户余额=用户余额-价格 - 漏洞 - 多线程并发请求 - 多次执行步骤4->余额变负 ->成功购买多个商品 ### 鸡肋文件包含的利用 - 链家旗下自如某站一个有意思的文件包含到简单内网渗透 - 文件上传时,用户会先发一个文件的数据包给服务器,服务器先将用户文件存到临时文件夹中。临时文件名随机,但是内容用户可控。这里找到了一个phpinfo,phpinfo会将临时文件的文件名显示出来。 - 漏洞 - 本地文件包含漏洞 - 无法利用? - 利用 - 寻找临时文件泄露点->phpinfo - 线程1:上传文件并通过phpinfo获取临时文件名,上传一个大文件,10秒才能上传完,确保不会很快被删除。 - 线程2:包含该文件,生成webshell ## 思考 - 脑洞的重要性 - 举一反三 - web思路的通用性 - 多看文档,理解开发思维
别卷了
2024年10月12日 16:54
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码