0基础学习SQL注入之万能账号密码(BUUctf例题-[极客大挑战 2019]EasySQL1)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 0基础学习SQL注入之万能账号密码(BUUctf例题-[极客大挑战 2019]EasySQL1)

做题


借助例题[极客大挑战 2019]EasySQL1来理解SQL注入中的万能账号密码。

我们现解题,解题过程中的知识点在后面都会说到。

打开网址,我们看到的是这个界面。根据题目提示应该是属于SQL注入类型的

1.寻找注入点,很明显,输入用户名和密码的地方应该就是注入点

2.判断闭合方式是字符型还是数字型

我们输入1 1' 1" 查看界面回显,可以发现

在用户名处输入1' 1"时候,界面的回显是一样的

回显界面都是下面的这个

当我们输入1'后,回显就是这样的

可以判断出单引号为起闭合方式

一般情况下,SQL语句闭合方式为单引号


输入1、1"时,没有SQL语句报错,只是提示我们输入的值是不对的,因此我们可以先假设SQL语句闭合方式是单引号


username输入1时,形成的sql语句是

SELECT*FROM table_name WHERE username='1'and password='123';


username输入1"时,形成的sql语句是正确的

SELECT*FROM table_name WHERE username='1"'and password='123';


username输入的是1',形成的sql语句是错误的

SELECT*FROM table_name WHERE username='1''and password='123';


第一个单引号和第二个单引号形成了新的闭合,剩余第三个单引号,组成的sql语句不正确,于是语句报错。


所以可以推出SQL语句闭合方式是单引号。


假设SQL语句是双引号闭合的情况


username输入1时,形成的sql语句是正确的 SELECT*FROM table_name WHERE username="1"and password="123";


username输入1"时,形成的sql语句是 SELECT*FROM table_name WHERE username="1""and password="123"; 正确的SQL语句不可以出现一对双引号包含双引号的。所以上面这条应该出现SQL报错,但实际没有报错,因此我们假设的双引号闭合方式是不成立的。


username输入的是1',形成的sql语句是正确的,不会报错 SELECT*FROM table_name WHERE username="1'"and password="123"; 而然实际上这条语句报错了,因此我们假设的双引号闭合方式是不成立的。


综上,我们可以推出SQL语句闭合方式是单引号


3.尝试万能账户和密码解题

一般来说,有账号密码登陆的题,在判断完闭合方式后,可以尝试先用万能账号密码解题

(用户名和密码至少有一个输入万能密码即可获得正确的flag)

可以看到得到了flag


知识点


1.造成SQL注入的原因

在没有对用户的输入进行过滤、检测的情况下,就把用户输入数据,带入到数据库中执行SQL语句。利用SQL注入:由于系统没有对输入的数据进行过滤、检测,就带入到数据库中执行SQL语句,那么当用户输入一条恶意的数据,使其与原SQL语句拼接、重组得到一条恶意的SQL语句,当数据库执行这条恶意的SQL语句时,就会把数据库中的信息暴露出来,从而泄露信息。


2.防止SQL注入的措施

1、SQL语句的执行代码使用预编译 PreparedStatement 。

2、确定每个数据的类型,比如是数字,数据库则必须使用int类型来存储。

3、限制传入数据的长度,这能够在一定程度上防止sql注入。

4、严格限制用户使用数据库的权限,能够在一定程度上减少sql注入的危害。

5、避免直接响应一些 sql 语句执行异常的信息。

6、过滤参数中含有的一些数据库关键词。


3.判断SQL语句闭合方式原理:

MYSQL数据库的包容性比较强,如果你输错了数据的类型,MYSQL数据库会自动将其转换成正确的数据类型,比如输入1)、1"、1-等,只要数字后面的字符不是闭合符的,数据库都会把你输入的错误的数据转换成正确的数据类型。


但是,若输入的数字后面的字符恰好是闭合符,则会形成闭合,若闭合后形成的sql语句是错误的,那么sql语句执行就会错误,从而造成页面显示错误。


例如:在Mysql数据库下,代码如下:

$id=$_GET[‘id’];
$sql=“SELECT * FROM name WHERE id=’$id’ LIMIT 0,1”;

可以看到’(单引号)就是这条语句的闭合符 当,id输入的是1),那么拼接成的sql语句就是:“SELECT * FROM name WHERE id=‘1)’ LIMIT 0,1”; 按理来说这个sql语句应该是错误的,执行会报错,但是因为是在Mysql数据库环境下,它会自动把错误的数据1)转换成合法的数据1,从而使得sql语句执行成功,相同的输入1-、1"也一样。


但是,若id输入的是1’,那么形成的sql语句就是:“SELECT * FROM name WHERE id=‘1’ '(两个单引号) LIMIT 0,1”; 那么第1个单引号就和第2个单引号形成闭合,然后还剩下一个多余的第3个单引号,从而报错。


只要在输入的数据中,形成了新的闭合,且组成的sql语句不正确,那么就会报错。


