[杭电Hgame]2021web week1(请求头+js代码审计+sympy解定积分+已知明文攻击)

本文介绍了在杭电Hgame的web挑战中,如何通过修改请求头获取flag,利用sympy解决数学问题,以及实施已知明文攻击解密压缩文件的过程。挑战涉及HTTP请求头的User-Agent和referer,JavaScript代码审计,以及使用sympy求解定积分。同时,文章讲解了已知明文攻击的原理和在遇到加密压缩包时如何利用此方法解密。
摘要由CSDN通过智能技术生成

Hitchhiking_in_the_Galaxy

F12后有个php文件,这个就是顺风车,但是直接点是打不开的,所以我们尝试抓包改请求头
在这里插入图片描述
直接把请求的页面换成这个,看响应信息,所请求方法错误,那就换POST呗
在这里插入图片描述
发现说要什么什么引擎,我还去百度了这个鬼东西,没啥用,估计就是随便找了一个高大上的东西
在这里插入图片描述
后来想到引擎就想到了User-Agent,改了一下还真是
在这里插入图片描述
下一步就是改referer了呗
在这里插入图片描述
然后就是xff了,flag出现
在这里插入图片描述

watermelon

知乎有破解的解析
直接搜SetScoreTween后把e改成2000,但是好像不管用,没有flag出来
在这里插入图片描述

搜索createOneFruit,把e设置成1就会一直掉小西红柿,一直玩到2000分就会弹出flag
在这里插入图片描述
方法二:
直接改判断条件,导航

智商检测鸡

这题要求解100题积分,积分的格式很单一,所以可以写脚本来做

  • 涉及sympy库的integrate()函数,解定积分的,这篇文章写了比较全的这个库的用法;
  • 涉及round()函数,四舍五入的保留小数点多少多少位
    在这里插入图片描述

这里记录一下这个函数解定积分的的用法:

integrate(执行的表达式,(未知数,上值,下值))

第一个参数是执行的表达式,第二个参数是一个括号,里面第一个值是所代入的未知数,第二个值是下面的数字,第三个值是上面的数字
比如第一个题目的定积分:
int(d) * x + int(e)就是表达式12x+17
int(a + b)是-92
int(c)是31
在这里插入图片描述

integrate(int(d) * x + int(e), (x, int(a + b), int(c)))

首先我们把解定积分的脚本写好
可以看到这个题目是给的一个json格式,而且是html的样子,可以树化
在这里插入图片描述
解定积分大概就这样就行

import requests
from sympy import *
import json
from lxml import etree


question=requests.get('http://r4u.top:5000/api/getQuestion').text
ques=json.loads(question)['question']
q=etree.HTML(ques)

a=q.xpath('//math/mrow/msubsup/mrow[1]/mo/text()')[0] #下面的数字的符号
b=q.xpath('//math/mrow/msubsup/mrow[1]/mn/text()')[0] # 下面的数字
c=q.xpath('//math/mrow/msubsup/mrow[2]/mn/text()')[0] # 上面的数字
d=q.xpath('//math/mrow/mn[1]/text()')[0] # x的系数
e=q.xpath('//math/mrow/mn[2]/text()')[0] # 后面加的常数

x = symbols('x') # 定义x变量(sympy库的规则)

y = integrate(int(d) * x + int(e), (x, int(a + b), int(c)))
ans=round(y,2)

print(a,b,c,d,e,ans)

运行结果正确
在这里插入图片描述
随便提交一个数据,发现会以一个这样的格式提交上去,而且方式是POST,地址也换了一个
在这里插入图片描述在这里插入图片描述
接下来构造请求信息,注意这个回答应该是一个字符串的形式,不然会因为json把字典转成字符串时报错

data={'answer':str(ans)}
header={'Content-Type': 'application/json;charset=UTF-8'}

因为要连续的做题,所以开启session来发起请求,成功了
在这里插入图片描述
看到这个函数,知道解完了题目后会访问这个地址得到flag
在这里插入图片描述
最终的脚本

import requests
from sympy import *
import json
from lxml import etree
# 开启session会话
s = requests.session()
# 循环解题100道
for i in range(100):
    question=s.get('http://r4u.top:5000/api/getQuestion').text
    #题目是以json格式给出,使用loads将他转化成字典
    ques=json.loads(question)['question'] 
    # 树化这个信息
    q=etree.HTML(ques)
	# 把参数全部用xpath爬取出来
    a=q.xpath('//math/mrow/msubsup/mrow[1]/mo/text()')[0]
    b=q.xpath('//math/mrow/msubsup/mrow[1]/mn/text()')[0]
    c=q.xpath('//math/mrow/msubsup/mrow[2]/mn/text()')[0]
    d=q.xpath('//math/mrow/mn[1]/text()')[0]
    e=q.xpath('//math/mrow/mn[2]/text()')[0]
	# 定义变量x
    x = symbols('x')
    # 解出定积分
    y = integrate(int(d) * x + int(e), (x, int(a + b), int(c)))
    # 保留两位小数
    ans=round(y,2)
	# 构造请求信息
    data={'answer':str(ans)}
    header={'Content-Type': 'application/json;charset=UTF-8'}
    # 发起post请求提交答案
    res=s.post('http://r4u.top:5000/api/verify',data=json.dumps(data),headers=header).text
    # 在解完100道题目的时候把flag打印出来
    while i ==99:
        flagres=s.get('http://r4u.top:5000/api/getFlag').text
        print(flagres)
        break

运行结果
在这里插入图片描述

不起眼压缩包的养成的方法

学到一个新的东西叫做已知明文攻击

我们为zip压缩文件所设定的密码,首先被转换成3个32bit的key,所以可能的key的组合是2^96,这是个天文数字,如果用暴力穷举的方式是不太可能的,除非你的密码比较短或者有个厉害的字典。
压缩软件用这3个key加密所有包中的文件,也就是说,所有文件的key是一样的,如果我们能够找到这个key,就能解开所有的文件。
如果我们找到加密压缩包中的任意一个文件,这个文件和压缩包里的文件是一样的,我们把这个文件用同样的压缩软件同样的压缩方式进行无密码的压缩,得到的文件就是我们的Known plaintext(已知明文)。用这个无密码的压缩包和有密码的压缩包进行比较,分析两个包中相同的那个文件,抽取出两个文件的不同点,就是那3个key了,如此就能得到key。两个相同文件在压缩包中的字节数应该相差12个byte,就是那3个key了。虽然我们还是无法通过这个key还原出密码,但是我们已经可以用这个key解开所有的文件,所以已经满足我们的要求了,毕竟对我们而言,得到解压后的文件比得到密码本身更重要。

看题目名字就知道应该把后缀改成zip,发现有密码,通过注释知道不仅可以爆破,也可以去搜图,p站这幅图有个id,这就是密码70415155

打开后还有一层加密的压缩包,看里面同样有一个NO PASSWORD.txt文件,看到CR32值一样的时候就知道是明文攻击
txt文件里说道了储存,所以把改txt文件已储存方式压缩一下,然后开ARCHPR进行明文攻击就可以了,拿到密码C8uvP$DP,发现还有一个加密的压缩文件,直接010editor打开,里面有一段html编码,解码就是flag
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

huamanggg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值