之前一个网友问了一道加固题,我寻思我没做过这类题,就来做做试试(=。=)
看一下首页
是一个表单,结合题目名称ezsql,想必是存在sql注入漏洞。先测试下,输入万能密码绕过
这道题应该是让我们加固此处来避免被万能密码绕过。
下面先连一下ssh,kali或者Xshell都行
xshell连接:
kali连接:
连接上切换到网站目录,看一下内容:
使用sftp工具拿出index.php看一下:
php代码部分如下:
<?php
error_reporting(0);
include 'dbConnect.php';
$username = $_GET['username'];
$password = $_GET['password'];
if (isset($_GET['username']) && isset($_GET['password'])) {
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = $mysqli->query($sql);
if (!$result)
die(mysqli_error($mysqli));
$data = $result->fetch_all(); // 从结果集中获取所有数据
if (!empty($data)) {
echo '登录成功!';
} else {
echo "用户名或密码错误";
}
}
?>
很明显没有对表单输入的数据做任何处理,我们加一个正则过滤一下用户输入的特殊字符即可:
!preg_match("/ \~|\`|\@|\#|\\$|\%|\^|\&|\*|\)|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\ /i",$x)
修改后代码的php部分:
<?php
error_reporting(0);
include 'dbConnect.php';
$username = $_GET['username'];
$password = $_GET['password'];
if (isset($_GET['username']) && isset($_GET['password'])) {
$r="/ \~|\`|\@|\#|\\$|\%|\^|\&|\*|\)|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\ /i";
if(!preg_match($r,$username) && !preg_match($r,$password))
{
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = $mysqli->query($sql);
if (!$result)
die(mysqli_error($mysqli));
$data = $result->fetch_all(); // 从结果集中获取所有数据
if (!empty($data)) {
echo '登录成功!';
} else {
echo "用户名或密码错误";
}
}
else{echo '输入不正确!';}
}
?>
主要修改就是在第8行对用户名和密码进行了正则过滤,过滤掉了特殊字符。
我们把原来的index.php删除,传上我们加固完的index.php
再回去看看是否成功过滤
过滤成功!check一下:
发现这样check不过,于是跟热(zui)心(kui)网(huo)友(shou)交流了一下,他说他用addslashes()
处理了一下就check过拿到flag了。那么我们再改一下代码,不过上面的代码可以看到也是可以防止万能密码绕过登录的
<?php
error_reporting(0);
include 'dbConnect.php';
$username = $_GET['username'];
$password = $_GET['password'];
if (isset($_GET['username']) && isset($_GET['password'])) {
$username = addslashes($username);
$password = addslashes($password);
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = $mysqli->query($sql);
if (!$result)
die(mysqli_error($mysqli));
$data = $result->fetch_all(); // 从结果集中获取所有数据
if (!empty($data)) {
echo '登录成功!';
} else {
echo "用户名或密码错误";
}
}
?>
7、8行使用了addslashes()
函数对输入内容进行了处理,check,然后访问flag
简单的sql注入防护,大佬们看个热闹就好,如有问题欢迎来指点菜鸡(=。=)