相反SqlServer、oracle数据库对数据类型很严格,输错数据类型不会自动转换成正确的数据类型,所以只要输入的数据类型不正确就会出现报错信息。 以此特性就可以进行bool盲注。


4.万能账户密码

一、什么是万能账号密码

我们平时登录账号时,如果是第一次登录,系统会提示我们注册账号,并将我们注册的账号和密码保存到数据库中。当我们再次登录时,系统会将我们输入的账号和密码和数据库中的数据进行匹配,匹配成功能登录。这就意味着我们需要知道一个已经注册过并且正确的账号和密码才能进行登录,那如果我不小心忘记了我的账号或者密码,或者我压根就不知道账号和密码,还有没有办法登录呢?答案是肯定的,那就是 【万能账号密码】


万能账号密码是指 【万能账号】和 【万能密码】,顾名思义,就是可以 【登录任意网站】的账号和密码


1、万能账号


当我们不知道用户的账号并且不知道用户的密码时,可以使用万能账号。

万能账号并不是一个真正意义上的账号,它是一种【拥有不同变体的格式】

需要注意的是,以下所有万能账号中的 a 可以是自定义的数字或字母,比如 1,2,3,b,c,d


【数值型万能账号】

a or true #              a or ture #
a or 1 #                 a or 1 #
a or 1 -- a             (注意第2个a前面有个空格)
a or true -- a          (注意第2个a前面有个空格)

【单引号字符型万能密码】

a' or true#
a' or 1#
a' or 1 -- a(注意第2个a前面有个空格)
a' or true -- a(注意第2个a前面有个空格)

【双引号字符型万能密码】

a" or true #
a" or 1 #
a" or 1 -- a
a" or true -- a

1.1 万能账号的使用


账号输入 【万能账号】, 比如 a or true #


密码随便输入,比如 123456


一个网络安全意识淡薄的网站,其登录功能的SQL语句大概是下面这个样子

select * from user where username='user' and password='pass'


1、万能账号原理


当我们在登录界面输入 【万能账号】比如 a’ or true # 以后,后端会将我们输入的参数拼接到SQL中,然后去数据库中查询账号和密码,SQL语句大概是下面这样


select * from user where username='a' or true #' and password='pass'


由于 # 在SQL中是注释符,注释符后面的内容不起作用,所以真正执行的SQL语句大概是下面这样


select * from user where username='a' or true


or true 会使SQL语句恒成立,从而查询出数据库中的所有账号和密码,从而使我们成功登录


1.1 注释符


除了 # 以外, -- 也是SQL中的注释符,但SQL的语法格式规定--和后面的注释内容必须间隔一个空格,所以这需要使用 a' or 1 -- a 而不是 a' or 1 -- 其原理和 a’ or 1 # 大同小异,拼接到SQL中大概是下面这样


select * from user where username='a' or true -- a' and password='pass'


注释后面的内容不生效,真正执行的SQL大概是下面这样


select * from user where username='a' or true


SQL语句恒成立,从而登录成功


换句话来说,a' or true -- a经过SQL的转化后,结果等价于 a’ or true #


1.2 比较运算符


SQL中规定,非布尔类型的数据参与比较运算时,会转化为布尔类型再参与运算。比如 or 1 或者 or 1=1 ,会转化为布尔类型的 true 再参与 or 的比较运算,也就是变成 or true ,同样能使条件恒成立,从而登录成功


简单来讲就是:a' or 1 # 或者 a' or 1=1 # 这里1转化为布尔类型就是true ,1=1转换为布尔卡类型也是true,等价于 a' or true #


2、万能密码


当我们知道用户的账号,但不知道用户的密码时,可以使用万能密码,万能密码并不是一个真正意义上的密码,而是一个【拥有不同变体的格式】


需要注意的是:万能密码中的 admin,必须是真实的用户名


【数值型万能密码】


admin #


admin -- a(a前面有空格)


【单引号字符串型万能密码】


admin' #


admin' -- a(a的前面有空格)


【双引号字符串型万能密码】


admin” #


admin" -- a(a的前面有空格)


2、万能密码原理


当我们在登录界面输入 【万能密码】 比如 admin’ # 以后,后端会将我们输入的参数拼接到SQL中,大概是下面这样


select * from user where username='admin' #' and password='pass'


由于 # 在SQL中是注释符,注释符后面的内容不起作用,所以真正执行的SQL大概是下面这样


select * from user where username='admin'


SQL只会在数据库中查询用户名,而不是同时查询用户名和密码,这就意味着,只要用户名正确,就可以登录成功


2.1 注释符


除了 # ,-- 在SQL中也是注释符,SQL的语法格式规定 --后面必须使用空格来间隔后面的注释内容,所以需要将 --写作 -- a,后面的 a 可以是任意数字或者字母


简单来件就是 admin' – a 等价于 admin'#


使用HackBar进行SQL注入


Load URL(加载网址):将网址“框”下来 Split URL(切分网址):自动切分网址,便于快速找出需要修的地方 Execute(执行):相当于F5

/check.php?username=a' or true %23& password=1


添加check.php是因为


跳转到check.php页面,可知此页面与数据库产生交互。


