BUU28 [GXYCTF2019]BabySQli1
常规万能密码,发现登不上去
过滤掉了or,=,当尝试了n种方法以后,最关键的是发现()居然也被过滤了
哈哈,那玩个淡,
再搜wp!!
当输入admin的时候,提示密码错误,这时候就说明用户名确实是admin
抓包发现有注释掉的内容,其实这个直接看源代码也行(但是又忘了这步)
这串代码先用base32解码,再用base64解码(菜还是得多练)
二者区别:
- Base64:
- Base64 编码使用的字符集包含
A - Z
、a - z
、0 - 9
以及+
和/
这 64 个字符。当编码的数据长度不是 3 的倍数时,会用=
作为填充字符。 - 例如,对字符串 "hello" 进行 Base64 编码后得到 "aGVsbG8=",其中可以看到编码结果中包含了字符集内的字母、数字以及填充字符
=
。【两个等号也是它的标志】
- Base64 编码使用的字符集包含
- Base32:
- Base32 编码使用的字符集是
A - Z
和2 - 7
这 32 个字符。同样,当编码的数据长度不是 5 的倍数时,也会用=
作为填充字符。通常不区分大小写 - 比如,对字符串 "hello" 进行 Base32 编码后得到 "NBSWY3DP",编码结果只包含字符集内的大写字母和部分数字。
- Base32 编码使用的字符集是
表有三列:
错误查询方式:1' and select 1,2,3#
在这个拼接后的语句中,and
关键字后面紧接着 select
,这不符合 SQL 的语法规则。在 SQL 里,and
是用于连接条件表达式的逻辑运算符,而 select
是用于开始一个查询的关键字,它们不能这样直接组合在一起,所以会导致语法错误。
正确查询: 1' union select 1,2,3#
如果SQL后台的代码长这样:
SELECT * FROM users WHERE name = '$name' AND pw = '$pw';
那么注入以后就是:
SELECT * FROM users WHERE name = '1' union select 1,'admin','47bce5c74f589f4867dbd57e9ca9f808'#' AND pw = 'aaa';
UNION
用于将两个或多个 SELECT
语句的结果集合并成一个结果集。要使用union,必须要使每个 SELECT
语句的列数相同。
users
表的列数为 3 且数据类型兼容,注入的 SELECT
语句会与原 SELECT
语句的结果集合并。select 1,'admin','47bce5c74f589f4867dbd57e9ca9f808'
会返回一行数据,其中第一列值为 1
,第二列值为 'admin'
,第三列值为 '47bce5c74f589f4867dbd57e9ca9f808'
。应用程序可能会将这行数据当作合法的用户记录进行处理,攻击者可能会以 admin
用户的身份登录系统。
union做查询时,查询的数据不存在,那么联合查询就会创建一个虚拟的数据存放在数据库中
源代码中也有暗示:admin在数据表第二列,password在第三列
抄的另一种解法: