记一次省赛总结

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

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

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

        1.备份源码

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

        2.布置抓取流量的waf

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

https://github.com/dr0op/k4l0ng_WAF

        3.扫后门,找洞

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

        4.写批量脚本

        此次比赛本科组一共有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。

posted @ 2018-11-14 16:56 tr1ple 阅读(...) 评论(...) 编辑 收藏