urldecode二次编码绕过

urldecode二次编码绕过

urldecode() 用于解码 URL 字符串函数,此函数用于解码给出的已编码字符串中的任何 %##以及中文等被编码的内容。 (加号(’+’)被解码成一个空格字符)。

与之对应的

urlencode() 用于编码 URL 字符串函数。此函数便于将字符串编码并将其用于 URL 的请求部分。

题目源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
if(eregi("hackerDJ",$_GET[id])) {
echo("

not allowed!

");
exit();
}
$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "hackerDJ")
{
echo "
Access granted!

";
echo "
flag

";
}
?>

eregi()函数

定义和用法:eregi()函数在一个字符串搜索指定的模式的字符串。搜索不区分大小写。Eregi()可以特别有用的检查有效性字符串,如密码。可选的输入参数规则包含一个数组的所有匹配表达式,他们被正则表达式的括号分组。

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

使用eregi()函数来判断,所以参数中不能直接有hackerDJ,获取参数后使用urldecode对id的值进行解码,所以可以让id解码后的值是hackerDJ进行url编码后的值,由于浏览器会自行解码一次,所以编码两次就好

解题方法:

GET请求:?id=%25%36%38%25%36%31%25%36%33%25%36%62%25%36%35%25%37%32%25%34%34%25%34%61