网络攻防期末大作业选题:防sql注入的登录网站【网络攻防CTF】(保姆级图文)

news/2024/5/20 8:05:23/文章来源:https://blog.csdn.net/u011027547/article/details/124540916

目录

    • 1. 结合mysql数据库设计一个web登录页面
      • 数据库sql搭建
      • 项目结构如下:
      • Login.html效果图如下:
      • html代码
      • php验证代码
    • 2. 能够防住简单注入和宽字节注入
      • 简单注入
      • 双拼注入
      • 宽字节注入
    • 3. 能够基本防住手动注入和sqlmap攻击(测试案例)
      • 防止手动注入
      • 防御sqlmap攻击
    • 4. 能够防止sql注入原因分析
      • 使用js代码分析、处理并屏蔽客户端上的不安全字符,过滤字符串
      • 使用正则表达式等方式替换、过滤传入的参数
      • 使用php的sql过滤设置
    • 总结


欢迎关注 『网络攻防CTF』 系列,持续更新中
欢迎关注 『网络攻防CTF』 系列,持续更新中

1. 结合mysql数据库设计一个web登录页面

数据库sql搭建

另存为sql_test.sql文件导入即可
在这里插入图片描述

/*Navicat Premium Data TransferSource Server         : localhostSource Server Type    : MySQLSource Server Version : 50734Source Host           : localhost:3306Source Schema         : sql_testTarget Server Type    : MySQLTarget Server Version : 50734File Encoding         : 65001Date: 13/05/2022 10:15:53
*/SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (`username` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`pwd` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('admin', 'admin');SET FOREIGN_KEY_CHECKS = 1;

在这里插入图片描述
在这里插入图片描述

项目结构如下:

为了美观引用了layui框架(也可以没有,只是样式)
在这里插入图片描述

Login.html效果图如下:

输入用户名密码测试登陆。

在这里插入图片描述

html代码

layui文件可以在gitee官网上下载https://gitee.com/sentsin/layui

<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>防止SQL注入的登录页面</title><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"><title>基于layui框架的放sql注入网站</title><link rel="stylesheet" href="layui-master/src/css/layui.css"><link rel="stylesheet" href="layui-master/src/css/modules/code.css"><script src="layui-master/src/layui.js" type="text/javascript" charset="UTF-8"></script><script type="text/javascript">function Mycheck(str) {var mess = "不允许输入的字符:\r\n";var mark = "yes";if (str.indexOf(";") >= 0) {mark = "no";mess += " ; ";}if (str.indexOf("&") >= 0) {mark = "no";mess += " & ";}if (str.indexOf("<") >= 0) {mark = "no";mess += " < ";}if (str.indexOf(">") >= 0) {mark = "no";mess += " > ";}if (str.indexOf("--") >= 0) {mark = "no";mess += " -- ";}if (str.indexOf("/") >= 0) {mark = "no";mess += " / ";}if (str.indexOf("%") >= 0) {mark = "no";mess += " % ";}if (str.indexOf("'") >= 0) {mark = "no";mess += " ' ";}if (str.indexOf("#") >= 0) {mark = "no";mess += " # ";}if (mark == "no") {alert(mess);return false;} else returnreturn true;}</script></head><body style="font-size:12px">
<table width="382" border="0" align="center" cellpadding="0" cellspacing="0"><tr><td height="99" background="images/login_01.jpg">&nbsp;</td></tr><tr><td height="160" bgcolor="#FEF7C3"><table class="layui-table" lay-size="lg" lay-even lay-skin="row" width="300" border="0" align="center"cellpadding="3" cellspacing="0"><form method='post' action='login.php' name="form1" onSubmit="Mycheck(form1.username.value)"><tr><td height="22" colspan="2" align="center">&nbsp;</td></tr><tr><td height="22" align="right">mzh</td></tr><tr><td height="22" align="right">网工191</td></tr><tr><td height="22" align="right">19145120</td></tr><tr><td height="22" align="right">用户</td><td height="22"><input name="username" type="text" class="layui-input-inline" id="txt_name"size="18" maxlength="50"></td></tr><tr><td height="22" align="right">密码:</td><td height="22"><input name="passwd" type="password" class="layui-input-inline"id="txt_passwd" size="19" maxlength="50"></td></tr><tr><td height="22" colspan="2" align="center"><input name="login" type="submit" id="login"value="登 录"class="layui-btn layui-btn-radius layui-btn-warm">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="reset" name="Submit2" value="重 置"class="layui-btn layui-btn-radius layui-btn-warm"></td></tr></form></table></td></tr>
</table>
<!-- Code injected by live-server -->
<script type="text/javascript">// <![CDATA[  <-- For SVG supportif ('WebSocket' in window) {(function () {function refreshCSS() {var sheets = [].slice.call(document.getElementsByTagName("link"));var head = document.getElementsByTagName("head")[0];for (var i = 0; i < sheets.length; ++i) {var elem = sheets[i];var parent = elem.parentElement || head;parent.removeChild(elem);var rel = elem.rel;if (elem.href && typeof rel != "string" || rel.length == 0 || rel.toLowerCase() =="stylesheet") {var url = elem.href.replace(/(&|\?)_cacheOverride=\d+/, '');elem.href = url + (url.indexOf('?') >= 0 ? '&' : '?') + '_cacheOverride=' + (new Date().valueOf());}parent.appendChild(elem);}}var protocol = window.location.protocol === 'http:' ? 'ws://' : 'wss://';var address = protocol + window.location.host + window.location.pathname + '/ws';var socket = new WebSocket(address);socket.onmessage = function (msg) {if (msg.data == 'reload') window.location.reload();else if (msg.data == 'refreshcss') refreshCSS();};if (sessionStorage && !sessionStorage.getItem('IsThisFirstTime_Log_From_LiveServer')) {console.log('Live reload enabled.');sessionStorage.setItem('IsThisFirstTime_Log_From_LiveServer', true);}})();} else {console.error('Upgrade your browser. This Browser is NOT supported WebSocket for Live-Reloading.');}// ]]>
</script>
</body></html>

php验证代码

<?phpsession_start();//开启session对话,必须在html前//post方法获取表单用户名,密码
$username = $_POST['username'];
$passwd = $_POST['passwd'];//连接数据库
$link = mysqli_connect('localhost','root','123456','sql_test');if (!$link)
{die("连接失败:".mysqli_connect_error());
}//检查用户名密码是否在数据库里已保存注册
$sql = 'select * from user where username="'.$username.'"and pwd="'.$passwd.'"';$result = mysqli_query($link,$sql);
$rows = mysqli_fetch_array($result);//查询数据表每一行if($rows){//数据库中查到用户名,密码匹配$_SESSION['username'] = $username;//保存session数据,全局变量echo '######################登陆成功###################';
}else{echo '######################用户名或密码错误######################';
}
?>

2. 能够防住简单注入和宽字节注入

简单注入

注入用户名19145120mzh' or 1=1#'
密码随意输入

这里检查是否含有特殊的'引号字符,防止了注入,具体代码在html的js部分

            if (str.indexOf("'") >= 0) {mark = "no";mess += " ' ";}

在这里插入图片描述

双拼注入

类似单注入,同样成功防止了注入。

注入用户名19145120mzh' 'oorr 1=1#'
密码随意输入

这里检查是否含有特殊的'引号字符,防止了注入,具体代码在html的js部分

            if (str.indexOf("'") >= 0) {mark = "no";mess += " ' ";}

宽字节注入

首先输入测试用户密码得到格式标准化的url
我这里随便输入了用户mzh密码123

得到了urlhttp://127.0.0.1:5500/login.html?username=mzh&pwd=123&login=%E7%99%BB+%E5%BD%95
在这里插入图片描述
在url后面添加%df%27%20or%201=1%23注入代码

把url改为http://127.0.0.1:5500/login.html?txt_name=mzh&txt_passwd=123%df%27%20or%201=1%23&login=%E7%99%BB+%E5%BD%95
追加的%df%27%20or%201=1%23表示url编码的空格or空格1=1#(这里的空格就是空格,一个字符,我这么写是为了方便大家理解)

