在我看过的一个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'];
...
}