接上篇,自己编写的测试demo找到六处漏洞接下进行基本的修复
此处存在六处漏洞:
1)wecome.php页面谁都可以访问,没有进行登录判断(中)
2)在登录页面输入‘作为用户名,报错信息存在login.php的绝对路径,暴露了系统后台的敏感信息(低)
3)保存用户信息的数据表中,密码字段是明文保存不够安全(中)
4)登录页面可以进行sql注入,进而轻易实现登录(高)
5)login.php页面中使用了万能验证码(中)
6)登录功能可以被爆破,没有进而爆破防护(中)
一、使用python进行注入测试
# 利用python对PHP的登录页面进行Fuzz测试
import requests
def login_fuzz():
# 先使用单引号进行试探
url = 'http://192.168.74.133/security/login.php'
data = {'username': "'", 'password': '123456', 'vscode':' 0000'}
# resp为请求发出去得到请求的结果
resp = requests.post(url=url,data=data)
if 'waring' in resp.text:
print('本登录功能存在SQL注入漏洞,可以一试')
# 如果单引号存在利用嫌疑,则继续利用
payload_list = ["x' or id=1#", "x' or uid=1#", "x' or userid=1#", "x' or userid=2","' or userid=1"]
for username in payload_list:
data={'username': username, 'password': '123456', 'vscode': ' 0000'}
resp = requests.post(url=url,data=data)
if "login-fail" not in resp.text:
print(f'登录成功,payload为:{data}')
else:
print("通过试探,发现登录后台页面对单引号不敏感")
if __name__ == '__main__':
login_fuzz()
二、任意访问授权页面
无论用户是否登录成功,均可以直接输入:http://192.168.74.133/secity/welcome.php访问,
所以在该页面需要进行登录判断,代码修该为:
1)在common.php中添加session_start(),让其他页面引入,便于直接使用session
2)在welcome.php页面中,源代码修改为:
include "common.php" ;
// common.php为公共页面
// 修复该漏洞,在显示文本之前,先进行SESSION变量的验证
if(!isset($_SESSION['islogin']) or $_SESSION['islogin'] != 'true'){
die("你还没有登录,无法访问本页面");
}
echo '欢迎登录安全测试平台';
3)在login.php中,登录成功后添加以下代码,$_SESSION用来获取session值从而进行判断
if(mysqli_num_rows($result) == 1 ){
echo "login-pass";
// 失效的访问控制
// url绕过
// 登录成功后,记录session变量
$_SESSION['username'] = $username;
$_SESSION['islogin'] = 'true';
echo " <script>location.href='welcome.php'</script> ";
}
三、修复login.php暴露文件路径
当在用户名输入单引号时,会引起后台报错,一方面说明后台没有对单引号进行转义处理,
导致单引号可以被注入到SQL语句中,进而导致SQL语句存在单独的一个引号,
SQL语句无法有效有效闭合,发生错误,同时,还将源代码的绝对路径暴露出来,只是敏感信息,
应该将其屏蔽,修复代码如下:
在执行SQL语句后添加or die ("sql语句执行错误")
$result = mysqli_query($conn,$sql) or die("SQL语句执行错误"); // $result获取到的查询结果,称为结果
四、修改用户表密码为明文
1、md5
提示一:user表中password字段必须是32+位
提示二:在用户注册时,必须使用md5函数将密码加密保存
<?php
// 使用PHP内置的md5函数
// MD5函数用于加密字符串
$source = "hel1o123";
echo md5($source)
?>