【问题标题】:Is it possible to hack a website which use unfiltered GET parameter this way是否可以通过这种方式破解使用未过滤 GET 参数的网站
【发布时间】:2016-01-14 10:43:59
【问题描述】:

有没有办法在我的网站上执行一些代码,代码如下:

$a = $_GET['a'];
$b = 'abc' . $a;
$c = $a;

而且,假设在代码中将不再使用 $a、$b 和 $c 变量 - 只是一个赋值,例如连接。是否可以在这个地方执行一些恶意代码? (实际上我认为答案是否定的,因为那样根本就不可能有卫生设施。

这个怎么样(我很确定,它易受攻击的,如果我们将一些字符放入 $a,在一些内部 http 和 php 处理过程中,这些字符将被转义为逗号):

$a = $_GET['a'];
$b = "abc $a";

对不起,我知道,这是一个基本的和愚蠢的问题,我应该使用一些好的消毒剂库,不用担心。但我想确定一下,从最基本的开始,我不能说该网站是 100% 安全的,而它没有被黑客入侵,我只能说它是不安全的,当它偶尔被黑客入侵时。

添加: 非常感谢任何破解这两个脚本的示例,我想破解我自己的网站,其中包含上面发布的代码,以便清楚地理解,“在这个地方,如果您以这种方式编程,您的网站将很容易受到攻击,因此您应该以这种(另一种)方式对其进行编程。

【问题讨论】:

  • 是的。 XSS(持久或不持久,都构成威胁)和 SQL 注入(假设 $c$a 具有数据库逻辑)
  • 是的,可以通过XSS,阅读this
  • 您能发布任何可用的 HTTP GET 字符串示例吗?现在,我正在尝试破解我自己的网站,然后清理输入变量以确保破解尝试变得低效
  • 如果上述代码 100% 完成,那么唯一可能的漏洞是如果在 url 参数中未设置 a$a = $_GET['a']; 将导致 undefined index 错误。虽然这听起来并不严重,但取决于服务器的设置方式,此错误消息还可能泄漏目录结构、软件版本等信息,这些信息可能会被用于进一步的攻击。上面的 cmets(关于 XSS、sql inj 和类似的)是无效的,因为它们假定变量是输出或以其他方式进一步使用上面显示的
  • ,那代码是安全的,你是对的。

标签: php security code-injection


【解决方案1】:

而且,假设在代码中将不再使用 $a、$b 和 $c 变量 - 只是一个赋值,例如连接。会不会在这个地方执行一些恶意代码?

没有。您必须将数据放在将被视为代码而不是普通数据的地方,这样才会存在漏洞。 (至少在这种情况下,因为您不必担心缓冲区溢出)。

这个怎么样(我很确定,它很容易受到攻击,如果我们将一些字符放入 $a 中,在一些内部 http 和 php 处理过程中将不会转义为逗号):

再次,不。 URL 解码例程本身没有任何已知漏洞,并且您不会将数据放在任何逗号将具有任何重要意义的地方。将一个字符串变量插入另一个字符串是完全安全的。 (您稍后可能会对结果字符串做一些不安全的事情,但这超出了您的问题范围。)。

【讨论】:

  • 酷,谢谢!我也猜到这种方式变量不会有害 - 如果它没有像“它的代码的一部分”(用于包含、评估等)那样控制程序流,并且如果它用于赋值或条件运算符,没有办法为这个变量“转义矩阵”,它将无法更改使用它的代码。
【解决方案2】:

是或否,取决于以后如何处理这些数据。

是的,如果此数据存储、显示或发送到其他系统,因为可能滥用这些服务(存储到 SQL 可能容易受到 SQLi、显示到 XSS 等)。示例:

print($a); // Someone see this in browser or console?
$sqlConnection->insert($a); // Is insert() sanitizing input or not?

不,当您不使用上述数据处理,而只是像您的示例一样内部使用它。

同样,如果您将此字符串输出到控制台或日志,它可能会滥用它们并做一些不受欢迎的事情。最好从输入变量中去除不需要的字符(或采取另一条清理路线)并确保安全,而不是后悔。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-24
    • 2022-06-23
    • 2017-01-27
    • 2022-07-02
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    相关资源
    最近更新 更多