web_028

kim23   ·   发表于 2019-11-26 11:28:51   ·   技术文章投稿区

web_028

 

 

标签:CTF | eregi() | URL编码 | 代码审计

提示:编码而已

打开网址

 

查看网页源代码(Ctrl+U),发现隐藏内容<!-- source: index.phps -->

然后访问index.phps文件,下载文件,现已改名为web28_index.phps

 

 

 

打开文件:

 

 

<?php

    if(eregi("hacker",$_GET[id])) {

        echo("<p>not allowed!</p>");

        exit();

    }

 

    $_GET[id] = urldecode($_GET[id]);

    if($_GET[id] == "hacker"){

        echo "<p>Access granted!</p>";

        echo "<p>flag{******} </p>";

    }

?>

 

代码解释:

if(eregi("hacker",$_GET[id])) {};

eregi — 不区分大小写的正则表达式匹配

eregi()函数在一个字符串搜索指定的模式的字符串。搜索不区分大小写。Eregi()可以特别有用的检查有效性字符串,如密码。

可选的输入参数规则包含一个数组的所有匹配表达式,他们被正则表达式的括号分组。

返回值:如果匹配成功返回true,否则,则返回false

这句的意思是只要GET传参id的值和"hacker"不区分大小写匹配成功就直接跳出,所以要传参的字符串不能是"hacker"的大小写。

 

$_GET[id] = urldecode($_GET[id]);

urldecode — 解码已编码的 URL 字符串

本函数对字符串进行URL解码,返回值:已解码的字符串。

例如通过urlencode编码后的字符串,可通过UrlDecode进行解码。对Url路径加码的函数是UrlEncode 用法相反,和UrlDecode是一致对应的。

PHP urldecode示例:

$str1=urlencode("百度"); //$str1的值是%B0%D9%B6%C8

$str2=urldecode($str1); //$str2的值就是百度

这句的意思是把GET传参获得的id的值经过urldecode解码然后赋值给变量$_GET[id]

 

if($_GET[id] == "hacker"){}

这句的意思是把上一句url解码后的值和字符串"hacker"相比较,如果相等就输出flag

满足条件:至少用UrlEncode编码两次才能既满足eregi不区分大小写的匹配不成功,和经过url自动解码和代码中urldecode()函数共计两次的解码。

 

因为网上的urlencode编码工具不对字母编码,所以先用转成16进制,然后再每两个前边加个百分号%.

hacker ==> 6861636b6572 ==> %68%61%63%6b%65%72

CTF在线工具-Hex在线编码|Hex在线解码|十六进制编码转换

 

%68%61%63%6b%65%72 ==>%2568%2561%2563%256b%2565%2572

CTF在线工具-在线URL编码|URL解码

 

?id=hacker ==> ?id=%68%61%63%6b%65%72 ==>?id=%2568%2561%2563%256b%2565%2572

 

Payload?id=%2568%2561%2563%256b%2565%2572

直接提交吧,想不到吧~

 

除了直接全部编码之外,也可以值编码一个或多个字符,同样也达到绕过eregi()函数。比如?id=%2568acker

 


打赏我,让我更有动力~

0 Reply   |  Until 2019-11-26 | 747 View
LoginCan Publish Content
返回顶部 投诉反馈

© 2016 - 2022 掌控者 All Rights Reserved.