常用的理解。%df一般是用来转换编码的
%df’(浏览器自动进行url编码%27)->%df%27

下图登录失败了,宽字节注入也失败了。

因为我们的js检查了url

            if (str.indexOf("%") >= 0) {mark = "no";mess += " % ";}
                function refreshCSS() {var sheets = [].slice.call(document.getElementsByTagName("link"));var head = document.getElementsByTagName("head")[0];for (var i = 0; i < sheets.length; ++i) {var elem = sheets[i];var parent = elem.parentElement || head;parent.removeChild(elem);var rel = elem.rel;if (elem.href && typeof rel != "string" || rel.length == 0 || rel.toLowerCase() =="stylesheet") {var url = elem.href.replace(/(&|\?)_cacheOverride=\d+/, '');elem.href = url + (url.indexOf('?') >= 0 ? '&' : '?') + '_cacheOverride=' + (new Date().valueOf());}parent.appendChild(elem);}}

在这里插入图片描述


3. 能够基本防住手动注入和sqlmap攻击(测试案例)

防止手动注入

随便输入异常符号都无法成功的注入

select * from news where id=http://……?id=1

在这里插入图片描述
因为是post的方法,并且js对url处理,url也被锁死。
哪怕我在url中注入正确的用户名admin和密码admin都无法成功注入,哪怕是异常字符也会被过滤掉。
在这里插入图片描述

防御sqlmap攻击

url已经隐藏,无法通过url进行注入攻击了。
在这里插入图片描述


4. 能够防止sql注入原因分析

使用js代码分析、处理并屏蔽客户端上的不安全字符,过滤字符串

功能介绍:检查是否包含“\ \”、“/” “%” "'"等字符。

function Mycheck(str) {var mess = "不允许输入的字符:\r\n";var mark = "yes";if (str.indexOf(";") >= 0) {mark = "no";mess += " ; ";}if (str.indexOf("&") >= 0) {mark = "no";mess += " & ";}if (str.indexOf("<") >= 0) {mark = "no";mess += " < ";}if (str.indexOf(">") >= 0) {mark = "no";mess += " > ";}if (str.indexOf("--") >= 0) {mark = "no";mess += " -- ";}if (str.indexOf("/") >= 0) {mark = "no";mess += " / ";}if (str.indexOf("%") >= 0) {mark = "no";mess += " % ";}if (str.indexOf("'") >= 0) {mark = "no";mess += " ' ";}if (mark == "no") {alert(mess);return false;} else returnreturn true;}

使用正则表达式等方式替换、过滤传入的参数

function refreshCSS() {var sheets = [].slice.call(document.getElementsByTagName("link"));var head = document.getElementsByTagName("head")[0];for (var i = 0; i < sheets.length; ++i) {var elem = sheets[i];var parent = elem.parentElement || head;parent.removeChild(elem);var rel = elem.rel;if (elem.href && typeof rel != "string" || rel.length == 0 || rel.toLowerCase() =="stylesheet") {var url = elem.href.replace(/(&|\?)_cacheOverride=\d+/, '');elem.href = url + (url.indexOf('?') >= 0 ? '&' : '?') + '_cacheOverride=' + (new Date().valueOf());}parent.appendChild(elem);}}

使用php的sql过滤设置

(其实类似我前面的js代码转化过滤)
打开magic_quotes_gpc来防止SQL注入。php.ini中有一个设置:magic_quotes_gpc = Off这个默认是关闭的,如果它打开后将自动把用户提交对sql的查询进行转换,比如把 ’ 转为 '等,对于防止sql注射有重大作用。

如果magic_quotes_gpc=Off,则使用addslashes()函数。

在这里插入图片描述


总结

大家喜欢的话,给个👍,点个关注!继续跟大家分享敲代码过程中遇到的问题!

版权声明:

发现你走远了@mzh原创作品,转载必须标注原文链接

Copyright 2022 mzh

Crated:2022-3-6

