Hackergame 2022

一、flag的痕迹

image-20221101180124573

下载源码后备用

这道题还有个登录界面,尝试爆破,无果

于是去网上找是否存在漏洞,都没有用

image-20221101180313053

其中的revision功能也被关闭

其实面对这么多的源码,我也是无从下手,还没开始就放弃了。。。这是个坏毛病

审计doku.php,也就是主页

传入参数do只有show一个功能

image-20221101180605428

at参数进入,执行strtotime函数后,进入if

image-20221101162414120

继续if判断,注释大概意思就是找到和at参数有关的$rev,这个rev参数必须是具体的时间戳,无法利用

image-20221101162540241

进入getLastRevisionAt函数,注释说返回一个存在的修订,而我们给出的时间要大于或等于存在的修订最后修改的时间

1、at参数大于最后一次修改的时间,返回当前版本(‘ ’ for current,而返回‘ ’的条件就是>=)

2、at参数处于两次修改的时间之间时,返回前面一次修改的版本,并且右下角显示前一次修订的时间戳(返回false,因为上图中的$lang[‘page_nonexist_rev’])

3、at参数大于第一次创建的时间,并且小于最后一次修改的时间,会在右下角显示最后一次修改的时间,同时主页提示这是旧的版本

image-20221101170402645

image-20221101172304649

image-20221101172330237

而flag肯定就在第一次创建和最后一次修改的时间之间,然后我们从最后一次修订的时间向前查找(根据右下角的时间戳)

最后一次修订的时间是2022/10/21 02:53,将其转换为时间戳,约为1666320780

访问后,右下角出现前一次修订的时间戳,为1665224470

编写脚本:

其实总共也就修订了两次,很快就找到了

image-20221101175946327

总结:

这道题考验一个定位关键代码和理解代码的能力

二、微积分计算小练习

image-20221104091849358

下面是题目的源码(接收成绩链接):

image-20221104092031132

注意到其中的driver.execute_script(f'document.cookie="flag={FLAG}"')

1、driver获取到的是该主机上的浏览器,并且设置了该浏览器的cookie为flag

2、也就是说我们要在当前页面执行js命令,获取到该浏览器的cookie

3、greeting获取到的就是我们的姓名,该参数可控,我们可以从这里注入

但是在cookie中设置flag之前,driver请求了练习网站,并且获取到的是练习网站上的内容,那我们在姓名中注入js代码,获取到cookie,那么在设置了flag之后,driver获取到的内容就是存在flag的cookie了

XSS注入

  1. 尝试 <script>alert('xss')</script>

    image-20221108152739158

发现<script>标签无法执行

​ 2.尝试 <img> 标签

<img src=1 onerror="alert(document.cookie)">

​ 虽然报错了,但flag还是显示出来了

image-20221108153458200

当然也可以利用下面的score:

<img src=1 onerror="document.querySelector('#score').innerHTML=document.cookie">

三、XCapture

题目的大致要求就是在一秒之内完成三个加法运算,如下图:

image-20221108164858675

我首先想到的就是python正则,完成三个加法并提交

但是也遇到了问题,我们并不能简单的获取加法然后提交,还需要获取服务端返回的 set-cookie 的值

如果没有,就会提交失败

而 set-cookie 中的session的值应该就是为了维持一秒的会话,一秒之内未完成该会话结束

那么再多一步获取set-cookie的步骤就行了

脚本:

import requests
import re

url="http://202.38.93.111:10047/xcaptcha"
headers={"Cookie":"session=.eJwVkMtKA2EMhd9ltjPQP_ek4GKQaZ2CVNRe7E5qLbXSIlSpFd_duMzJ-ZKT_FSnzflUDStQVUEMCHAkdCvUEJKYYLhZsSJOBSlcUwLUcBJ1FShNZFkYnUEcCjq5sgUYc7KRSoAyN0KBwVzSWtygqCE7ASiBipesQZ2biEABYUg7FSY0yzxhSs6eNEZoNBBo2UPMCAaMookE_Mtpg2BxJpMGwwpbjnYtRqzEoAWTNUcJs9ziEVVTnY77zSEfkYFseNvNrvvR9tvykMFkuV6cv-bjQ0eXbuLbt7qrX7iu4VLLVNevy5txu-va43TVt6Pnj8F-PnsYFx0h3_dPq3bQ3l1m08_R42I32-3X-N73V9XvH5p8WOY.Y1UhZg.lLYuui7-WlY9iTWkh_pvKF954L4"}
res=requests.get(url,headers=headers)
resp=res.text
setcookie=res.headers["Set-Cookie"]

pattern1='captcha1">(\w+)\+(\w+)'
pattern2='captcha2">(\w+)\+(\w+)'
pattern3='captcha3">(\w+)\+(\w+)'

pattern4='session=(\S+);'

matches1=re.search(pattern1,resp)
matches2=re.search(pattern2,resp)
matches3=re.search(pattern3,resp)
matches4=re.search(pattern4,setcookie)

result1=int(matches1.group(1))+int(matches1.group(2))
result2=int(matches2.group(1))+int(matches2.group(2))
result3=int(matches3.group(1))+int(matches3.group(2))

data={"captcha1":result1,"captcha2":result2,"captcha3":result3}

print(resp)
print(data)
headers2={"Cookie":"session="+matches4.group(1)}
resp2=requests.post(url,data,headers=headers2).text
print(resp2)

四、总结

现在也还是只能做一些简单的题目,自己代码审计的能力还需要加强,做题的思路太死板,还需要多加努力