浏览器地址栏输入http://127.0.0.1/sqli/Less-1/?id=1’ and 1=1 --+
php服务端会接收到http://127.0.0.1/sqli/Less-1/?id=1%27%20and%201=1%20–+
原因:
浏览器会对空格单引号进行url编码,但不会涉及-+等字符;具体有哪些字符没有研究过。
$_GET[‘id’]得到1’ and 1=1 --空格
原因:
GET 是通过 urldecode() 传递的,php使用GET方法解析id参数时,会首先对得到的url进行UrlDecode反编码,然后再去获取id的值。查看UrlDecode算法,可以看到当字符为’+'时,会将字符加号转换为空格,其余的非数字字符原样输出。
bool UrlDecode(const string& src, string& dst)
{
if(src.size() == 0)
return false;
int hex = 0;
for (size_t i = 0; i < src.length(); ++i)
{
switch (src[i])
{
case '+':
dst += ' ';
break;
case '%':
{
if (isxdigit(src[i + 1]) && isxdigit(src[i + 2]))
{
string hexStr = src.substr(i + 1, 2);
hex = strtol(hexStr.c_str(), 0, 16);
//字母和数字[0-9a-zA-Z]、一些特殊符号[$-_.+!*'(),] 、以及某些保留字[$&+,/:;=?@]
//可以不经过编码直接用于URL
if (!((hex >= 48 && hex <= 57) || //0-9
(hex >=97 && hex <= 122) || //a-z
(hex >=65 && hex <= 90) || //A-Z
//一些特殊符号及保留字[$-_.+!*'(),] [$&+,/:;=?@]
hex == 0x21 || hex == 0x24 || hex == 0x26 || hex == 0x27 || hex == 0x28 || hex == 0x29
|| hex == 0x2a || hex == 0x2b|| hex == 0x2c || hex == 0x2d || hex == 0x2e || hex == 0x2f
|| hex == 0x3A || hex == 0x3B|| hex == 0x3D || hex == 0x3f || hex == 0x40 || hex == 0x5f
))
{
dst += char(hex);
i += 2;
}
else
dst += '%';
}
else
dst += '%';
}
break;
default:
dst += src[i];
break;
}
}
return true;
}
参考:
https://www.php.net/manual/zh/reserved.variables.get.php
https://www.php.net/manual/zh/function.urldecode.php
https://blog.csdn.net/analogous_love/article/details/53418297