渗透测试-SQL注入-登录漏洞-基础修复
前言
在前面我们基本实现了一个简单的登录功能,
但是在登录功能中存在着一些漏洞,比如SQL注入漏洞(对引号敏感),任意访问授权页面,登录页面报错,明文存储密码等,本文将对部分漏洞进行修复
下面访问的http://192.168.88.130/security/login.php已经使用lampp部署到Linux上了。类似windows的xampp,根目录为/opt/lampp/htdocs
使用/opt/lampp/lampp start启动服务
一、使用Python进行注入测试
首先我们使用python代码对登录页面进行Fuzz测试,看看是否存在SQL注入漏洞,如果存在,则继续利用
# coding:utf-8
import requests
# 利用Python对PHP的登录页面进行Fuzz测试
def login_fuzz():
# 先使用单引号进行探索
url = 'http://192.168.88.130/security/login.php'
data = {'username':"'",'password':'admin123','vcode':'0000'}
resp = requests.post(url=url,data=data)
if resp.status_code != 200:
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':'admin123','vcode':'0000'}
resp = requests.post(url,data)
if 'login-fail' not in resp.text and resp.status_code==200:
print(f'登录成功!,Payload为:{data}')
else:
print('登录界面对单引号不敏感')
if __name__=='__main__':
login_fuzz()
二、任意访问授权页面
无论用户是否登录成功,均可直接输入:http://你的网页地址/security/welcome.php
访问,而页面是要求登录成功后才能访问,所以在该页面需要进行登录判断,代码修改为:
1.在commom.php中添加session_start(),让其他页面引入,便于直接使用:Session
2.在welcome.php页面中,源代码修改为:
<?php
include "common.php";
//修复漏洞,在显示文本前,先进行SESSION验证
if (!isset($_SESSION['islogin']) or $_SESSION['islogin'] != 'true') {
die("你还没有登录,无法访问本页面</br>");
}
echo '欢迎登录安全测试平台</br>'
?>
3.在login.php中,登录成功后添加如下代码:
if(mysqli_num_rows($result) == 1){
echo "login-pass";
//登录成功后,记录SESSION变量
$_SESSION['username'] = $username;
$_SESSION['islogin'] = 'true';
echo "<script>location.href='welcome.php'</script>";
}
三、修复login.php报错
当在用户名输入单引号时,会引起后台报错,一方面说明后台没有对单引号进行转义处理,导致单引号可以被注入到SQL语句中,进而导致SQL语句中存在单独的一个单引号,SQL语句无法有效闭合,发生错误。修复代码如下:
$result = mysqli_query($conn,$sql) or die("SQL语句执行错误"); //result获取到的查询结果,称为结果集
四、加密用户表密码
md5加密算法是一种不可逆的加密算法,是一种不错的方法,当然你也可以使用其他的加密算法,比如sha1等,但是不建议使用明文存储密码,因为这样会导致用户密码泄露,造成不必要的损失,所以我们
我们可以使用md5函数, 演示代码如下:
<?php
//MD5函数用于字符串加密
$source = 'Hello123';
echo md5($source);
?>
//提示一:user表中的password字段必须是32+位
//提示二:在用户注册时,必须用md5函数将密码加密保存
加密后存储效果
因一些原因这里显示有加密的是前三条和最后三条。
五、总结
- 完整代码可以在我的github上查看,这些代码都是部署在linux上的
- 本文只是简单说明了一些漏洞的存在和进行了修复一些基础漏洞,下面我们将挖掘更多漏洞来修复