[BUUCTF]极客大挑战 2019EasySQL1 write up

Posted on 2022-04-08 21:01  *Faery  阅读(53)  评论(0编辑  收藏  举报

顾名思义,简单的SQL注入!

先浅了解一下注入:SQL 注入(SQL Injection) 是发生在 Web 程序中数据库层的安全漏洞,是网站存在最多也是最简单的漏洞。 主要原因是程序对用户输入数据的合法性没有判断和处理,导致攻击者可以在 Web 应用程序中事先定义好的 SQL 语句中添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步获取到数据信息。 简而言之,SQL 注入就是在用户输入的字符串中加入 SQL 语句,如果在设计不良的程序中忽略了检查,那么这些注入进去的 SQL 语句就会被数据库服务器误认为是正常的 SQL 语句而运行,攻击者就可以执行计划外的命令或访问未被授权的数据。

想详细了解的话,戳一下链接吧:https://www.php.cn/sql/487013.html(针不戳呀针不戳)

随便输输常用密码啦,就会显示错误:

 

flag{a0b2c066-8ec8-4814-9573-9dc3787db556} 

万能密码原理:SQL语句sql="select * from user where username='"&username&"'and password='"& password&'",当我们的密码填写'or'1'='1提交的时候,此时语句中的password等于'or'1'='1,那么,这条SQL语句就变成了:sql="select * from user where username='"&username&"'and password= ''or'1'='1',然而,1=1是恒等条件,自然也就通过了程序的验证。
方法:首先我们需要在密码的最前面有一个单引号,来闭合SQL语句中的单引号,然后构造一个or,也就是或者,后面加一个恒等条件即可最简单的就是1=1,同样为了使SQL语句不出错,是来闭合程序中的SQL语句的后面的单引号的,如果我们在后面再加上一个单引号的话就会出错。

简而言之:由于网站后台在进行数据库查询的时候没有对单引号进行过滤,当输入用户名【admin】和万能密码【2' or'1】时,执行的SQL语句为【Select user_id,user_type,email From users Where user_id=' admin' And password='2'or'1'].同时,由于SQL语句中逻辑运算符具有优先级,【=】优先于【and】,【and】优先于【or】,且适用传递性。因此,此SQL语句在后台解析时,分成两句【Select user_id,user_type,email From users Where user_id='admin' And password = '2']和【1'】,两句bool值进行逻辑or运算,恒为TRUE。SQL语句的查询结果为TRUE,就意味着认证成
功,也可以登录到系统中。(是不是很简而言之)

Copyright © 2024 *Faery
Powered by .NET 9.0 on Kubernetes