记一次省赛总结

        一个队伍有三我的,比赛环境中每一个队伍有两台靶机,两台靶机上有两个web。php

        比赛一共三个小时,前30分钟为修复时间,后两个半小时为对抗时间,每一个靶机上都有一个flag,flag半小时刷新一轮。git

        根据以往的线下赛的经验,在加固阶段要作的有:github

        1.备份源码web

              两台靶机,一我的进行备份已经足够,windows平台上使用scp就行,十分方便,比赛给的两个web都是php写的。数据库

        2.布置抓取流量的wafwindows

              线下赛布置waf很重要,可以第一时间反应过来本身是怎么被打的,waf 用的是下面这一款,可以记录详细的攻击流量,而且对于一些常见的攻击也可以阻挡,具体的布置方法就是找web目录下全部文件都会包含的config.php或者对于框架性web来讲直接找入口文件index.php,而后只需在index.php或config.php中对waf进行包含就能够了,通常放在文件的最前面,包含结束之后,由于waf会进行写日志文件,因此须要给waf写文件的权限,通常靶机的权限是可以给waf chmod写权限的数组

https://github.com/dr0op/k4l0ng_WAF

        3.扫后门,找洞cookie

             按照出题人的通常套路,总会在web目录下的某个文件下留个后门,因此可使用提早准备好的D盾对以前已经备份下来的web源码进行后门扫面,web1是用原生的php写的,在扫面后检测到web1的目录中发现了n多后门,因此此时应该迅速把全部预留的后门注释掉,而且记下相应的路径,放在批量脚本中。web2是一个框架应用,只存在一个后门,在用D盾扫事后发现后门直接注释便可,除了后门之外就须要手工找洞了。mvc

        4.写批量脚本app

        这次比赛本科组一共有44个队伍,所以手动提交flag确定很慢,所以批量提交flag的脚本须要提早准备好,咱们比赛中使用的是学弟写的脚本,脚本会自动读取flags.txt中的flag,其中的格式必须是“ip+----+flag”,flags.txt的flag是批量攻击脚本中写入的

import requests

ips = []
flags = []
def submit_flag_auto(ip,flag):
    url = "http://192.168.80.1/lms/portal/sp/hz_flag.php"
    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36",
        "Referer": "http://192.168.80.1/lms/portal/sp/hz_flag.php",
        "Cookie": "SSCSum=11; zlms-sid=hqfg26bm4766uanj9vm3fel9f7; webcs_test_cookie=lms_cookie_checker; lms_login_name=302-13"
    }
    data = {
        "melee_ip":ip,
        "melee_flag":flag
    }
    response = requests.post(url,headers=headers,data=data)
    print(response.text)

with open("flags.txt","r",encoding="utf-8")as f:
    for line in f.readlines():
        line = line.strip()
        line = line.split("----")
        ip = line[0]
        flag = line[1]
        ips.append(ip)
        flags.append(line)

for i1,i2 in zip(ips,flags):
    submit_flag_auto(i1,i2)

          在攻击阶段要作的是:1.利用已有的exp打;2.挖新的洞:3.权限维持

          web2是ashop,也是基于mvc的形式,目录结构以下所示

        index.php也就是入口文件,static和view一般是一些静态文件,config是配置文件,data是数据库文件,model是和数据库交互的文件,那么就须要审计controller文件夹和core文件夹,由于逻辑都在这两个文件夹中,咱们在比赛中主要找到了两个web2的洞,一个任意文件读取,一个反序列话漏洞。

       反序列化漏洞:

       

 

在index.class.php文件中能够发现这一句,为客户端设置了一个cookie值,而且在login.class.php中进行解序列化,因此咱们只须要将payload替换了原始的AshopToken,而后访问login.php就能够触发反序列化漏洞。

因此咱们只须要在客户端替换AshopToken值就能够读取flag文件了.

      任意文件读取:

     

  在index.class.php中存在这样一个show_pic()函数,能够看到最终会调用file_get_contents函数读取$pic变量,那么$pic变量又是调用get函数之后的返回值,在这里咱们跟踪get函数,在core文件夹下面存在init.php文件,里面存在以下代码:

    get函数会对超全局数组GET进行transcribe函数,而且检测$_GET[$str]变量是否存在,若存在则返回此变量的值,那么transcribe函数又是进行了什么操做?

  

 transscribe函数实际上会对GET函数消毒处理,可是对于任意文件读取漏洞并不起做用,因此咱们只要访问show_pic.php?file=../../../../../../../flag.txt就能访问到flag文件了。

         比赛中的不足:

    虽然提早准备了不死马,可是并无利用漏洞布置上去,因此下次比赛中应该手速快一点,先利用漏洞布置不死马维持好权限,接下来再批量拿flag。

相关文章
相关标签/搜索