GET传参要经过url编码,所以使用url进行输入时,不能使用#,而应该使用其url编码%23


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
25天前
|
SQL 安全 前端开发
Web学习_SQL注入_联合查询注入
联合查询注入是一种强大的SQL注入攻击方式,攻击者可以通过 `UNION`语句合并多个查询的结果,从而获取敏感信息。防御SQL注入需要多层次的措施,包括使用预处理语句和参数化查询、输入验证和过滤、最小权限原则、隐藏错误信息以及使用Web应用防火墙。通过这些措施,可以有效地提高Web应用程序的安全性,防止SQL注入攻击。
44 2
|
2月前
|
SQL 存储 数据库
SQL学习一:ACID四个特性,CURD基本操作,常用关键字,常用聚合函数,五个约束,综合题
这篇文章是关于SQL基础知识的全面介绍,包括ACID特性、CURD操作、常用关键字、聚合函数、约束以及索引的创建和使用,并通过综合题目来巩固学习。
40 1
|
3月前
|
SQL 安全 数据库
惊!Python Web安全黑洞大曝光:SQL注入、XSS、CSRF,你中招了吗?
在数字化时代,Web应用的安全性至关重要。许多Python开发者在追求功能时,常忽视SQL注入、XSS和CSRF等安全威胁。本文将深入剖析这些风险并提供最佳实践:使用参数化查询预防SQL注入;通过HTML转义阻止XSS攻击;在表单中加入CSRF令牌增强安全性。遵循这些方法,可有效提升Web应用的安全防护水平,保护用户数据与隐私。安全需持续关注与改进,每个细节都至关重要。
141 5
|
3月前
|
SQL 安全 数据库
深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
在Web开发领域,Python虽强大灵活,却也面临着SQL注入、XSS与CSRF等安全威胁。本文将剖析这些常见攻击手段,并提供示例代码,展示如何利用参数化查询、HTML转义及CSRF令牌等技术构建坚固防线,确保Python Web应用的安全性。安全之路永无止境,唯有不断改进方能应对挑战。
78 5
|
3月前
|
SQL 安全 数据安全/隐私保护
Python Web安全大挑战:面对SQL注入、XSS、CSRF,你准备好了吗?
在构建Python Web应用时,安全性至关重要。本文通过三个真实案例,探讨了如何防范SQL注入、XSS和CSRF攻击。首先,通过参数化查询替代字符串拼接,防止SQL注入;其次,利用HTML转义机制,避免XSS攻击;最后,采用CSRF令牌验证,保护用户免受CSRF攻击。这些策略能显著增强应用的安全性,帮助开发者应对复杂的网络威胁。安全是一个持续的过程,需不断学习新知识以抵御不断变化的威胁。
126 1
|
3月前
|
SQL 安全 数据库
Python Web开发者必看!SQL注入、XSS、CSRF全面解析,守护你的网站安全!
在Python Web开发中,构建安全应用至关重要。本文通过问答形式,详细解析了三种常见Web安全威胁——SQL注入、XSS和CSRF,并提供了实用的防御策略及示例代码。针对SQL注入,建议使用参数化查询;对于XSS,需对输出进行HTML编码;而防范CSRF,则应利用CSRF令牌。通过这些措施,帮助开发者有效提升应用安全性,确保网站稳定运行。
54 1
|
3月前
|
SQL 安全 数据库
深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
在Web开发领域,Python虽强大灵活,但安全挑战不容小觑。本文剖析Python Web应用中的三大安全威胁:SQL注入、XSS及CSRF,并提供防御策略。通过示例代码展示如何利用参数化查询、HTML转义与CSRF令牌构建安全防线,助您打造更安全的应用。安全是一场持久战,需不断改进优化。
56 3
|
3月前
|
SQL 安全 数据库
从入门到精通:Python Web安全守护指南,SQL注入、XSS、CSRF全防御!
【9月更文挑战第13天】在开发Python Web应用时,安全性至关重要。本文通过问答形式,详细介绍如何防范SQL注入、XSS及CSRF等常见威胁。通过使用参数化查询、HTML转义和CSRF令牌等技术,确保应用安全。附带示例代码,帮助读者从入门到精通Python Web安全。
95 6
|
3月前
|
SQL 安全 JavaScript
告别Web安全小白!Python实战指南:抵御SQL注入、XSS、CSRF的秘密武器!
【9月更文挑战第12天】在Web开发中,安全漏洞如同暗礁,尤其对初学者而言,SQL注入、跨站脚本(XSS)和跨站请求伪造(CSRF)是常见挑战。本文通过实战案例,展示如何利用Python应对这些威胁。首先,通过参数化查询防止SQL注入;其次,借助Jinja2模板引擎自动转义机制抵御XSS攻击;最后,使用Flask-WTF库生成和验证CSRF令牌,确保转账功能安全。掌握这些技巧,助你构建更安全的Web应用。
61 5
|
4月前
|
SQL 存储 关系型数据库
PostgreSQL核心之SQL基础学习
PostgreSQL核心之SQL基础学习
53 3