渗透测试-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函数将密码加密保存

加密后存储效果

因一些原因这里显示有加密的是前三条和最后三条。

在这里插入图片描述

五、总结

  1. 完整代码可以在我的github上查看,这些代码都是部署在linux上的
  2. 本文只是简单说明了一些漏洞的存在和进行了修复一些基础漏洞,下面我们将挖掘更多漏洞来修复
  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值