欢迎关注 『网络攻防CTF』 系列,持续更新中
欢迎关注 『网络攻防CTF』 系列,持续更新中
【网络攻防CTF】草稿(保姆级图文)
【更多内容敬请期待】


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_765933.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[引用]10个设计最经典的web2.0网站

地址&#xff1a;http://www.hxblog.net/article.asp?id879做好一个网站&#xff0c;不仅要在服务及功能上胜人一筹&#xff0c;而且网站的整体设计也是一个不可获缺的重要因素&#xff0c;一个设计漂亮的站点通常能在第一时间吸引人的眼球&#xff0c;用户回访机率也就更大。…

职场必学的10个常用网站-活动策划

有很多的小伙伴儿在制定活动策划的时候都急得直挠头&#xff0c;所以我就来分享10个大厂活动策划的时候也会使用的常用网站&#xff0c;大家可以以此为借鉴进行灵感寻求。 1.亿图脑图 有的时候活动策划会需要众多的文字去进行描述和规划&#xff0c;但是如果这个时候我们利用…

无代码搭建“网站运营”管理系统

对于很多公司来说&#xff0c;他们一般都有自己的网站&#xff0c;尤其是B2B的公司&#xff0c;B2C的公司要运营的则主要包括公众号、电商平台献上店铺等各大平台。但不管是哪一类平台&#xff0c;日常的运营工作是不能少的——自然&#xff0c;运营数据的管理也是不能少的。 网…

八个移动产品设计必备网站

来自&#xff1a;http://www.cocoachina.com/newbie/basic/2012/0606/4333.html 移动产品设计人员一定需要大量的使用其他各类应用&#xff0c;并且需要在产品设计时大量参考其他的移动应用的产品设计&#xff0c;这时如果有一些网站可以将很多优秀应用的不同流程分类展示&…

IIS网站服务器性能优化指南(转载)

Windows Server自带的互联网信息服务器&#xff08;Internet Information Server&#xff0c;IIS&#xff09;是架设网站服务器的常用工具&#xff0c;它是一个既简单而又麻烦的东西&#xff0c;新手都可以使用IIS架设一个像模像样的Web站点来&#xff0c;但配置、优化IIS的性…

apache virtualhost 访问不了_记录一下自己的建站过程(六):Apache服务基础

前言之前在Django那篇文章中讲过&#xff0c;Django内置了一个服务程序&#xff0c;可以直接以python manage.py runserver 0.0.0.0:8080这样的形式来启动一个http服务。那应该就够了。我有了前端&#xff0c;又有了后端&#xff0c;可以直接开搞了。但是&#xff0c;包括Djang…

sharepoint search配置爬网站

1、设置爬网规则 2、添加内容源 转载于:https://www.cnblogs.com/denglinhai/archive/2012/12/04/2802144.html

浅析网站架构变化

之前也有一些介绍大型网站架构演变的文章&#xff0c;例如LiveJournal的、ebay的&#xff0c;都是非常值得参考的&#xff0c;不过感觉他们讲的更多的是每次演变的结果&#xff0c;而没有很详细的讲为什么需要做这样的演变&#xff0c;再加上近来感觉有不少同学都很难明白为什么…

调试,网站出现弹出登录框

在本地调试网站程序&#xff0c;用LOCALHOST或127.0.0.1进行资源首页面访问时弹出用户登陆框&#xff0c;其他页面没问题。 首要因素&#xff1a;我的机器进行系统还原。 原因一&#xff1a;IIS配置问题&#xff1a; 解决方法&#xff1a;打开IIS&#xff0c;右键网站属性。 选…

XP系统下IE7访问HTTPS网站提示“此网站的安全证书有问题”的解题思路

没有正式阐述解题思路之前&#xff0c;我们先了解下HTTPS、SSL的相关知识点。SSL(Secure Socket Layer)是目前解决传输层安全问题的一个主要协议&#xff0c;其设计的初衷是基于TCP协议之上提供可靠的端到端安全服务&#xff0c;SSL的实施对于上层的应用程序是透明的。应用SSL协…

黑客网站明码标价 买主按台数购买染毒电脑

