MySQL 注入 - 绕过影响列名的字符串过滤器

时间:2021-05-08 22:15:44

标签: php mysql sql-injection

在我看过的一个CTF挑战中,可以将代码注入到mysql查询中,实现sql注入。但是,如果在用户提供的输入中发现某些字符串,则站点的 php 代码会抛出错误并且不会执行查询。触发保护的三个字符串是单引号、“用户名”和“密码”。

不幸的是,“username”和“password”是“user”表中的列名,其中包含注册用户的用户名和相应的密码。内容表有 5 列,用户表只有 3 列。使用“联合”方法可以潜在地查询“用户”表。但是,如何绕过列名过滤?

1 UNION SELECT null, username, password, null, null FROM user
=> an error is thrown as the two strings "username" and "password" are found in the user input

我尝试了一些字符串操作/编码,但到目前为止我无法获得“用户名”和“密码”列的内容。 有谁知道如何在不使用名称的情况下引用它们,或者如何对它们进行编码以便 php 代码不会触发?

更新 09.05.2021
“内容”表有 5 列,而“用户”表只有 3 列。因此,我不能使用“SELECT * FROM”,因为列数不匹配。

function filt_func($str, array $arr)
  {
      foreach($arr as $a) {
          if (stripos($str,$a) !== false) return true;
      }
      return false;
  }

$str_filter = array("'", 'password', 'username');
$id = $_GET['id'];
...
if(filt_func($id, $str_filter)) {

}else{
  $sql = "SELECT * FROM content WHERE id = " . $_GET['id'];
  ...
}

0 个答案:

没有答案
相关问题