基于Sqli-Labs靶场的SQL注入-1~4关

2023-11-13

less-1~Less4联合注入讲解


目录

less-1:基于字符型(单引号)注入点的联合注入

注入类型判断

猜解数据库中字段数

        爆破数据库库名以及版本号

爆破数据库中的表名以及数据库安装路径

      爆破某张表中的列名以及当前数据库的用户名     

查询每一列的具体字段内容

less-2:基于整数型注入点的联合注入

注入类型判断

 less-3:基于 ') 注入点的联合注入

 注入类型判断 

less-4:基于 ") 注入点的联合注入

注入类型判断


less-1:基于字符型(单引号)注入点的联合注入


        我们首先进入第一关:

        可以看到提示我们“请输入 id 作为带有数值的参数”,我们在网址后添加 ?id=1 作为参数,发现页面变化如下:

         再次输入id=2测试,页面返回如下:

         可以看到随着我们输入的参数不同,页面的返回情况不同,这就说明我们输入的这个参数被带入到了数据库中执行了,也就是我们在前端输入的参数和其后端的数据库有交互。

注入类型判断

        接下来我们尝试寻找注入点,在我们输入的参数后加一个单引号(“ ' ”)进行测试,发现页面报错:

         当我们在参数后边输入一个字符单引号(“ ' ”)时,前端页面发生报错,说明后端对一些特殊字符没有做很好的过滤处理,这个时候就会存在sql注入漏洞,并且注入点很有可能就是字符型。

        接下来我们去解析一下为什么输入单引号(“ ' ”)页面会发生报错,我们首先看一下这个网页的源代码:(D:\phpStudy\PHPTutorial\WWW\sqli-labs-master\Less-1,找到自己的下载路径就可以看到php源代码)

         可以看到源代码中的sql查询语句为:

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

        其中id='$id'就是我们传入的参数,当我们执行“ id=1' ”的时候实际上执行的语句是:

$sql="SELECT * FROM users WHERE id='$id'' LIMIT 0,1";

        这样这条sql语句就会因为单引号(“ ' ”)的干扰而无法正常执行,从而报错。一旦出现并且页面给了我们报错的回显,就说明存在sql注入,接下来我们就要寻找注入点了。当参数可控时,看参数是否对数据产生影响,若有影响则可能是注入点。

        我们首先测试是不是单引号的字符型注入,输入语句:

?id=1' and '1'='1

        进行测试,实际执行的sql语句为:

$sql="SELECT * FROM users WHERE id='1' and '1'='1' LIMIT 0,1";

        and '1'='1' 这个语句一定是真的,所以如果是单引号的字符型注入,那么页面无论如何也会返回正常:        

        之后我们在输入语句:

 ?id=1' and '1'='2

         进行测试,实际执行的sql语句为:

$sql="SELECT * FROM users WHERE id='1'' and '1'='2' LIMIT 0,1";

        and '1'='2' 这个语句一定是假的,所以如果是单引号字符型注入那么页面一定显示不正常(但是不会出现报错):        


         页面显示不正常,说明注入点就可能是单引号(“ ' ”),这里只能推断出可能是这种类型,后面如果爆破语句能够爆破成功的话,就是单引号类型的注入,如果爆破报错的话还需要进一步测试,例如第三关。我们在单引号(“ ' ”),之后输入我们的注入语句即可。

猜解数据库中字段数

        找到注入点之后我们要去猜解该数据库中有多少个字段,因为该靶场使用的是mysql数据库,所以用 order by x 语句进行判断(order by x 语句解析:https://www.w3school.com.cn/sql/sql_orderby.asp)。

        使用 order by x 进行猜解的时候可以使用二分法进行猜解,先使用大一点的数字数字进行测试,如果报错就换数字的一半进行测试,当范围缩小时在依次测试,例如这里先假设数据库中有8个字段进行测试:输入语句:

?id=1' order by 8 --+ 

        (--+为注释,将--+之后的语句都注释),输入语句后执行发现页面报错:

        说明该数据库的字段数小于8,之后我们用4进行测试也报错,再用3进行测试时发现页面回显正常,说明数据库中有3个字段:

         接下来我们要判断页面有没有显示位,显示位能显示多少数据,我们使用联合查询去判断( 联合查询语句解析:https://www.runoob.com/sql/sql-union.html

        我们输入语句:

?id=-1' union select 1,2,3 --+ 

        这里我们输入的参数变为了“ -1 ” 原因是为了页面不显示之前的查询结果,因为union操作符用于合并两个或多个 SELECT 语句的结果集,如果输入?id=1' 那么页面回显的就是后端第一次查询到的内容,并不会回显我们想要的内容,如下:

        位于?id=1'后面的union语句并没有被回显出来,当输入id=-1'时页面回显如下:

        可以看到页面的显示了2,3列,而第1列并没有被显示出来,也就是说我们的注入语句要写到2列和3列的位置上才可以被页面回显出来 。

        举例来说,比如我们通过order by命令知道了表的列数为20。然后再使用union select 1,2,3…,20 from table,网页中显示了信息8,那么说明该网页只能够显示第8列中信息,不能显示其他列的信息。也可以理解为该网页只开放了8这个窗口,你想要查询数据库信息就必须要通过这个窗口。所以如果我们想要知道某个属性的值,比如id,就要把id属性放到8的位置上,这样就能通过第8列爆出id的信息。

联合注入常用函数
system_user() 系统用户名
user() 用户名
current_user() 当前用户名
session_user() 链接数据库的用户名
version() 当前数据库的版本
@@basedir 当前数据库的安装路径
@@version_compile_os 当前数据库的操作系统
information_schema 保存着关于MySQL服务器所维护的所有其他数据库的信息。
tables 储存了数据库库名,以及该库中包含的表名
table_schema 表示数据库名
table_name  表示表名
column_name   表示列名
columns      存储了字段名

        爆破数据库库名以及版本号

        我们输入注入语句:      

?id=-1' union select 1,database(),version() --+

        页面回显如下:

爆破数据库中的表名以及数据库安装路径

         输入注入语句:

?id=-1' union select 1,group_concat(table_name),@@basedir from information_schema.tables where table_schema='security' --+

        页面回显如下:

        上面的代码翻译一下其实就是“从information_schema数据库中的tables表中查找数据库security所含有的表有哪些,并且将查出来的表用逗号分隔开显示” ,同时查询当前数据库的安装路径并且返回到显示位3上面

        

      爆破某张表中的列名以及当前数据库的用户名     

        输入注入语句:

?id=-1' union select 1,group_concat(column_name),user() from information_schema.columns where table_name='users' and table_schema='security' --+

        页面回显如下:

        想要显示其他表的话直接把语句中的table_name='users' 里面的users换为其他表名就可以。 

查询每一列的具体字段内容

        输入注入语句:

?id=-1' union select 1,group_concat('~',id,'~',username,'~',password),3 from users --+

         页面回显如下:

         到此为止,第一关就结束了。

less-2:基于整数型注入点的联合注入


        首先进入第二关:

        可以看到和第一关一样让我们输入参数,我们输入 ?id=1 测试页面的回显:

        页面回显正常,说明前端输入的参数和后端的数据库有交互,接下来输入单引号 “ ' ” 来测试页面是否存在漏洞:

        可以看到报错了,说明百分之90该页面存在注入漏洞,只要找到注入点就可以进行注入,有时候并不会显示报错,但是也不代表不存在漏洞,可以通过页面响应时间等方法进行判断,后续我将更新这些判断方法。

注入类型判断

        接下来我们判断注入点是什么,我们先判断其是不是字符型注入,使用语句:

?id=1' and '1'='1
?id=1' and '1'='2

        我们发现当我们输入第一个测试条件的时候页面回显了报错:

         但是按道理来讲,and '1'='1 是永远成立的,不应该报错,那么只有一种可能,那就是他底层SQL语句查询功能中写入的参数并不是字符型,所以当我们输入多个单引号后,SQL语句无法执行从而报错。我们查看一下源代码验证我们的猜想:

        可以看到和第一关源代码不同的是SELECT查询中WHERE条件后的参数并没有用单引号进行闭合,所以是“整数型注入”。一般情况下如果“单引号字符型”不行的话就去试试是不是“整数型注入” 

        我们在输入测试语句:

?id=1 and 1=1

        页面回显:

        可以看到页面回显正常,之后再用测试语句:

?id=1 and 1=2

        页面回显:

        可以发现页面回显不正常,说明注入类型是整数型注入,之后的操作和第一关的操作一样,只不过不需要在参数后面加单引号闭合而已,这里就不再赘述了。 

 less-3:基于 ') 注入点的联合注入


        首先进入第三关:

        输入参数判断与后台数据库有无交互:

        页面回显正常,web页面与后台数据库有交互。

        注入类型判断 

         首先输入单引号查看页面回显:

         页面回显错误,但是与之前不同的是报错内容中多了一个单括号,我们首先测试是不是单引号的字符型注入,输入语句:

?id=1' and '1'='1

        页面回显如下:

        页面回显正常,我们接着输入语句:

?id=1' and '1'='2

         页面回显如下:

        页面回显不正常,说明有可能是单引号的字符型注入 ,接下来我们尝试使用一条注入语句测试一下能不能正常回显出我们想要的语句,我们就用ORDER BY语句测试一下当前数据库中有几条字段,输入语句:

?id=1' order by 8 --+

        页面回显如下:

        可以看到页面报了SQL语法错误,但是正常报错应该是“Unknown column '8' in 'order clause”,那就说明我们的注入点有问题,可能并不是基于单引号的字符型报错,之前我们输入单引号测试的时候多了一个单括号,我们知道在SQL语句中,where后的查询参数可以用括号括起来,我们猜测一下这一关的参数就是用括号括起来的,我们输入 ') 进行测试,输入语句:

?id=1') and 1=1 --+

        页面回显如下(需要用注释注释掉后面的语句):

        页面回显正常,接着输入注入语句:

?id=1') and 1=2 --+

        页面回显如下:

        页面回显不正常,那么可能就是基于 ')  的注入类型,接着输入一个简易的注入语句测试一下,这里依旧用ORDER BY 语句测试,输入注入语句:

?id=1') order by 3 --+

        页面回显如下:

        可以发现页面回显正常,因为之前查到了字段数为3,这里就不再进行猜解了,如果字段数小于3的话会报错“Unknown column '3' in 'order clause” ,接下来我们看一下网页的源代码:

         可以看到参数是在括号里面的,我们的猜想是正确的。

        到这里我们就知道这第三关的注入类型是基于 ') 的注入,下面的爆破方法和第一关一样,这里不再赘述,只需要把注入点改为 ') 就可以了。

less-4:基于 ") 注入点的联合注入


        首先我们进入第四关:

        输入参数id=1进行测试页面的交互:

         回显正常,Web与后台数据库有交互。

注入类型判断

        输入单引号进行测试:

        奇怪的是我们发现并没有报错,那么就有可能是数据库后台把单引号过滤了,既然单引号类型被过滤了,那么我们就去测试双引号(一般来说都是这样一个一个测试,不过如果有经验的话测试一次看页面回显的报错情况就能大致知道是什么类型的注入),我们输入注入语句:

?id=1"

         页面回显如下:

        页面报错并且爆出了单括号,根据第三关的经验我们首先测试是不是基于 ")  的注入类型 ,输入注入语句:

?id=1") and 1=1 --+

        页面回显:

        再次输入注入语句:

?id=1") 1=2 --+

         页面回显:

         页面回显不正常但是没有报错,说明有可能是基于 ") 的注入类型,接下来我们输入ORDER BY 语句进行测试:

?id=1") order by 3 --+

         页面回显如下:

          可以发现页面回显正常,因为之前查到了字段数为3,这里就不再进行猜解了.

        到这里我们就知道第四关的注入类型是基于 ") 的注入,下面的爆破方法和第一关一样,这里不再赘述,只需要把注入点改为 ") 就可以了。

总结

        这里对SQL注入进行了初步的讲解,主要讲解了联合注入以及一些简单的注入类型判断,后续我会更新其他系列的注入方式,例如报错注入、二分法猜解注入、时间延迟注入、导出文件字符型注入、POST类型注入等注入类型。

        第一次写博客,感谢观看,如有错误,请及时私聊指正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Sqli-Labs靶场的SQL注入-1~4关 的相关文章

  • 我不断收到此 mysql 错误代码 #1089

    CREATE TABLE movies movie movie id INT 3 NULL AUTO INCREMENT movie name VARCHAR 25 NULL movie embedded id VARCHAR 50 NUL
  • MySQL,连接两列

    MySQL 表中有两列 SUBJECT and YEAR 我想生成一个字母数字唯一编号 其中包含主题和年份的串联数据 我怎样才能做到这一点 是否可以使用像这样的简单运算符 您可以使用CONCAT http dev mysql com doc
  • 当我尝试计算 mysqli 结果时,为什么会收到警告?

    下面的代码会导致此警告 警告 count 参数必须是数组或实现 Countable 的对象 为什么要这样做 如何防止出现警告 if isset GET edit sonum GET edit update true result mysql
  • 如何使用Python3.4在tornado中进行异步mysql操作?

    我现在使用Python3 4 我想在Tornado中使用异步mysql客户端 我已经发现torndb https github com bdarnell torndb但在阅读其源代码后 我认为它无法进行异步mysql操作 因为它只是封装了M
  • mysql时间比较

    我有 job start 和 job end 时间 timediff 会给我时间差 现在我想看看这项工作是否花费了超过 2 小时 30 分钟 我如何比较它 如果我这样做 我会收到错误 timediff job start job end g
  • 转义用户数据,无需魔法引号

    我正在研究如何在来自外部世界的数据被用于应用程序控制 存储 逻辑等之前正确地对其进行转义 显然 随着 magic quote 指令在 php 5 3 0 中很快被弃用 并在 php6 中被删除 对于任何想要升级并进入新语言功能 同时维护遗留
  • DataTables 第 2 页的分页未调用放大弹出窗口

    所以我有这个启用分页的数据表 我编码了一种方式 以便用户可以编辑表的行 当用户调用它在放大弹出窗口中打开的编辑页面时 它在第 1 页 从第 2 页起都运行良好 DataTable 及其前面停止调用 Magnific Popup 我只是不明白
  • 蟒蛇 | MySQL | AttributeError:模块“mysql.connector”没有属性“connect”

    我正在学习 python 中的一个新库 mysql 我尝试执行以下命令 import mysql connector mydb mysql connector connect host localhost user root passwd
  • 批处理文件并与数据库比较

    目前我正在开发一个 Spring Boot 应用程序 该应用程序定期尝试处理包含用户数据的文件 其中每行都包含userId and departamentId隔开 例如123534 13 该文件将包含数百万条记录 我的要求是以这样的方式将此
  • 控制数据是否存在于数组中

    我在mysql中有两个不同的表 我正在使用curl从json文件中获取数据 我的第一个表名称是 tblclients 该表存储客户端数据 我的第二个表名称是 tblcustomfieldsvalues 该表使用 tblclients 表的
  • Mysql加密/存储敏感数据,

    我的 PHP 网站有以下内容 启用 SSL 饼干 session set cookie params cookieParams lifetime cookieParams path cookieParams domain secure ht
  • 错误 1305 (42000):保存点...不存在

    我的 MYSQL 数据库中有这个 SQL 存储过程为空 所以我猜没有隐式提交 DROP PROCEDURE IF EXISTS doOrder DELIMITER CREATE PROCEDURE doOrder IN orderUUID
  • 如何统计订单总价?

    我有这些表 Orders id status user id address id 1 await 1 1 products id name price quantity 1 test1 100 5 2 test2 50 5 order p
  • mysqli_num_rows 无法正常工作

    I have an admin panel in my website in which the admin creates new pages he provides the page name and then the spaces o
  • 执行mvn sql:execute时出错

    我希望 Maven 执行该 sql 文件 它生成的数据库模式稍后将在我的程序中使用 但它不起作用 可能是由 DELIMITER 引起的 当我执行 mvn sql execute 时 它会打印出 ERROR Failed to execute
  • MySQL 中的 INSERT 和 UPDATE 有什么区别?

    它似乎INSERT and UPDATE对我做同样的事情 有什么场合我应该使用INSERT代替UPDATE反之亦然 In 增删改查操作 http en wikipedia org wiki Create read update and de
  • Mac 上的 Emacs 和 MySQL

    我尝试使用 sql mysql 模式 但 emacs 无法找到文件 目录 mysql 但是 我可以从终端访问它 如何将 emacs 中的 mysql 指向 usr local mysql bin mysql setq sql mysql p
  • 对不同的数据库和表进行一次性查询

    我有一个 Rails 应用程序 侧面有一个 WordPress 博客 完全单独位于 blog 客户想要 Rails 应用程序主页上的最新博客文章 因此我需要对 word press 数据库进行一次性 mysql 查询 我将如何在 Rails
  • InnoDB:使用事务批量插入或组合多个查询?

    做批量的时候INSERT在InnoDB中 我应该使用事务吗 START TRANSACTION INSERT INTO tbl name a b c VALUES 1 2 3 INSERT INTO tbl name a b c VALUE
  • 导轨中的多个 DB 连接

    我正在尝试在 ROR 应用程序中连接多个数据库 我的 database yml 如下所示 在你的database yml文件中 发展 adapter mysql username root password database example

随机推荐

  • TeX Live for windows 安装及更新

    下载 install tl windows exe 或者install tl zip压缩包 解压之后右键以管理员身份运行install tl advanced bat 可以从官网下载 国内有镜像安装源 例如 https mirrors tu
  • Python智能合约开发指南(以太坊+web3py)

    在以太坊上获得一个基本的智能合约是一个很简单的事 只需google查询 ERC20代币教程 你会发现有关如何做到这一点的大量信息 以编程方式与合约交互完全是另一回事 如果你是一个Python程序员 那么教程就很少 所以写这个Python中的
  • java的队列实现方法_Java实现队列的三种方法集合

    数组实现队列 数组实现队列 class queue int a new int 5 int i 0 入队操作 public void in int m a i m 出队列操作 取出最前面的值 通过循环遍历把所有的数据向前一位 public
  • fairygui简单使用(unity)

    本文主要是引导怎么从fairygui页面ui编辑到unity的过程 如果想详细的那种 最好下载一个官方案例 里面都有详细的教程 不过这个对于新手来说还是挺好的 因为我刚开始以为是自己创建代码 自己写 先去官网下载一个gui编辑器 这是API
  • utf-8和gb2312的相互转换

    最近老是涉及到编码与解码的问题 GB2312转UTF 8 又或者UTF 8转GB2312 无意中在CSDN闲逛发现了一个CString 转UTF 8的思路 现摘寻下来 免得到时又找不着了 CString UTF8Convert CStrin
  • GDB 调试过程

    一 gdb 1 gdb 启动gdb 2 gdb tui 启动gdb 并且分屏显示源代码 3 gdb app 启动gdb调试指定程序app 4 gdb
  • WebSocket 前端使用

    h5提供了WebSocket网络协议 可以实现浏览器与服务器的双向数据传输 构造函数 WebSocket url protocol url WebSocket API URL URL之前需要添加ws 或者wss 类似http https p
  • FastICA代码(matlab版本)

    icasig A W fastica eegdata approach symm g tanh function Out1 Out2 Out3 fastica mixedsig varargin FASTICA Fast Independe
  • 后端开发学习Vue(一)

    Vue的介绍 官网 https cn vuejs org Vue是一个简单容易上手前端框架 例如 下面的代码可以快速构建一个表格
  • Redis数据结构存储系统:第二章:如何使用,BAT等大厂必问技术面试题

    public class RedisUtil private JedisPool jedisPool public void initPool String host int port int database 一线大厂Java面试题解析
  • map与java bean相互转换

    map与java对象的相互转换 1 使用org apache commons beanutils转换 2 使用Introspector转换 3 使用reflect转换 4 使用net sf cglib beans BeanMap转换 5 使
  • ubuntu 强制关闭卡死的pycharm

    ubuntu 环境是 16 04 终端输入 monitor 点击 System monitor 之后输入java 上图是已经删除过的 找到java之后右键点击kill OK
  • Vue(五)&&git

    Vue 三十二 git 1 概述 Git和代码托管中心 2 常用命令 3 本地仓库 4 远程仓库 5 团队内协作 1 非冲突 2 冲突 3 可视化 6 跨团队协作 7 分支 1 分支的好处 2 分支的构建 3 合并分支 8 SSH免密登录
  • html方框打勾字段,HTML+CSS入门 如何设置 checkbox复选框控件的对勾√样式

    本篇教程介绍了HTML CSS入门 如何设置 checkbox复选框控件的对勾 样式 希望阅读本篇文章以后大家有所收获 帮助大家HTML CSS入门 lt 我们要创建方框中的对勾 对于这一点 我们可以使用 after伪类创建一个新的元素 为
  • echarts中toolbox增加自定义图标和事件

    1 echarts提供了丰富的图标 如提供了 saveAsImage保存图片 restore 配置项还原 dataView数据视图工具 dataZoom 数据区域缩放 magicType 动态类型切换 brush 选择组件的控制按钮等 2
  • 开学第五周刷题记录

    Crypto Windows系统密码 首先拿到题目 我们打开看一下 它后缀是 hash 双击之后我们发现打不开 这种情况有两种原因 一是我们没有安装相应的软件 二是该文件被毁坏了 然后我们尝试用记事本打开看一下 结果发现原来重点在这 Adm
  • Jenkins使用问题记录

    1 启动 使用Jenkins的版本为2 138 3 下载war包后启动即可运行 指定使用8080端口 可自定义 java jar jenkins war httpPort 8080 建议后台启动 命令如下 1 启动 指定后台启动 nohup
  • 服务器性能测试脚本大全

    服务器性能测试脚本大全 SFS工具箱集成了数十种服务器性能测试脚本 包括服务器测速 内存测压 CPU跑分 硬盘写入 等待脚本非常齐全 重要的是脚本资源存储于国内节点 执行获取速度快 非那些存储在海外的 执行速度慢等的头疼 下面教大家如何安装
  • git的基本介绍与使用

    一 git的定义与配置 世界上最先进的分布式版本管理系统没有之一 作者 linus linus系统创始人 解决的问题 代码版本管理 多人协作 编写项目 通俗来说 毕业论文初始版 毕业论文修改版 毕业论文最终版 安装网址 Githttps g
  • 基于Sqli-Labs靶场的SQL注入-1~4关

    less 1 Less4联合注入讲解 目录 less 1 基于字符型 单引号 注入点的联合注入 注入类型判断 猜解数据库中字段数 爆破数据库库名以及版本号 爆破数据库中的表名以及数据库安装路径 爆破某张表中的列名以及当前数据库的用户名 查询