3月18日&#xff0c;瑞星通过“云安全”系统截获一个黑客建立的染毒电脑销售网站&#xff08;http://121.***.127.73/&#xff09;&#xff0c;登陆这个网站&#xff0c;就可以看到他们总共控制了多少台染毒电脑&#xff08;或称“肉鸡”&#xff09;、染毒电脑的IP地址等详细数…

VS2008网站发布后报表出错:未能加载文件或程序集。

VS2008开发的网站&#xff0c;本地测试没问题&#xff0c;上传到服务器就出错&#xff0c;提示&#xff1a;引用内容未 能加载文件或程序集“Microsoft.ReportViewer.WebForms, Version9.0.0.0, Cultureneutral, PublicKeyTokenb03f5f7f11d50a3a”或它的某一个依赖项。系统找不…

网站logo漫谈

一个网站&#xff0c;网站名&#xff0c;域名&#xff0c;网站logo是最先要考虑的几个元素。 网站的logo需要在网站的各个页面中经常出现&#xff0c;也是网站在用户脑中最形意的印象&#xff0c;因此网站的logo需要包含的条件应该有: 1 精美&#xff0c;独特。 由于网站的logo…

2011年国外最受欢迎的15个人财务网站

2019独角兽企业重金招聘Python工程师标准>>> 面向全球电子商务知识库网站eBizMBA公布了2011年国外最受欢迎的15个人财务网站&#xff1a; 1 Yahoo! Finance (http://finance.yahoo.com/personal-finance) eBizMBA排名第74&#xff0c;估计每月访客50000000人&#x…

JSP网站开发基础总结《十》

经过上一篇的介绍相信大家对JSP提供的过滤器一定有了一个概念&#xff0c;本篇我们就一起再来研究一下关于创建多个过滤器时&#xff0c;如果有两个以上过滤器的过滤规则相同&#xff0c;那么这些过滤器的执行顺序如何呢&#xff1f;答案是根据我们在web.xml中声明的先后顺序进…

网站二级域名不得不说的事

在做网站优化的过程中二级目录和二级域名都是经常用到的。在主域名下&#xff0c;建二级目录&#xff0c;主题与主网站相关&#xff0c;内容丰富&#xff0c;可以直接提高关键词排名&#xff0c;推进主域权重。同样的关键词&#xff0c;竞争对手如果是内页&#xff0c;而你是目…

利用U盘与163的yum源镜像网站安装Linux系统

各位攻城湿们&#xff01; 有没有遇到这样的情况&#xff1a;到现场部署、维护Linux系统时&#xff0c;发现服务器竟不再光驱&#xff0c;光驱损坏&#xff0c;自己随身USB光驱忘带&#xff0c;系统光盘忘带&#xff0c;系统盘损坏&#xff0c;光驱不带刻录&#xff0c;为装一次…

使用MiniProfiler调试ASP.NET MVC网站性能

MVC MiniProfiler是Stack Overflow团队设计的一款对ASP.NET MVC的性能分析的小程序。可以对一个页面本身&#xff0c;及该页面通过直接引用、Ajax、Iframe形式访问的其它页面进行监控,监控内容包括数据库内容&#xff0c;并可以显示数据库访问的SQL&#xff08;支持EF、EF Code…

在没有安装有mvc3的主机上部署asp.net mvc3网站,需要包含的DLL文件

1.在没有安装有mvc3的主机上部署asp.net mvc3网站&#xff0c;需要包含的DLL文件。 microsoft.web.infrastructure.dll system.web.helpers.dll system.web.mvc.dll system.web.razor.dll system.web.webpages.deployment.dll system.web.webpages.dll system.web.webpages.raz…

在电脑上测试手机网站全攻略

最近公司要开发网站的移动版&#xff0c;让我准备准备知识&#xff0c;话说本人开发移动网站的经验还真不多&#xff0c;最悲剧的事情就是我的手机是个经典的诺基亚&#xff0c;而且公司还不给配手机&#xff0c;这是有多扣啊&#xff0c;没办烦啦&#xff0c;没有手机就用电脑…