(4)BUUCTF-web-[极客大挑战 2019]EasySQL1

前言:

觉得这个题目挺有意义的,因为最近在学数据库,但是不知道在现实中有什么应用,所以学起来也没有什么兴趣,做了这个题目,发现数据库还是挺有用处的,哈哈

知识点:

mysql 中and和or的优先级

()> and > or

sql="select * from DB where user_id=1 or user_name='张三' and birthday='2000-03-03'"

1.该条sql 表示从 DB 中查询出 user_id =1 或者 (user_name='张三' 并且 birthday='2000-03-03') 的数据

sql="select * from DB where (user_id=1 or user_name='张三') and birthday='2000-03-03'"

2.该条sql 表示查询表示(user_id =1 或者 user_name='张三')并且 birthday='2000-03-03')

因为 () 的优先级会比 and 和 or 高 所以会先执行 ()里的

解题过程:

打开靶机后发现是一个登录界面,需要输入用户名和密码

先看看只输入用户民admin看看有什么报错

然后只输入密码也是同样的报错,所以用户名和密码都必须有值才能进行sql语句验证

判断是什么闭合

输入用户名admin'和admin

发现一个sql报错信息, 得知是''闭合

猜测后台的sql语句如下:

sql="select * from user where username='username\&'and password='password&'"

然后使用万能密码看看能不能登录admin账户

payload:

用户名:admin

密码:admin' or 1=1#

然后就出flag了

万能密码的原理是利用or和and的优先级来使得后面的where子句为真

我们输入的payload放入sql语句中就是这样的:

sql="select * from user where username='admin'and password='admin' or 1=1#'"

意思是:查询(用户名为admin并且password=admin)或者1=1的数据 #把后面的给注释掉了

因为1=1恒真,所以where子句后面恒真,所以就会输出所有用户的信息。

如果想只输出admin的信息可以使用:

payload:

用户名:admin ' or 1=1#

密码:admin

输入的payload放入sql语句中就是这样的:

sql="select * from user where username='admin' or 1=1#'and password='admin'"

意思是:查询username=admin或者1=1,#把后面注释掉了,所以不用管。

这样就只会输出admin的信息。

相关推荐
xiangpanf2 小时前
Laravel 10.x重磅升级:五大核心特性解析
android
robotx5 小时前
安卓线程相关
android
消失的旧时光-19435 小时前
Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)
android·面试·json
dalancon6 小时前
VSYNC 信号流程分析 (Android 14)
android
dalancon6 小时前
VSYNC 信号完整流程2
android
dalancon6 小时前
SurfaceFlinger 上帧后 releaseBuffer 完整流程分析
android
用户69371750013847 小时前
不卷AI速度,我卷自己的从容——北京程序员手记
android·前端·人工智能
程序员Android8 小时前
Android 刷新一帧流程trace拆解
android
墨狂之逸才8 小时前
解决 Android/Gradle 编译报错:Comparison method violates its general contract!
android
阿明的小蝴蝶9 小时前
记一次Gradle环境的编译问题与解决
android·前端·gradle