【发布时间】:2016-09-10 16:30:23
【问题描述】:
我最近对客户端进行了一次代码审计,发现这些代码行被盲注了
代码sn-p:
<?php
if ($_GET['id'] != ''){
$groepsindeling = $_GET['id'];
} else {
$groepsindeling = $_GET['group'];
}
breadcrumb($groepsindeling);
?>
<?php
$groep = "SELECT * FROM `menubalk` WHERE `webnr` LIKE '%$webnr-%' AND `hoofdgroep` = '$_GET[id]' ORDER BY `naamt1` ASC";
$groepres = mysql_query($groep);
while ($groeprij = mysql_fetch_array($groepres)){
?>
我立即使用 mysqli_real_escape_string() 函数对其进行了修补。
新代码:
<?php
if ($_GET['id'] != ''){
$groepsindeling = mysqli_real_escape_string($_GET['id']);
settype($groepsindeling, "integer");
}
else {
$groepsindeling = mysqli_real_escape_string($_GET['group']);
}
breadcrumb($groepsindeling);
?>
<?php
$groep = "SELECT * FROM `menubalk` WHERE `webnr` LIKE '%$webnr-%' AND `hoofdgroep` = '$_GET[id]' ORDER BY `naamt1` ASC";
$groepres = mysql_query($groep);
while ($groeprij = mysql_fetch_array($groepres)){
?>
我做了进一步的测试,看看代码是否可以对抗基于布尔的盲 SQL 注入,但它似乎失败了,因为基于时间的盲 SQL 注入在这里仍然适用。
感谢所有建议。
【问题讨论】:
-
您仍在查询中使用非转义的 $_GET['id']。
-
1.您正在混合 mysql 和 mysli api。 2.你不应该再使用mysql api了。它在很久以前就被弃用了,并在 php v7 中被删除。 3. 对于所有类型的 sql 注入,简单的转义是不够的。要么使用参数化查询(在 mysql api 中不可用,仅在 mysqli 或 pdo 中可用),或者你必须加强转义代码。
-
@CapitalC 但是我还能在查询中使用这个函数吗?
-
@Shadow 一些客户不想更改他们的代码... ;(
-
@Shadow 是的,我知道 mysql api 已被弃用,但他们不想更改代码。所以这就是为什么我被困在这里..需要找到一种方法来修补这个而不需要大量更改代码。已经建议了 WAF(Web 应用程序防火墙),但他们当然拒绝了。